Messages in this thread Patch in this message | | | Date | Mon, 27 May 2002 13:09:02 +0530 | From | Manik Raina <> | Subject | Re: [patch] Add i8253 spinlocks where needed. |
| |
Hi Vojtech,
i8253_lock seems to be defined only if __i386__ is defined but is accessed in drivers/char/vt.c where we could attempt to lock i8253_lock even though __i386__ is not defined.
The preprocessor check there seems to be
#if defined(__i386__) || defined(__alpha__) || defined(__powerpc__) \ || (defined(__mips__) && defined(CONFIG_ISA)) \ || (defined(__arm__) && defined(CONFIG_HOST_FOOTBRIDGE)) \ || defined(__x86_64__)
Won't this cause a build break on alpha ? Am i missing something ? thanks for your time, regards Manik Vojtech Pavlik wrote: > > Hi! > > ChangeSet@1.584, 2002-05-26 14:17:40+02:00, vojtech@twilight.ucw.cz > This changeset hopefully fixes all the instances (at least on i386 > arch and arch-nonspecific drivers) where there the i8253 chip is > accessed - to use a spinlock to serialize the multi-byte accesses. > This should allow us to understand the timer problems that are > happening now and then better. > > ChangeSet@1.583, 2002-05-26 10:30:46+02:00, vojtech@twilight.ucw.cz > This cset fixes timestamp generation in ftape-calibr.c, which was > missing a lock for accessing the i8253 timer. This module running > together with i386/kernel/time.c could result in the timer registers > losing sync with software and reporting swapped values. There was > an workaround for this in ftape-calibr.c, but could never completely > fix the problem. Also, there still remains a race (now commented > in ftape-calibr.c), with jiffies and the i8253 timer register. This > cannot be fixed easily. Last, but not least, this converts ftape > timestamps on x86_64 to use TSC timer solely, because it's always > present there and doesn't have all the problems with the i8253 timer. > > Now there shouldn't be any code accessing the i8253 timer without > a spinlock held. Finally! > > arch/i386/kernel/apm.c | 15 +--- > arch/i386/kernel/i8259.c | 4 + > arch/i386/kernel/time.c | 4 + > drivers/char/ftape/lowlevel/ftape-calibr.c | 97 +++++++++++++---------------- > drivers/char/vt.c | 3 > drivers/ide/hd.c | 10 +- > drivers/input/gameport/gameport.c | 28 +++++++- > 7 files changed, 91 insertions(+), 70 deletions(-) > > diff -Nru a/arch/i386/kernel/apm.c b/arch/i386/kernel/apm.c > --- a/arch/i386/kernel/apm.c Sun May 26 14:18:40 2002 > +++ b/arch/i386/kernel/apm.c Sun May 26 14:18:40 2002 > @@ -1170,17 +1170,14 @@ > { > #ifdef INIT_TIMER_AFTER_SUSPEND > unsigned long flags; > + extern spinlock_t i8253_lock; > > - save_flags(flags); > - cli(); > + spin_lock_irqsave(&i8253_lock, flags); > /* set the clock to 100 Hz */ > - outb_p(0x34,0x43); /* binary, mode 2, LSB/MSB, ch 0 */ > - udelay(10); > - outb_p(LATCH & 0xff , 0x40); /* LSB */ > - udelay(10); > - outb(LATCH >> 8 , 0x40); /* MSB */ > - udelay(10); > - restore_flags(flags); > + outb_p(0x34, 0x43); /* binary, mode 2, LSB/MSB, ch 0 */ > + outb_p(LATCH & 0xff, 0x40); /* LSB */ > + outb_p(LATCH >> 8, 0x40); /* MSB */ > + spin_unlock_irqrestore(&i8253_lock, flags); > #endif > } > > diff -Nru a/arch/i386/kernel/i8259.c b/arch/i386/kernel/i8259.c > --- a/arch/i386/kernel/i8259.c Sun May 26 14:18:40 2002 > +++ b/arch/i386/kernel/i8259.c Sun May 26 14:18:40 2002 > @@ -360,6 +360,8 @@ > void __init init_IRQ(void) > { > int i; > + extern spinlock_t i8253_lock; > + unsigned long flags; > > #ifndef CONFIG_X86_VISWS_APIC > init_ISA_irqs(); > @@ -415,9 +417,11 @@ > * Set the clock to HZ Hz, we already have a valid > * vector now: > */ > + spin_lock_irqsave(&i8253_lock, flags); > outb_p(0x34,0x43); /* binary, mode 2, LSB/MSB, ch 0 */ > outb_p(LATCH & 0xff , 0x40); /* LSB */ > outb(LATCH >> 8 , 0x40); /* MSB */ > + spin_unlock_irqrestore(&i8253_lock, flags); > > #ifndef CONFIG_VISWS > setup_irq(2, &irq2); > diff -Nru a/arch/i386/kernel/time.c b/arch/i386/kernel/time.c > --- a/arch/i386/kernel/time.c Sun May 26 14:18:40 2002 > +++ b/arch/i386/kernel/time.c Sun May 26 14:18:40 2002 > @@ -574,6 +574,8 @@ > > static unsigned long __init calibrate_tsc(void) > { > + unsigned long flags; > + > /* Set the Gate high, disable speaker */ > outb((inb(0x61) & ~0x02) | 0x01, 0x61); > > @@ -584,9 +586,11 @@ > * (interrupt on terminal count mode), binary count, > * load 5 * LATCH count, (LSB and MSB) to begin countdown. > */ > + spin_lock_irqsave(&i8253_lock, flags); > outb(0xb0, 0x43); /* binary, mode 0, LSB/MSB, Ch 2 */ > outb(CALIBRATE_LATCH & 0xff, 0x42); /* LSB of count */ > outb(CALIBRATE_LATCH >> 8, 0x42); /* MSB of count */ > + spin_unlock_irqrestore(&i8253_lock, flags); > > { > unsigned long startlow, starthigh; > diff -Nru a/drivers/char/ftape/lowlevel/ftape-calibr.c b/drivers/char/ftape/lowlevel/ftape-calibr.c > --- a/drivers/char/ftape/lowlevel/ftape-calibr.c Sun May 26 14:18:40 2002 > +++ b/drivers/char/ftape/lowlevel/ftape-calibr.c Sun May 26 14:18:40 2002 > @@ -31,7 +31,10 @@ > #include <asm/io.h> > #if defined(__alpha__) > # include <asm/hwrpb.h> > -#elif defined(__i386__) || defined(__x86_64__) > +#elif defined(__x86_64__) > +# include <asm/msr.h> > +# include <asm/timex.h> > +#elif defined(__i386__) > # include <linux/timex.h> > #endif > #include <linux/ftape.h> > @@ -45,10 +48,14 @@ > # error Ftape is not implemented for this architecture! > #endif > > -#if defined(__alpha__) > +#if defined(__alpha__) || defined(__x86_64__) > static unsigned long ps_per_cycle = 0; > #endif > > +#if defined(__i386__) > +extern spinlock_t i8253_lock; > +#endif > + > /* > * Note: On Intel PCs, the clock ticks at 100 Hz (HZ==100) which is > * too slow for certain timeouts (and that clock doesn't even tick > @@ -67,48 +74,58 @@ > { > #if defined(__alpha__) > unsigned long r; > - > asm volatile ("rpcc %0" : "=r" (r)); > return r; > -#elif defined(__i386__) || defined(__x86_64__) > +#elif defined(__x86_64__) > + unsigned long r; > + rdtscl(r); > + return r; > +#elif defined(__i386__) > + > +/* > + * Note that there is some time between counter underflowing and jiffies > + * increasing, so the code below won't always give correct output. > + * -Vojtech > + */ > + > unsigned long flags; > __u16 lo; > __u16 hi; > > - save_flags(flags); > - cli(); > + spin_lock_irqsave(&i8253_lock, flags); > outb_p(0x00, 0x43); /* latch the count ASAP */ > lo = inb_p(0x40); /* read the latched count */ > lo |= inb(0x40) << 8; > hi = jiffies; > - restore_flags(flags); > + spin_unlock_irqrestore(&i8253_lock, flags); > + > return ((hi + 1) * (unsigned int) LATCH) - lo; /* downcounter ! */ > #endif > } > > static unsigned int short_ftape_timestamp(void) > { > -#if defined(__alpha__) > +#if defined(__alpha__) || defined(__x86_64__) > return ftape_timestamp(); > -#elif defined(__i386__) || defined(__x86_64__) > +#elif defined(__i386__) > unsigned int count; > unsigned long flags; > - > - save_flags(flags); > - cli(); > + > + spin_lock_irqsave(&i8253_lock, flags); > outb_p(0x00, 0x43); /* latch the count ASAP */ > count = inb_p(0x40); /* read the latched count */ > count |= inb(0x40) << 8; > - restore_flags(flags); > + spin_unlock_irqrestore(&i8253_lock, flags); > + > return (LATCH - count); /* normal: downcounter */ > #endif > } > > static unsigned int diff(unsigned int t0, unsigned int t1) > { > -#if defined(__alpha__) > - return (t1 <= t0) ? t1 + (1UL << 32) - t0 : t1 - t0; > -#elif defined(__i386__) || defined(__x86_64__) > +#if defined(__alpha__) || defined(__x86_64__) > + return (t1 - t0); > +#elif defined(__i386__) > /* > * This is tricky: to work for both short and full ftape_timestamps > * we'll have to discriminate between these. > @@ -122,9 +139,9 @@ > > static unsigned int usecs(unsigned int count) > { > -#if defined(__alpha__) > +#if defined(__alpha__) || defined(__x86_64__) > return (ps_per_cycle * count) / 1000000UL; > -#elif defined(__i386__) || defined(__x86_64__) > +#elif defined(__i386__) > return (10000 * count) / ((CLOCK_TICK_RATE + 50) / 100); > #endif > } > @@ -153,49 +170,24 @@ > save_flags(flags); > cli(); > t0 = short_ftape_timestamp(); > - for (i = 0; i < 1000; ++i) { > + for (i = 0; i < 1000; ++i) > status = inb(fdc.msr); > - } > t1 = short_ftape_timestamp(); > restore_flags(flags); > + > TRACE(ft_t_info, "inb() duration: %d nsec", ftape_timediff(t0, t1)); > TRACE_EXIT; > } > > static void init_clock(void) > { > -#if defined(__i386__) || defined(__x86_64__) > - unsigned int t; > - int i; > TRACE_FUN(ft_t_any); > > - /* Haven't studied on why, but there sometimes is a problem > - * with the tick timer readout. The two bytes get swapped. > - * This hack solves that problem by doing one extra input. > - */ > - for (i = 0; i < 1000; ++i) { > - t = short_ftape_timestamp(); > - if (t > LATCH) { > - inb_p(0x40); /* get in sync again */ > - TRACE(ft_t_warn, "clock counter fixed"); > - break; > - } > - } > +#if defined(__x86_64__) > + ps_per_cycle = 1000000000UL / cpu_khz; > #elif defined(__alpha__) > -#if CONFIG_FT_ALPHA_CLOCK == 0 > -#error You must define and set CONFIG_FT_ALPHA_CLOCK in 'make config' ! > -#endif > extern struct hwrpb_struct *hwrpb; > - TRACE_FUN(ft_t_any); > - > - if (hwrpb->cycle_freq != 0) { > - ps_per_cycle = (1000*1000*1000*1000UL) / hwrpb->cycle_freq; > - } else { > - /* > - * HELP: Linux 2.0.x doesn't set cycle_freq on my noname ! > - */ > - ps_per_cycle = (1000*1000*1000*1000UL) / CONFIG_FT_ALPHA_CLOCK; > - } > + ps_per_cycle = (1000*1000*1000*1000UL) / hwrpb->cycle_freq; > #endif > TRACE_EXIT; > } > @@ -214,7 +206,7 @@ > unsigned int tc = 0; > unsigned int count; > unsigned int time; > -#if defined(__i386__) || defined(__x86_64__) > +#if defined(__i386__) > unsigned int old_tc = 0; > unsigned int old_count = 1; > unsigned int old_time = 1; > @@ -257,15 +249,14 @@ > tc = (1000 * time) / (count - 1); > TRACE(ft_t_any, "once:%3d us,%6d times:%6d us, TC:%5d ns", > usecs(once), count - 1, usecs(multiple), tc); > -#if defined(__alpha__) > +#if defined(__alpha__) || defined(__x86_64__) > /* > * Increase the calibration count exponentially until the > * calibration time exceeds 100 ms. > */ > - if (time >= 100*1000) { > + if (time >= 100*1000) > break; > - } > -#elif defined(__i386__) || defined(__x86_64__) > +#elif defined(__i386__) > /* > * increase the count until the resulting time nears 2/HZ, > * then the tc will drop sharply because we lose LATCH counts. > diff -Nru a/drivers/char/vt.c b/drivers/char/vt.c > --- a/drivers/char/vt.c Sun May 26 14:18:40 2002 > +++ b/drivers/char/vt.c Sun May 26 14:18:40 2002 > @@ -107,6 +107,7 @@ > _kd_mksound(unsigned int hz, unsigned int ticks) > { > static struct timer_list sound_timer = { function: kd_nosound }; > + extern spinlock_t i8253_lock; > unsigned int count = 0; > unsigned long flags; > > @@ -120,10 +121,12 @@ > /* enable counter 2 */ > outb_p(inb_p(0x61)|3, 0x61); > /* set command for counter 2, 2 byte write */ > + spin_lock(&i8253_lock); > outb_p(0xB6, 0x43); > /* select desired HZ */ > outb_p(count & 0xff, 0x42); > outb((count >> 8) & 0xff, 0x42); > + spin_unlock(&i8253_lock); > > if (ticks) { > sound_timer.expires = jiffies+ticks; > diff -Nru a/drivers/ide/hd.c b/drivers/ide/hd.c > --- a/drivers/ide/hd.c Sun May 26 14:18:40 2002 > +++ b/drivers/ide/hd.c Sun May 26 14:18:40 2002 > @@ -110,6 +110,8 @@ > > static struct timer_list device_timer; > > +#define TIMEOUT_VALUE (6*HZ) > + > #define SET_TIMER \ > do { \ > mod_timer(&device_timer, jiffies + TIMEOUT_VALUE); \ > @@ -131,16 +133,16 @@ > > unsigned long read_timer(void) > { > + extern spinlock_t i8253_lock; > unsigned long t, flags; > int i; > > - save_flags(flags); > - cli(); > + spin_lock_irqsave(&i8253_lock, flags); > t = jiffies * 11932; > outb_p(0, 0x43); > i = inb_p(0x40); > i |= inb(0x40) << 8; > - restore_flags(flags); > + spin_unlock_irqrestore(&i8253_lock, flags); > return(t - i); > } > #endif > @@ -831,7 +833,7 @@ > printk("hd: unable to get major %d for hard disk\n",MAJOR_NR); > return -1; > } > - blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), DEVICE_REQUEST, &hd_lock); > + blk_init_queue(BLK_DEFAULT_QUEUE(MAJOR_NR), do_hd_request, &hd_lock); > blk_queue_max_sectors(BLK_DEFAULT_QUEUE(MAJOR_NR), 255); > add_gendisk(&hd_gendisk); > init_timer(&device_timer); > diff -Nru a/drivers/input/gameport/gameport.c b/drivers/input/gameport/gameport.c > --- a/drivers/input/gameport/gameport.c Sun May 26 14:18:40 2002 > +++ b/drivers/input/gameport/gameport.c Sun May 26 14:18:40 2002 > @@ -54,16 +54,36 @@ > static struct gameport *gameport_list; > static struct gameport_dev *gameport_dev; > > + > +#ifdef __i386__ > + > +#define DELTA(x,y) ((y)-(x)+((y)<(x)?1193180/HZ:0)) > +#define GET_TIME(x) do { x = get_time_pit(); } while (0) > + > +static unsigned int get_time_pit(void) > +{ > + extern spinlock_t i8253_lock; > + unsigned long flags; > + unsigned int count; > + > + spin_lock_irqsave(&i8253_lock, flags); > + outb_p(0x00, 0x43); > + count = inb_p(0x40); > + count |= inb_p(0x40) << 8; > + spin_unlock_irqrestore(&i8253_lock, flags); > + > + return count; > +} > + > +#endif > + > /* > * gameport_measure_speed() measures the gameport i/o speed. > */ > > static int gameport_measure_speed(struct gameport *gameport) > { > -#if defined(__i386__) || defined(__x86_64__) > - > -#define GET_TIME(x) do { outb(0, 0x43); x = inb(0x40); x |= inb(0x40) << 8; } while (0) > -#define DELTA(x,y) ((y)-(x)+((y)<(x)?1193180L/HZ:0)) > +#ifdef __i386__ > > unsigned int i, t, t1, t2, t3, tx; > unsigned long flags; > > =================================================================== > > This BitKeeper patch contains the following changesets: > 1.582..1.584 > ## Wrapped with gzip_uu ## > > begin 664 bkpatch17031 > M'XL(`*#2\#P``\U:ZW/;-A+_+/X5N,E,*R66!(!OYW%Q(K?QU6ESB=T/G<YH > M(!(2&5.DRH=EM>K_?KL`)<NR99MJW3G9)F426"QV][<O\ADY+V1^V+K,OI8R > MB(QGY$-6E(>M<AXG\20J>U4P[P6_P_7/60;7^U$VE?UZ=']TT4_BM"JZO&<; > M,.:3*(.(7,J\.&RQGKF^4BYF\K#U^?C[\].CSX;Q^C5Y'XET(K_(DKQ^;919 > M?BF2L'@KRBC)TEZ9B[28RE+T@FRZ7`]=<DHY_-C,-:GM+)E#+7<9L)`Q83$9 > M4FYYCG5-#5F]GY;-;<JXR?VE:5F>:PP(Z]D>)Y3WJ=WG%F'>H64>VGZ7NH>4 > MDGM(DQ>,=*GQCOR]FWEO!.1\%HI2D@N9IS)1THVSU/B!F);K<^/3M2R-;L./ > M85!!C3</\/Q17,AQG,A-EGW36U+JN<XR=$3H!TQXH>W;PKY/1EN4E/0MTW*6 > MW'9=;C36G&7:J#F4PL>[-&<=4NLQFJ-/H;E-O7PAEX"0'O.,@DS@+X&_1IME > MU*:F[8+(X;.'FO^*:#4HS)5H'<+HH4D/+><%Y2C:VAF\W7(93PB(LR@N2%"` > M\QC'5Q)$&4]E48KIC$QD*G-1`CY(G))Q*6:R&X@D'N6]X(#,HQB<T5P40&,: > M%T6<3H@@219<D'&6$Q$$4E\L(TEBC]NF(IWW](K3+*P22?(J36$0T"BSB82A > M.9G'941BTW/Z&J1]G-8+2)!524AR651)B0PA7441KDWBH@0H`YDD4XL6BS30 > ME(IL7,Y%+HE(<?8LRTLU8"YF,QD2D&8E"V1*PAB]'9&2>99?B#RK8`[NID26 > M[Q#"J"IKOE()O@2^3V>)+&6R`#(@3\7D+,]&B9SVR%%29`=X"58JRCA)@)^I > MB-,"!)>+0))VFLV1QE2FI0R!Q*TE.P=Z5U_C\3@&;>&FM@2\%H>6-%`)1)IF > M)1E)I>*02%'$R:)'3D51ZCW@[42J?]56@RR%[92%7AVUL[**@H`Y7'G.T+%` > M9:0J)#G[\KY>N<@2V#J0E('`.W'Y+;"8S,4"V9B![F!CM0"0\S"31?IM22)Q > M"1=`'AOB*O1&MZT'Z,#OCR"G6HX1BA^)C)#F`E@/Y6[K4T2SJD0MDV(6I\I@ > M(YF$/?)=G`(/BW^I:.`[SC\0#<(\QA#4#R*1]Y6L^TDV3\"6DOY-Q6\@VJ+4 > M7E)F.G3)`\N2PN:!,^+AV'5V^8_&"]G<H9Y)+0O"B<<MP]A%^):_T_.<I1:A > M]G?6AK^S#IE[:-&'_)WSM/Y.342G%V4S.:Y`[;7[6UDAH+(4*5@1:8L:&VCY > MZ)?0=G+P?6C!^*6;9FDQDT$\C@-2"[H#_A'-LUP=:R,,HGA&%"BUB0(:NRL< > M;1@D7(%,,@:5_*YG3\'IQ=W1HES9-OBLU68T!)!S0$55*')I"$R4*^^@37\- > MK#*"+8%+!`(1>D'TP`1=3ST^!2R5Z$`0";;CTW\0"7$H^U&X9>_,7IH<+&L9 > MFBSDWL@-'#EVY"A\T-YOD@/K9)RYU%HZ0-M[D"G4;G\S%*$2_2WF.%O:ONM[ > MRW'@^Z[CP46(^6-F[63N?K+73,(2_&')W:(F9M/;+#K,\<!?V+YCFX('H<U- > M$.'C6=P@>LT@A3S*;^;D+LMM7P;*,!D%(3J.8XX%LP4H7)@[?<,N>M=L6=SB > M9G.YZ3SCEFYMZH`J@*-1Z'-K#+=<]_%RVR1ZS:');/]A\[NQT:_9`G*&X*(_ > M$5.5Q=R."8R"]2UMX4CP$4P$KLD\_V&(I+.J7%.]17[#'!V(.:K@7)4>#]>; > MC<H=XT+$;\L9Z^55E'>K%!Q>%D35M!?*6]6.Q3GW.575#E-A!BYLUYJ6\\A: > MD_VCM::NT'XBW7RN?L%'?EK+=`__.C`),T[P\.7\W>GQS\>GY#5(0*GJ;B`_ > MK+B_XE7NT^/]CL4$:3K@[1UNLUJK]G;N0*U'Y`[^DRCT*,1$7X80M3%,JY)' > M%PFYC-.X5`'[9M:)`1\C]6<YS2#)K4*9B$6;T0Y4`&`<F.E#TH$Q.2M6V2Q0 > MPT04,UI(S&%RO6:78"FBJR$,U1EF%Y`GKS)@+%J(C/&J#MW^MI'=+?T]3.Z$ > M,9>#P;7D%20*Z3IS&99ZWT/\YZ4Q@&$6X6JXC<-QG+HWC//?"DC[V]]<CS\@ > MXT1,BHZ>YQ(7YT&Q;!DM2-E'PUF;7IG6`:%7EMEYV6KUGY,1Y.PY5!Q3S/KY > M`3G]\J[_\<N[`Y`[H>1Y?SWS].CL_0?R#<P=CQ4%"A2``$RX/>S-&^)M#OI8 > M#U+<5^F*?ZAGP,9V;.%.\-6!?@_X-<H\&@%P*_DP.3--;BZI1QU?09#QYA"T > MGBI]1PAN80^1=QMX.N>-H9#.\VI6KK/EJ5B0NAH6(RA8*ZS6:X0=:"1BRH[) > MLAC!G1@K5-446&2I)#(II$Z@==VOL_&-=84J<$D!853Q<`!S59M`J$JW@LB* > M(4"E=@^ALU;-/O@T'0ZX>P">K2HMXDFJW!D(3YGN2^/$8FX#K)Y8G*Z'_Q5P > MU)ZM.38:)&Z-D'$S=UL!@W-F6QH8]/\;&*M*$2M";9QQ2G2=#Z%G6!9!NX.X > M.)J(.*T[/QOP*,H\#LH-<*`9JY:.+@]5TP[#V`(K8VWT8SA`S06A:BXU+9B+ > MPP)=6,,*XRH-L*D(T^4EU)H`F+Q*4=:K\`=3U]TTF1:80V$33A7MN+WWG\YA > M,I3<,E1Q3B73#V%)*W,?*-FN@U"Z$RN_PFW/:8(6&U+R/=#R^`;.PP#ZN[M. > M1EX5Y>(M'H,LG^$:/5'MT7/B#(!*G:7E4:X?(%FW.N4/(PP@9IM/@K'OL*.[ > M[H\#@3!!>T3CK%NBF):AU2D?KSIG6W;Y>*'L50A8JA*P(&5Z)I-X3$*H*<!F > MV\.A9G`X[!C/P`T$"62BY)4HIOUID?>B-]M7<9M7ZOH6'=P=4"'&P/)P,75\ > M=F.(2&:1P#'+Y9T,G-@,&;R+K'%_P'HFTS`>`^H&+L:<@:LJ'SSR>S:\!=T< > M`E\>@O=+VGD'O\NR@B7SE[OV"NOUGQOD.?DQ*^O@KY,$;+YE=9Q'ISB7X,\@ > M+\"D0_?@QJ!<Y9'!+NJ>/1("4>?8A4\G!T!!^4[5MQY)[.'-,TP5=-^<3,!> > MX&:>RZ`DD*5"L=Y#$MV?ZZ?,F)FB0#S,LUW_\;X(5.@I>_$P16_BD0@NZ#.< > MJX[-U#_PE=;4<9?$![Y#3!B#FVHUV!"C6)6<X&F/+3'JXZJ,,3@UV]3*BMHE > MPXXN%`Z[]\:XK9A4IX:R8]S5<]W[I,=L1XU2IQ;ZIW9,7A/ZDL3D%7A2"M]> > MO(C52(5B<'IP0A$X+NQ]H*H[K-N@_.);/&YL>E8,9S(?!HL`FT&*L/Z<GY(^ > M"6;5\"+Z'<LYSU94,?91H.KCHMNSVSC]^<W#^6D'"$7S?#;JOE$#A^-<_@8D > MN4I23_3I;E\RX&I7)_K44-#<L?5<5;>V8');P?R-VJ9B3HUR$7;<\>Y1QV;\ > MWMEM:QBV]VT'KA_D%%4A&[0!.7<X`T&R);6H9:O@[#9/?SD$9^O)\]\Y/L/8 > M_00:8[/J9>Z(S3M%L5?V",FC"<@"\P/+("NKP"O:4LC@^/3LJ'UUL.@0]6FW > M%YUN^ZKS`K^\@B__9LP'W='^AU\.::>SGOC]\=GP[.3C,0Q1$\.,_$&N`$D3 > M60YQJ\-97+;!M_V)3^L!8VV*L0P;3W%`UD$1:N2;,RZS..P8?^Q7/;9NT%7! > M$-/DQ^;'UYT>2E>='J.ER,#&XE3?P\;,ZNKRQF7RZA7Q7C;+KW]=>^^:W3]1 > M.^M4P\$.U(GC:!]R0XFW,O/+YDA^_!,1(\JB[.T(=BN*J)<"/'8]"J$N`(;; > M%-\Z,?5;)Q#3&J/5?,IB]>Y&ZJV:M4>.L4K$I_83]3H`OM"`N5(8%V*4R.*Z > MQP/)4I*-L'5Z4+]?L;ZEIP0"'VUBX7DE@TJ]!P*5JVJC8E&Y>IVB*C:>FFZ1 > M@)H6&SJ;KQCLZ/O4KZJH$>"-=.%P@=W@'XA^0G5?:7"YI[O!%(89I/[<#V#( > M(OC&X&N(;L*DH\8YM\9I;&V-O!'IZD>OCX=#LV>_1B@2";;S5E[&^&"E"V8" > M();%/32QQ/0XAQ+3-BVO;F_N$<:<IXIB6&$JH6'+))O.T&L+;,_HMPWNC7'X > MOM#-**>?<N^*<K5D]NO^8WZ]BD,8@WXZ/QO^?'1Z?MQJ.\\__()QYH29YJ-M > M<<!,E4DQTVOTG,!2M80^-7+Z`T\7R_K4&B4P)8W+X6^5K&3[W>D/P\'Q=T?G > MIV?#_YX?GQ^W/Q[]YZ?/PQ\_=PX@S@ZC<`AI:"7QC:EOX)^5_:]>T@TB,,VB > 3FK[V>!@X^#KL_P!<D_!-'2P````` > ` > end > > -- > Vojtech Pavlik > SuSE Labs > - > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |