RFC/PATCH: Random pid generation (2nd try) - sorry

From: Ph. Marek (marek@mail.bmlv.gv.at)
Date: Tue Jan 11 2000 - 01:47:44 EST


Sorry - message got broken my mailer ...
-

Hi Linus, hi Alan, hi everybody else not explicitly mentioned,

here's a patch for testing (comments please cc: to me) and
inclusion for the 2.3 series (if believed to be ok).

Short summary:
More and more programs (eg CGI-Scripts) use the PID as pseudo-random number.
As this isn't really random and easily guessed from the outside (esp. with
daemons loaded while booting) it's a little bit troublesome.
My patch allows some kind of modification to the current routing which just
increments the last pid until a free pid is found.

Possible are
- last_pid+1 (as before);
- complete random (entropy pool);
- low and/or high byte randomness added;
- multiply last_pid with prime, add another prime;
- pseudo-random.

It makes this changes:
- defines PID_MIN (before hardcoded)
- makes new entry /proc/sys/proc/pidallocation (global variable
  pid_alloc_strategy)
- defines inlined function get_pid_using_strategy called from get_pid,
  which handles the actual calculations
- changes get_pid to use that function.

Attached is some documentation regarding performance before and after -
can somebody please explain why the stock kernel is *slower* than the
modified with a multiplication inside??
As rule-of-thumb: performance is slightly better (-0,6%) to 17% slower
with complete randomness (losing entropy) at about +10%.

As my machine only has 32MB memory I couldn't test this with a high number of processes - it kills some when reaching 1090 or so ...
Please test (with many processes active), and, if ok, include it into 2.3.

PS: Please note the "COX worth 10K" in line 106 of the uuencode ... ;-)

diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/Documentation/sysctl/proc.txt linux-2.2.13/Documentation/sysctl/proc.txt
--- linux-2.2.13.orig/Documentation/sysctl/proc.txt Thu Jan 1 01:00:00 1970
+++ linux-2.2.13/Documentation/sysctl/proc.txt Wed Jan 5 19:18:12 2000
@@ -0,0 +1,40 @@
+
+Documentation for /proc/sys/proc/* kernel version 2.2.13
+ (c) 1998, 1999, Ph. Marek <marek@bmlv.gv.at>
+ shamelessly copied from vm.txt
+
+For general info and legal blurb, please look in README.
+
+==============================================================
+
+This file contains the documentation for the sysctl files in
+/proc/sys/proc and is valid for Linux kernel version 2.2.
+
+The files in this directory can be used to tune some process
+related operations inside the kernel.
+
+Default values are mostly zero; noted if otherwise.
+
+Currently, these files are in /proc/sys/proc:
+- pidallocation
+
+==============================================================
+
+pidallocation:
+
+The (integer) value herein controls the generation of new pids.
+The default value of 0 (and every not otherwise used) results
+in the "normal" operation used before; ie., the pid's are linear
+raising.
+A value of -1 results in random-generated pid's; the randomness
+is taken from the entropy pool via get_random_bytes.
+For all other values the following bits are processed in the given order:
+Bit 3 : pseudo-random generator, according to "Numbers at Random"
+ by Ivars Petersen, Science News Vol. 140 (9. Nov. 1991) p300
+Bit 2 : multiply with one prime, add another prime.
+Bit 1 : Random byte << 8 (0,256,512,768,1024,...) added to last_pid.
+Bit 0 : Random byte (0..255) added to last_pid.
+
+The runtimes vary on my slightly loaded machine (Celeron 300)
+from 720µs to 848µs (727µs with type 0, stock kernel 724µs) [maximum +17.8%]
+
diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/include/linux/sched.h linux-2.2.13/include/linux/sched.h
--- linux-2.2.13.orig/include/linux/sched.h Sun Dec 5 19:00:24 1999
+++ linux-2.2.13/include/linux/sched.h Sat Jan 1 23:13:23 2000
@@ -63,7 +63,7 @@
 #define CT_TO_USECS(x) (((x) % HZ) * 1000000/HZ)
 
 extern int nr_running, nr_tasks;
-extern int last_pid;
+extern int last_pid,pid_alloc_strategy;
 
 #include <linux/fs.h>
 #include <linux/time.h>
diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/include/linux/sysctl.h linux-2.2.13/include/linux/sysctl.h
--- linux-2.2.13.orig/include/linux/sysctl.h Wed Oct 20 02:14:02 1999
+++ linux-2.2.13/include/linux/sysctl.h Sat Jan 1 21:37:18 2000
@@ -107,6 +107,12 @@
         KERN_SHMALL=41 /* int: maximum size of shared memory */
 };
 
+/* PROC names: */
+enum
+{
+ PR_PIDALLOC=1 /* Pid Allocation Strategy - linear, random ... */
+};
+
 
 /* CTL_VM names: */
 enum
diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/include/linux/tasks.h linux-2.2.13/include/linux/tasks.h
--- linux-2.2.13.orig/include/linux/tasks.h Mon Nov 8 19:28:36 1999
+++ linux-2.2.13/include/linux/tasks.h Sat Jan 1 23:10:28 2000
@@ -18,8 +18,11 @@
 
 
 /*
- * This controls the maximum pid allocated to a process
+ * This controls the maximum & minimum pid allocated to a process
+ * minimum MUST be 2^n - see kernel/fork.c:get_pid
  */
 #define PID_MAX 0x8000
