UP went into unexpected trashing
[ find_first_bit on x86 returns 32 even if you said to stop at (say) 5
bits. Uncovered by the larger cpu mask patch. ]
From: [email protected]
Well, my earlier find_first_bit() implementation was completely bogus. My sanity has now returned and I coded this patch below that fixes find_find_bit() to return "size" if all bits are zero. I have tested it extensively in userspace and it boots 2.5.44-mm5 which crashed with the earlier version of the bitops_fix patch. I have coded the assembly routine as optimal as I could think of and without introducing any new branches or memory loads.
Along with this patch, I applied the larger_cpu_mask patch to -mm5 and sanity tested both UP and SMP kernels for dcache leaks in a 4CPU P3 box. An ls -lR and subsequent unmounting of that filesystems showed that the dentries were correctly getting returned the dcache slab and that indicates that the larger_cpu_mask patch no longer breaks RCU. I will do some more testing with this combination later with rcu_stats applied on this tree (just to be sure), but so far it looks good.
Thanks
--
Dipankar Sarma <[email protected]> http://lse.sourceforge.net
Linux Technology Center, IBM Software Lab, Bangalore, India.
bitops_fix.patch
-----------------
include/asm-i386/bitops.h renamed from include/asm-i386/bitops.h.orig +5 -4
@@ -311,12 +311,13 @@ "repe; scasl\n\t" "jz 1f\n\t" "leal -4(%%edi),%%edi\n\t" - "bsfl (%%edi),%%eax\n" - "1:\tsubl %%ebx,%%edi\n\t" + "bsfl (%%edi),%%edx\n" + "subl %%ebx,%%edi\n\t" "shll $3,%%edi\n\t" - "addl %%edi,%%eax" + "addl %%edi,%%edx\n\t" + "1:\tmovl %%edx,%%eax\n\t" :"=a" (res), "=&c" (d0), "=&D" (d1) - :"1" ((size + 31) >> 5), "2" (addr), "b" (addr)); + :"1" ((size + 31) >> 5), "2" (addr), "b" (addr), "d" (size));return res; }
Signature · 2 lines
Don't blame me: the Monkey is driving File: [email protected]: Re: [long]2.5.44-mm3 UP went into unexpected trashing