diff --git a/startpar-bootchart.diff b/startpar-bootchart.diff new file mode 100644 index 0000000..5c710c6 --- /dev/null +++ b/startpar-bootchart.diff @@ -0,0 +1,31 @@ +--- startpar.c 2009-03-25 16:52:25.357391610 +0100 ++++ startpar.c 2009-03-25 21:22:50.145032810 +0100 +@@ -368,6 +368,7 @@ + if (!strcmp(arg, "start")) + { + int s, t, len; ++ pid_t child; + struct sockaddr_un remote; + char str[100]; + +@@ -397,6 +398,20 @@ + kill(parent, SIGUSR2); + } + close(s); ++ /* ++ * if we use preload, we fork again to make bootcharts easier to read. ++ * The reason is that the name of the init script will otherwise be used ++ * when in reality the above code waited for preload. If we fork away ++ * before the exec, the waiting code will be folded into startpar ++ */ ++ child = fork(); ++ if (child) { ++ int status; ++ int ret = waitpid(child, &status, 0); ++ if (ret == -1) ++ perror("waitpid"); ++ exit(WEXITSTATUS(status)); ++ } + } + } + diff --git a/startpar-preload.diff b/startpar-preload.diff new file mode 100644 index 0000000..f988a88 --- /dev/null +++ b/startpar-preload.diff @@ -0,0 +1,77 @@ +--- startpar.c 2009-03-25 16:16:59.308479056 +0100 ++++ startpar.c 2009-03-25 16:52:25.357391610 +0100 +@@ -85,6 +85,19 @@ + static int pidpipe[2]; + static double iorate = 800.0; + ++void sighandler_nopreload(int x) ++{ ++ (void)x; ++ ispreload = NoPreload; ++} ++ ++ ++void sighandler_preload(int x) ++{ ++ (void)x; ++ ispreload = Preload; ++} ++ + void *xcalloc(size_t nmemb, size_t size) + { + void *r; +@@ -253,14 +266,14 @@ + return par; + + /* if we have preload running, we expect I/O not to be a problem */ +- if (ispreload == Preload) ++ if (ispreload != NoPreload) + prcs_blked = 0; + + newpar = (par*numcpu) - prcs_run + 1; /* +1 for startpar its self */ + newpar -= (int)(((double)prcs_blked)*iorate); /* I/O load reduction */ + + #if DEBUG +- fprintf(stderr, "checksystem par=%d newpar=%d (prcs_run=%u) %ld\n", par, newpar, prcs_run, time(0)); ++ fprintf(stderr, "checksystem par=%d newpar=%d (prcs_run=%lu) %ld\n", par, newpar, prcs_run, time(0)); + dump_status(); + #endif + if (newpar <= 0) +@@ -284,6 +297,7 @@ + void run(struct prg *p) + { + char *m = 0; ++ pid_t parent = getpid(); + + p->len = 0; + p->pid = (pid_t)0; +@@ -368,7 +382,8 @@ + t = connect(s, (struct sockaddr *)&remote, len); + if (t != -1) + { +- ispreload = Preload; ++ if (ispreload != Preload) ++ kill(parent, SIGUSR1); + send(s, p->name, strlen(p->name), 0); + recv(s, str, 100, 0); + } +@@ -379,7 +394,7 @@ + * In case we can't connect to it later, it means it did + * its job and we can guess I/O is no longer a problem. + */ +- ispreload = NoPreload; ++ kill(parent, SIGUSR2); + } + close(s); + } +@@ -601,6 +616,9 @@ + char *run_level = getenv("RUNLEVEL"); + char *splashopt = 0; + ++ (void)signal(SIGUSR1, sighandler_preload); ++ (void)signal(SIGUSR2, sighandler_nopreload); ++ + (void)signal(SIGCHLD, SIG_DFL); + numcpu = sysconf(_SC_NPROCESSORS_ONLN); + myname = argv[0]; + diff --git a/sysvinit.changes b/sysvinit.changes index ed9702c..87b3dd9 100644 --- a/sysvinit.changes +++ b/sysvinit.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Wed Mar 25 21:32:51 CET 2009 - coolo@suse.de + +- exec one more time so that the preload part does not appear + under the name of the init script in bootcharts + +------------------------------------------------------------------- +Wed Mar 25 18:06:13 CET 2009 - coolo@suse.de + +- fix the preload functionality in telling the parent process through + SIGUSR1 and SIGUSR2 about preload's presence + ------------------------------------------------------------------- Fri Mar 13 17:58:53 CET 2009 - werner@suse.de diff --git a/sysvinit.spec b/sysvinit.spec index ec4c022..6de11d9 100644 --- a/sysvinit.spec +++ b/sysvinit.spec @@ -30,7 +30,7 @@ Group: System/Base PreReq: coreutils AutoReqProv: on Version: 2.86 -Release: 201 +Release: 202 Summary: SysV-Style init BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: libselinux-devel libsepol-devel @@ -63,6 +63,8 @@ Patch16: sysvinit-2.86-full-time.patch Patch17: sysvinit-2.86-hddown.patch Patch18: sysvinit-2.86-selinux.patch Patch19: sysvinit-2.86-fuse-no-kill.patch +Patch20: startpar-preload.diff +Patch21: startpar-bootchart.diff %description System V style init programs by Miquel van Smoorenburg that control the @@ -110,6 +112,8 @@ pushd ../showconsole-%{SCVER} popd pushd ../startpar-%{START} %patch -P 14 +%patch -P 20 +%patch -P 21 popd %_fixowner . %_fixgroup . @@ -323,6 +327,12 @@ rm -rf ${RPM_BUILD_ROOT} %doc %{_mandir}/man8/mkill.8.gz %changelog +* Wed Mar 25 2009 coolo@suse.de +- exec one more time so that the preload part does not appear + under the name of the init script in bootcharts +* Wed Mar 25 2009 coolo@suse.de +- fix the preload functionality in telling the parent process through + SIGUSR1 and SIGUSR2 about preload's presence * Fri Mar 13 2009 werner@suse.de - mkill: avoid signaling process which are on shadow mounts points that is e.g. processes on /dev/pts while running mkill on /dev