+#define PID_MIN 0x100
+
 
 #endif
Binary files linux-2.2.13.orig/kernel/.fork.c.swo and linux-2.2.13/kernel/.fork.c.swo differ
diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/kernel/fork.c linux-2.2.13/kernel/fork.c
--- linux-2.2.13.orig/kernel/fork.c Wed Oct 20 02:14:02 1999
+++ linux-2.2.13/kernel/fork.c Wed Jan 5 18:16:00 2000
@@ -17,6 +17,7 @@
 #include <linux/smp_lock.h>
 #include <linux/module.h>
 #include <linux/vmalloc.h>
+#include <linux/random.h>
 
 #include <asm/pgtable.h>
 #include <asm/mmu_context.h>
@@ -28,6 +29,7 @@
 
 unsigned long int total_forks=0; /* Handle normal Linux uptimes. */
 int last_pid=0;
+int pid_alloc_strategy=0;
 
 /* SLAB cache for mm_struct's. */
 kmem_cache_t *mm_cachep;
@@ -185,6 +187,74 @@
 /* Protects next_safe and last_pid. */
 spinlock_t lastpid_lock = SPIN_LOCK_UNLOCKED;
 
+
+/* Inserted 010100 :-) marek@bmlv.gv.at */
+inline int get_pid_using_strategy(int *last_pid)
+{
+ int tmp;
+ unsigned char rnd;
+ static int counter=2;
+
+ if (total_forks==0)
+ return ++(*last_pid); /* init = 1 */
+
+ if (pid_alloc_strategy==0)
+ {
+ tmp = *last_pid + 1;
+ }
+ else
+ {
+ if (pid_alloc_strategy == -1)
+ {
+ get_random_bytes(&tmp,sizeof(tmp));
+ tmp+=*last_pid;
+ }
+ else
+ {
+ tmp=*last_pid;
+
+ if (pid_alloc_strategy & 8)
+ {
+ tmp=counter;
+ counter+= *last_pid;
+ if (counter < *last_pid) counter++; /* Overflow */
+ tmp=counter;
+ /* *last_pid = tmp below */
+ }
+
+ if (pid_alloc_strategy & 4)
+ tmp = tmp * 797 + 1249; /* both prime */
+
+ if (pid_alloc_strategy & 2)
+ {
+ get_random_bytes(&rnd,sizeof(rnd));
+ tmp += rnd << 8;
+ }
+
+ if (pid_alloc_strategy & 1)
+ {
+ get_random_bytes(&rnd,sizeof(rnd));
+ tmp += rnd;
+ }
+ } /* strategy != -1 */
+ } /* strategy != 0 */
+
+#if (PID_MAX & (PID_MAX-1) ) == 0
+ /* PID_MAX = 2 ^ x - normal case !!!!! */
+ tmp &= PID_MAX - 1;
+#else
+ /* PID_MAX != 2 ^ x - can be time consuming!!! */
+ tmp = ((unsigned)tmp) % PID_MAX;
+#endif
+
+ *last_pid = tmp;
+
+ if (*last_pid < PID_MIN) /* Skip daemons etc. */
+ *last_pid=PID_MIN+1;
+ return *last_pid;
+}
+
+
 static int get_pid(unsigned long flags)
 {
         static int next_safe = PID_MAX;
@@ -194,8 +264,8 @@
                 return current->pid;
 
         spin_lock(&lastpid_lock);
- if((++last_pid) & 0xffff8000) {
- last_pid = 300; /* Skip daemons etc. */
+ if(get_pid_using_strategy(&last_pid) & (~(PID_MAX-1))) {
+ /* Better check - but not needed here. won't happen? */
                 goto inside;
         }
         if(last_pid >= next_safe) {
@@ -207,9 +277,7 @@
                         if(p->pid == last_pid ||
                            p->pgrp == last_pid ||
                            p->session == last_pid) {
- if(++last_pid >= next_safe) {
- if(last_pid & 0xffff8000)
- last_pid = 300;
+ if(get_pid_using_strategy(&last_pid) >= next_safe) {
                                         next_safe = PID_MAX;
                                 }
                                 goto repeat;
diff -urN -x *.a -x *.o -x vmlinu* -x compile.h linux-2.2.13.orig/kernel/sysctl.c linux-2.2.13/kernel/sysctl.c
--- linux-2.2.13.orig/kernel/sysctl.c Sat Jan 1 21:35:14 2000
+++ linux-2.2.13/kernel/sysctl.c Sat Jan 1 21:58:32 2000
@@ -251,6 +251,8 @@
 };
 
 static ctl_table proc_table[] = {
+ {PR_PIDALLOC, "pidallocation",
+ &pid_alloc_strategy, sizeof(pid_alloc_strategy), 0644, NULL, &proc_dointvec},
         {0}
 };
 

documentation.tar.gz listing:

doc/
doc/times.sort.txt
doc/times.txt
doc/fork-new.s
doc/fork-suse.s
doc/proc.txt
doc/performance.txt
perftest/
perftest/rpid.c
perftest/rpid.run.sh
perftest/Makefile
perftest/suse-kernel.131072.txt

begin 644 documentation.tar.gz
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
=0@@AA!!"""&$$$(((8000@@A_X%O%4,SF0"@````
`
end

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sat Jan 15 2000 - 21:00:17 EST