ping? On Sun, Feb 12, 2017 at 07:58:27PM +0200, Ossi Herrala wrote: > On Sun, Feb 12, 2017 at 01:34:14AM +0200, Ossi Herrala wrote: > > > After couple of private mails with guenther@ we came up with the > > following patch. > > > > Introduce new flag FORK_PID1 for fork1(9). > > > > This flag is special and only for forking init(8) which wants to be > > PID 1. > > > > With this flag in place, it's possible to remove global randompid > > variable which was used to control if allocpid() returns random PIDs > > or PID 1 for init(8). Now allocpid() can also be simplified. > > > > New patch which works with latest changes to fork1(9). > > This version also documents FORK_PID1 flag in fork1(9) man page. > > > --- > share/man/man9/fork1.9 | 3 +++ > sys/kern/init_main.c | 5 ++--- > sys/kern/kern_fork.c | 24 ++++++++++-------------- > sys/sys/proc.h | 2 +- > 4 files changed, 16 insertions(+), 18 deletions(-) > > diff --git a/share/man/man9/fork1.9 b/share/man/man9/fork1.9 > index c22c9800aa4..21175416ed4 100644 > --- a/share/man/man9/fork1.9 > +++ b/share/man/man9/fork1.9 > @@ -109,6 +109,9 @@ must also be set. > .It Dv FORK_PTRACE > The child will start with tracing enabled, as if > ptrace(PT_TRACE_ME, 0, 0, 0) had been invoked in the child. > +.It Dv FORK_PID1 > +Special flag to assign PID 1 for > +.Xr init 8 process. > .El > .Pp > If > diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c > index faa74aa4244..f1975a6aa89 100644 > --- a/sys/kern/init_main.c > +++ b/sys/kern/init_main.c > @@ -437,13 +437,12 @@ main(void *framep) > { > struct proc *initproc; > > - if (fork1(p, FORK_FORK, start_init, NULL, NULL, &initproc)) > + if (fork1(p, FORK_FORK|FORK_PID1, start_init, NULL, NULL, > + &initproc)) > panic("fork init"); > initprocess = initproc->p_p; > } > > - randompid = 1; > - > /* > * Create any kernel threads whose creation was deferred because > * initprocess had not yet been created. > diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c > index 38c1be4a981..b5f99d3c4dc 100644 > --- a/sys/kern/kern_fork.c > +++ b/sys/kern/kern_fork.c > @@ -71,7 +71,6 @@ > > int nprocesses = 1; /* process 0 */ > int nthreads = 1; /* proc 0 */ > -int randompid; /* when set to 1, pid's go random */ > struct forkstat forkstat; > > void fork_return(void *); > @@ -220,7 +219,11 @@ process_new(struct proc *p, struct process *parent, int > flags) > (caddr_t)&pr->ps_endcopy - (caddr_t)&pr->ps_startcopy); > > process_initialize(pr, p); > - pr->ps_pid = allocpid(); > + > + if (flags & FORK_PID1) > + pr->ps_pid = 1; > + else > + pr->ps_pid = allocpid(); > > /* post-copy fixups */ > pr->ps_pptr = parent; > @@ -332,7 +335,7 @@ fork1(struct proc *curp, int flags, void (*func)(void *), > void *arg, > > KASSERT((flags & ~(FORK_FORK | FORK_VFORK | FORK_PPWAIT | FORK_PTRACE > | FORK_IDLE | FORK_SHAREVM | FORK_SHAREFILES | FORK_NOZOMBIE > - | FORK_SYSTEM | FORK_SIGHAND)) == 0); > + | FORK_SYSTEM | FORK_SIGHAND | FORK_PID1)) == 0); > KASSERT((flags & FORK_SIGHAND) == 0 || (flags & FORK_SHAREVM)); > KASSERT(func != NULL); > > @@ -631,19 +634,12 @@ ispidtaken(pid_t pid) > pid_t > allocpid(void) > { > - static pid_t lastpid; > pid_t pid; > > - if (!randompid) { > - /* only used early on for system processes */ > - pid = ++lastpid; > - } else { > - /* Find an unused pid satisfying lastpid < pid <= PID_MAX */ > - do { > - pid = arc4random_uniform(PID_MAX - lastpid) + 1 + > - lastpid; > - } while (ispidtaken(pid)); > - } > + /* Find an unused pid satisfying 1 < pid <= PID_MAX */ > + do { > + pid = 2 + arc4random_uniform(PID_MAX - 1); > + } while (ispidtaken(pid)); > > return pid; > } > diff --git a/sys/sys/proc.h b/sys/sys/proc.h > index 4f015f2eeb0..b3b3ac4bb0d 100644 > --- a/sys/sys/proc.h > +++ b/sys/sys/proc.h > @@ -449,6 +449,7 @@ struct uidinfo *uid_find(uid_t); > #define FORK_SHAREVM 0x00000080 > #define FORK_SIGHAND 0x00000200 > #define FORK_PTRACE 0x00000400 > +#define FORK_PID1 0x00000800 > > #define EXIT_NORMAL 0x00000001 > #define EXIT_THREAD 0x00000002 > @@ -470,7 +471,6 @@ extern struct proc proc0; /* Process slot for > swapper. */ > extern struct process process0; /* Process slot for kernel > threads. */ > extern int nprocesses, maxprocess; /* Cur and max number of processes. */ > extern int nthreads, maxthread; /* Cur and max number of > threads. */ > -extern int randompid; /* fork() should create random > pid's */ > > LIST_HEAD(proclist, proc); > LIST_HEAD(processlist, process); > -- > 2.11.1 > > > > -- > Ossi Herrala >
-- Ossi Herrala