On Thu, Jul 7, 2011 at 11:12 PM, Christoph Lameter <cl@xxxxxxxxx> wrote: > On Thu, 7 Jul 2011, Pekka Enberg wrote: > >> I applied the patch. I think a follow up patch that moves the function >> to lib/string.c with proper generic name would be in order. Thanks! > > Well this is really straightforward. Hasnt seen much testing yet and > needs refinement but it would be like this: > > > --- > arch/x86/include/asm/string_32.h | 2 ++ > arch/x86/lib/string_32.c | 17 +++++++++++++++++ > include/linux/string.h | 3 +++ > lib/string.c | 25 +++++++++++++++++++++++++ > mm/slub.c | 13 ++++++------- > 5 files changed, 53 insertions(+), 7 deletions(-) > > Index: linux-2.6/arch/x86/lib/string_32.c > =================================================================== > --- linux-2.6.orig/arch/x86/lib/string_32.c 2011-07-07 15:03:46.000000000 -0500 > +++ linux-2.6/arch/x86/lib/string_32.c 2011-07-07 15:03:56.000000000 -0500 > @@ -214,6 +214,23 @@ void *memscan(void *addr, int c, size_t > EXPORT_SYMBOL(memscan); > #endif > > +#ifdef __HAVE_ARCH_INV_MEMSCAN > +void *inv_memscan(void *addr, int c, size_t size) > +{ > + if (!size) > + return addr; > + asm volatile("repz; scasb\n\t" > + "jz 1f\n\t" > + "dec %%edi\n" > + "1:" > + : "=D" (addr), "=c" (size) > + : "0" (addr), "1" (size), "a" (c) > + : "memory"); > + return addr; > +} > +EXPORT_SYMBOL(memscan); > +#endif > + > #ifdef __HAVE_ARCH_STRNLEN > size_t strnlen(const char *s, size_t count) > { > Index: linux-2.6/include/linux/string.h > =================================================================== > --- linux-2.6.orig/include/linux/string.h 2011-07-07 15:03:46.000000000 -0500 > +++ linux-2.6/include/linux/string.h 2011-07-07 15:03:56.000000000 -0500 > @@ -108,6 +108,9 @@ extern void * memmove(void *,const void > #ifndef __HAVE_ARCH_MEMSCAN > extern void * memscan(void *,int,__kernel_size_t); > #endif > +#ifndef __HAVE_ARCH_INV_MEMSCAN > +extern void * inv_memscan(void *,int,__kernel_size_t); > +#endif > #ifndef __HAVE_ARCH_MEMCMP > extern int memcmp(const void *,const void *,__kernel_size_t); > #endif > Index: linux-2.6/lib/string.c > =================================================================== > --- linux-2.6.orig/lib/string.c 2011-07-07 15:03:46.000000000 -0500 > +++ linux-2.6/lib/string.c 2011-07-07 15:03:56.000000000 -0500 > @@ -684,6 +684,31 @@ void *memscan(void *addr, int c, size_t > EXPORT_SYMBOL(memscan); > #endif > > +#ifndef __HAVE_ARCH_INV_MEMSCAN > +/** > + * memscan - Skip characters in an area of memory. > + * @addr: The memory area > + * @c: The byte to skip > + * @size: The size of the area. > + * > + * returns the address of the first mismatch of @c, or 1 byte past > + * the area if @c matches to the end > + */ > +void *inv_memscan(void *addr, int c, size_t size) I think this needs a better name. My suggestion is memskip(). -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href