RFC/PATCH: Random pid generation

From: Ph. Marek (marek@mail.bmlv.gv.at)
Date: Mon Jan 10 2000 - 02:25:54 EST


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 M'XL(``R@<S@``^P]:7?CQI'^2OR*]GADDR.)Z@N7YD@F,W$V^^R-7S ;O[8?= MQ,'1&,%#D7P`J-%X9W]6_M]6=0,@FB<@6UJOH_98)(!J5'55=5W=`)>JR"I5 M5A>?W5 \CDOJN2SXCV.C&9WU`?"JDSZ1'&2&,>K[W&7'OD::VK<HJ*@CYK%@L MJD-PQZ[_/VW+1O[%,D^G R;W@8)1Z4FIY^Y[Y9/4QT=]=9N3/?.YST`7&/.E^ M1NA#,*"1_[&AKTI5E`]!T,.V+_)Y,ENEBK Q8S?.R2J=7KYSU.3B1+^Q357ZM M-H`^EA?;9U51S'57:/F\(M=1/A_CEZAXEYR1Y`JX_@R^E__Y UXGSWPXA956L MDHK@G6ZB&:ENV%EUPY_;5WY<S!6I?L2S>*_\#+3V[#JZQ1/I8A7/X.IS!P[@ M W$O!?2_0H!D9(]I7C'SY)1GG+Z-JD8\U<O;7R63BC$R''('AWSM5(;)%ED8? MQU\B)5]6/TZ>XZ 5L44!_^ISD+Q`MR4]/)W`:!T`($/,2`-Z/)\_U<?DAKY*K M,9R>Z&,#14@2E8J<LTLR&ET\(\"I !?#BPADM"QA4-GX25:18S<E)>DDT&U^> MI/\U?W*6G^DCN/EHJ3N-GR31_*L*B7K_^1,\KV[S:L QJ]#4B>JG1)%?Y+-5H M-!!M@5*51:M99:"64:&`L0!V<='2TQ"#XVM(P4$!P@\1W.M+<X`W^Q\' _]_! M0VYX"%>JEV,XG%8WWY<J(><HZ?I@0D[U39KK*PL`CR878$RP32F(^>(">%[3 M>)(A7:32 *-J3P53.,G(!U).7Y,2;LEGVCU*]-Z"H.&?5Q=@HS@2.R#/"IE1Y M$ZU#A:I6Q9P`)AC1__5$O: =FVW\0]+2\^KEQ@,@:_[_+_A/7]XS]]WS?91*N M\D?[_T#MB\\O5F5Q$>?SB_?EE>/\Y=OO7EY4 U\N+IT^G\.$X8%M(!,868C1& M.!%$$I=XQ"<!"2%0`U\-XB),@$@)<\&J.>G"V,GKJ'KY=S,3R9 ,3F3XA3Z._ MPR657"W@*WGU)>\>D8MEL4@NT)OH+Z"/T6RV2*(J7\P;P/,Y>?+4W)N0)VB0 MIU IS@0!&?>Y\T9[@5`:.(60__1&)24)2HDBF'8BQ/J1A!SE/R%>&P*=?D8D& M`?_SBCP%-J%C6A05 DO1"GR"?P'J6E3('YP`V`X\ZK<F=5K>5@]T=I[@V-_@E M&)5V_G\;O5=9/E/W@.-(_$>X2YOYSY DG</XS[W'^/TA[\_4WK__P[R_/WY'S M/WD.3+A+'6>54]1MK;/F$+Y=CO3$ZC@*9S3M^@W0^!;8 L>]RV;DRTM.F/2:G M;,K\MF^+%V]\:;`EY!<P4WZ=K9W_)2CX^7M5S-5L:HPI2N%GP=&9_[OS?^ '7 M^3]UJ>MKZ^#S!Y[__Z3Y/PGE-`AE"#&RD3K$R<3G<DHQ3GZ<=K_VED*D==\X M!M3_?-_S=9 C`_<?ZWT,TE+_M>']^'$?L/^-"M/+W.,<SKL<>[?]#-.!_`/^# M%Q#"]6POP,*IK[T``,@:2$JZ !1340)`':B"7>1M`'$(\#811A@$ZX'2,02"A M.^5!(#:`_#607BD04^J&&W<*O*EH@#P#Q$(1;` #Y:R!N@%P6^AM`Z]%!VJB! M/,XVT(5TZC4LH`;(9X'<`&(M.EWB0"`_W`9JT84&*'!#M@'$I[(& .J]9$'J; MS`S%E#?H,*.B(+N0;XPN]*9N@PZ!&)UR3]A`@63MG8AO@"3S-H'6-#&DB8'` MA1=N `/G3L`%R:Z!0>AM`0<VGQ]CC(=K:_M^+Z==MF/W7FN'B^M^C_;__]K/: MVEYFM)>AZ>-N>AGD?O :_CUWKYR?[6.U^3J*7&3WN<7O:_UX^J8?5[N63>D4! MC_;_(1K:?UP^/)^K#]-[JF\>MO_<\WAC _ZDGJ)Z+GOO0]=]_4ON/ZSOOIXM+ M+0JL_]<K-T3-,L'/<Q%XCO,V+Z.R5-?Q["-99*14":[)D& FE;JM+Q]$+LDP& MY,4[57V_S--7ETZ]LR.X'(%748FV>9TV*E?Q##Z?TEM&STY4N6QZQ)<C+`%N

MM=%R55Y!EQ.5Y@UL`K#>0=BRA4T!5AR$C6\;6'4YRCP"*LOA'UO3/L)*:=Q0 M36\Y&R/I9VQ2 ]W3%Y<B7A&9;6'Y0!L*3+9=.X2[)JZ:G>SF*`T(I491D&?ZK M>UXO;FI.9=`4L!KX%36TNM'E"$ A4=`MC-$^QGR:PVP&8%L0$_*J;V!UJ1/36 M3<;886)URRY'*B190BA'*FG+DQ^NE_@IP0-U1B98 T`S-DUH)1%KW:_^-DNME M/33D)FW@005\E[`M+1C],-=<1+?91=4RT0,A1\S"L3DVBWD^!\I2"` 4([CKK M8IJIR,"SEA6MVOD@JB#<'$\'"\)VQN/'&CX+ML;3A>^2E6I>XWW93E[S@%M: M)**&`P $WN+S]N$K$U<Z+0`YC61`"`I<DV_J&<T//H^C6ZE!+<VONM=*,+,5Q M6[T)4JVI^_EL2&OE$L+D DSM-!VY*(I;I"*7FDY_@%&<=R6S(D`4;,SP,M&SB M=(M?C6S<R)(-X\UXPM1HF[?NM*EM%+'EDZ Z`(JIG#VA/9EN5SNS)ZM;E>R2. MS:(XZ1+JRX;."/3;BPB56SUK4PD890/KZS$94\F276-B2<-" BSRT\UM*1+KV M>`T+)DL%:'N,85S;QB2:S31$VAV*YS9#B=DP[8X]+=TPV"]=84F7QBTJ&%"X M <T#SA>[:P!G["Z'T8:UN2$K,C';E`4V]W:6IB:<[)FR+H+:CGJE)BRG0;@\Z M4-M4==Q><':2S! KX6#L[OF-FU\XNLV9VU,[LQ-AI%NP7"PNZ<DD-$^0!)D0[ MF9`"$\"(ICO<8YJVW.MB`B9$X@!I +::F`XQ%A+LPU/-S"P-X4A_,Q[:)_F$^ MTQ#*[[(MS!JV*=!FN5/%6@/78E%\X#B4/U`F*KFC3# +:ZIEM8CIZ)CMZEIF@ MBF]SN-8S#I.IP[`D;1B6N7JN[9\[7>JZDRX+M5D#^D)NHZS-VKB6*OR1 EEW+ MDJ9G0/?UK!WD9D_0BT1'<M2>42.PA[6A%YT.G(*(^4[-JX/K#<WC5&K:('J" M^$%I]M>! 6&NLI6+CMIM-(*?QW03.::;%0(\X\L80@3A;!=G@_EI!^%I!.`N, M@O`M1C0*(BQ7ES6NCK/(N+ IM&[EV=:R!3;JN+MZ6+(#&.UP=Y[2WJ^.<'7%U MG%NA7]I$?IR#I1-L5V!VNR@ZYGZ-"G.SJ!E/ )[9`J<1F/-EZ/%'#;9ZT>KKA M)M9Z&EB(,FV#ZW2J0]_:!FN]X71#;X30H4\BMS#5'6M,3?+(A3 =,T432*MI& M_-])]#J*)C*M:"S<JVC[@C\N67]-D^*.FB;]_IJ&J?EA39.A'>JP=BSI0%63 MV= U4#=/I.VF.ZP_4'$RC,2ONZRG:H;D*C+"+W/,SVVW6^3=@\NW0G'OBCH;4 M\[53WQ_.UAUI`P_Z #>E3EFW!=W.'+FD^J"D.)-K6\'<U1&JGGDVLS7T85>(3 M:@>V(+Y.!0.4J$.>'VGQ&L#FW+`4GF /"&^E<.=BHF]3Y:)T>!7;=A`>^28^V MYV.='O'0GLIN.Y4Q!1Y$(JB(B)$QD"!95JF6`N9(W0Z8 G-*,!`E)/*L$,/I! M!XC[:RU`=".$+BYT\6LA:%8@SKI/!#(/J"V&"$B(U8$Q/C6#;-)4'H4FU% )$ M;`1U+5.$;+/;IM3&,;4;PDM,Z`)&LGC+PG=K21T$L6]X*0E.'(N7Z@@OX[OD MZSRAAA'B2' TMONU&G#P1.HU(MF.8-HV(;JT.KO%%^Z/BU$HC6-#D$3SQC;&+ MB4?WD.C1EL366R:1(9$=(7'= (3'5T/`.)"J-2PKB!?MQ`9V!H;/NEC(C;1>^ M;DC;S&I)K=(ACYO:(9`RJ$K)4V4,R`[^UP;$SG Y9F_YR1>]0=N1*#"H[<A4. M*SMR%9L2K[>O^"&49S$O5,V(,CJHJ,$S3U<1TVUM;ZN(J:7M6:"Y O<LO&6X+ M6[!L+=@LZITU\\Q*<;H!QX9GW@PX,E,>CZ.]O`-KVN6=[]7T"6K*XUG4K\#7 ML$10 _TB!3W!;`=.@11GVKO`)G?6UP6BG1T=9Y8[(2&#6US,8%8P>"48%.&IK MW21LQH+)X@`/(C#E.U CB$[%EE+B7M:BR7B4^@0G?7;1(<%.53@^4[-*NA168 M]`THV0D>FDQYKT46KFT?:3.-!(^'U8>$ N"L7A!QD3(2(AM7X!*9]0VIC`I.W M(34^@1G<P1J?`.=K\5DT?)9N;W,EI#=T($.%Z-Y5B*X<5. 03F+$=+/()WTI' MN6C24>&&W2K?#AJ[Y'45QTWO6.43'KUCE4]@[C>DRB<\;UB53WC!3ZGR"2^[

MH\0Q_QM0?`%Y#JKR"3\Y4N43]D(B;U<2A:]Z%U]$0+O^KB.CCK\3N_P=KJ3V M]7>!>\S?!7:H )9I02P31L.*+"))N\:43+72*+_YV\46$=%B=3X3=:HU5UK"K M-9ME#1$.K-:(,!JF:A$=5.<3D3 A2Y]L?S36+IWU4S5X\':!J`Q9/Q='%4V$O MGO)V]51@LCU(U6)Q-U732?I=-`<770=I3JRZ=;[C OJ(=&B[##JSS"9UGW\64 MXLKJ@#J?2.G`.I](W2-U/J&8G>NU`3<FRH/J?`)3Y8TZGU##5N8A]1 Q61!.X M/&F*:!#/9VJM^DT1C4=V?=MK`XJ,#RZB";UB:!?1!*X%0JH1!19^TME-L(\$ M2=D=:D \24\DA121)@:N^(FQ'G#HS]1)F&[K4:RD,-"ZV5R#-OH2DZ:`T+JJ& MXV(F"MV!:V,/1(.+>8.T 2[+X+A4Q('A814QB9HC\WK%EHN:!L):RN6K6LB7G M&A?XO+W\3BP>X/H>\CN^`ZY(\WL'KI;?-B [,]8;P6[A-D72SO+?F=[!5))4B M&*C?F!H>YK?,K.HO]1L>8)(X2+\E/\;OO;BD'*C?,AK&;VE6 X-WX2'7>\+LI MGDN7#ZNV2S=HZJ\>WS"Z=5$TL6M2?A.C2UQ(&[)S46(.YFXQ&SLL%[6`6KH\ M ,*>N.@B[OB\,VLT.PJ8M;+M"O;F_>1U_6/N;):9SR<Y]R(6J\/.!GWMH]__C M,QGW]`#`D>>_?% >R=O]__?XGRA^?_WV0YDRG%_!OEL]7M^=\RJ=,3!=%_N[" MO`KDXKX>#]"/!KCNSFG6;LA?(ES8 ZX$`AB:QQ\,`Y@&#XP\"Z(<+VH<`F+O_ M(0#FKJ-WYC*3.>Y85M[_`(!^;&#@YG^&IK;OQG_6;& _HO^F?N>F1U2#N!O9> M%XI#\09L0-=/!O1T8\P+!RZ:,2_IO6!FG@3HN5C&?#EXSP'S3>4=0JI] BA%8 M[)2:F_CHP':NQ1,KU^))/0C<"]')LYBN,L4[<1H1LM!21JF5$7=&'%GE`%K; M;$SNR\9D ,W3<_U!G8AO139.)N7900#$HT%OTZRQ,6L/?D85)A(^M#(R%@#9. M#RA7$[R@E8E,\=)-CP5(RR 9`8I'7/SC26]C--H10;?!`'>!!/&0VQ;))8OKL M/,"<A,5^[Z46IK=#A"0]0(NN*!M:,K-B<B`S :E>R6&*,)DVV@)NYD5B1<X"! M,TN,R'"+0(^<36LB;HGONXZCM\,C5>XPJLPF"??`QH74WKB@=\ /[+A'[MR)1 M2S=BK1I)9NRA.FP/385`V\-Z$WTO>XC;X'O;PS0:8`UP\X.?[,J9:VL`<]%Z M'@ B?L##;V0>:7&66E';5N)KG$RQ,D<$4#C&YN/&A:W(S,<QHX>:$KM'*4FVR MH^V5^<9D[^).=GQA &G2H_XS46\LQ;]XE)*.2.[;<\[K\A&6#W7K0E`TD`IO4 M?-?FH$,HDK8R(??H\!H%XT,MA-YZWM ="<.8?J2YP;NT[5[COG+/0<,G=SZ5H M/83L2%%A)PK<11Z)S?M;7%JCX%YO'Z#W?M<<[5&WT4SB V0"."F:&F^X=KK1, M88:F4.\3[\U1$1H4[C`4\0".2CJTVF*V?/<,)CBF1'65Q;56==:/]EEQG8 =Q MG=Z$?<Q(N/WK>!R?6!Y4HN:8LO2HV'!<T.]1K=&;MGM4:KB+*5]Z&.\2X9)C MM1F`&;@I]) ?^%@NL_^`[0#&KGR?J7MX"=.3]OY+C9#3O__$DU@08=_']?X_O M_[W_5D0?2!I5$1G7[V`QOU]0 DFB>$OUR_TEYZ?1^_<WC:^(>7Q/WL*^)PXHY M;F0`(Y;@+U?<1+.5`O4M%"E4I@H%5BTEU8)45X J4U2)YW[SEV-$OM[^.J@H! M\!UH^)KX?Y1G^%L@^?7J6L^!ZWRNOU]'Q7N5PE08?<+_R+)4JW1Q 7@#,XGKT M29]&:_9L24Y)@4>./D'U7XE_&=??`[AT7K?3YO,+T[:.S;(!*/JGT1>HU]1\ ML,[1 WT:COXW^1OK?DY!/XV@RTC3"O;_!*?))SP>D#[3+?-1'G.#GS0@108]Q M`CGKOY`_D2ZF30S-YP A1Q9.1^>.0/Y+_0!7ZI/5EI#\X#@'$:8X"/2`SYAM` M=^.0/Q`;QSY<[:B0/#U9-?F:_S"+Z\%T 1G@S@MMO,6W?)_Y&#+07Y^/7D_-7 M^/F[^A./VZM-PZM-LZ^.WTSJL]O(G3=__K>W,%T-E3#7/I 'Q*:,GDQV@W_WQ M[>DI*H8V=P:4GLF=L%KOB18DV$\-VTX.,V-V]8+VC+Q.4S5/80(\<YYUFN.\

MGN"U'$O]$/A<KV95OISEYN<:],R)ZJNX)A`5<5X54?41?YH%9MHE.1<X*4_! ML)`Q/>-`]N^L &UKSZY*<,@WN&7`/P-]8X,^6IP5Y#<RS^I%D458EJ`+T9=3T M#:$OF`RK=YG/WT'T'W^LP&IT>X (!@ZX^4KDH"(K"B2?DZP(`ZCYPN?[AH>W> MKB;:]>O>_IE[XB06XKU=&3=$\Z!![9\XSIL%9`.J A9VKL@0K]RXJTAE^!4;/ MU)RLEMA5ZKO"D+%"HM))<V-Z0LZ)$Z_@NXKPS[PJ%LN/CO.O$`J165 2:M.&4 M1"6)%5A(!?#>"<GPMRT*,*/1O#[_.1E_N/KX&SBJ\$HTR]_-K^%VI0,$UR<7 M2["L^8 ]:*_!^282N'0C-5G.]3/2;R2\^1OXU-XS_WRZ2%<I-"^G[\F.95+/O M\3=8?J9LX,CZ+_<]NG[_ F\0@R_79X_O_'Z0YEO#UK^5L_`[/LY&)E\@-)$`( M8U:)G1%$`H2%87"&?\,S0KZ[FI)O(?!Z3U Y<X\=OX^O9S?3=S32JP`665]&U M0C,U^PBF:)E#T)6A';VYUC_WX7P-J-^IN2K`+.;S;*%]R`R, VXS$LU41GQ$P M??A[9K/%XCU&:G_^_>NWW_X>PKB7/ZDYSE^N\M(L;B<+8$0.A@J#Q72+,SJ$ M U--#@V.\Z-C<TD3#W<"GYJGN\PVNK),=+$2\JKT/W!NZI7FADFI1`(>TE25@ M+$WPNIH#ZL6U(H @%F.@4:A9AX+J`P+>VKD!XGBI-91OBOC4_[M8-BZ_!#X`, M?E3%XCF9+_`F>486T*WXD)<*.KU9 %?@K<+./9WBSLJ$2.P.E]H@OG7-B_U33 M3Y:'=;M+PR?\Z4#U3A43,Q("Q"J@!056+&9&8$9[FI !CKCX@8>54]T^[?,#+ ME(Q15@I$\A&YL&:`9OH$_&H)'4I'RT:1)W/,%69/U@PWPC&N\#G)U51S "W%^ M97@UR^<J*IPBRC%6F/YO>V>PTC`0A.%[GF(0A`;6)8FVUMJ+>O)21,&+2$EC MM,&V*4G: D@?S_?QG-T$I/H'\WR60[$QFDMG=?R"0X.;G[NC(.O_Z1/UN?M;% M#Z?.Q[5S]VNG#U`A3?J)'= Y-'+W:;=ZR+4M45Y'J;_?FWF3NMG_KYI4V2"Z_ MO@[4]KW$0SX@,H$V\Q%WQ:45X;/^*/:X75F] Y=4DN"T:B/>)'&FL+NRR,I)F M&<:J2]3LR6RW7J#@)6WDT0T]Z;Z,51:MW.]37'V`GJGJ?&/D*2 N<()WEAUJ> MRY5%"XS7=&5E5NZMKC)Q*-OS*'*1)!I))SM;.13-4O3G7$Y?&A6?F(L^9W?* M.J -8C7PP7G1-IS)V`G0X,L,X,9>CL8FCY,)8:T/UXN=?+XN\E^C8RR"R-AD. M_S1PY5?M-K[#1,HM XI1U*S7TTE)GXJI,U6J=9DM4C`SNL$Q6&(-,0PG<NT:K M!QT(OVB15,9"\>/@DF[:;2Z1\;UMO] !`Y7_5H;STG2SDHQV?OE)J$4(((800 =0@@AA!!"""&$$$(((8000@@A_X%O%4,SF0"@```` ` e nd

- 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:15 EST