Messages in this thread | | | Date | Wed, 23 Nov 2011 13:45:29 +0200 | From | Mihai Donțu <> | Subject | Re: Fast memcpy patch |
| |
On Wed, 23 Nov 2011 12:25:46 +0100 N. Coesel wrote: > Dear readers, > I noticed the Linux kernel still uses a byte-by-byte copy method for > memcpy. Since most memory allocations are aligned to the integer size > of a cpu it is often faster to copy by using the CPU's native word > size. The patch below does that. The code is already at work in many > 16 and 32 bit embedded products. It should also work for 64 bit > platforms. So far I only tested 16 and 32 bit platforms. >
Could you run checkpatch.pl on this an fix all the warnings? Or, if you wish, I could do it for you.
> --- lib/string.c.orig 2010-08-20 20:55:55.000000000 +0200 > +++ lib/string.c 2011-11-23 12:29:02.000000000 +0100 > @@ -565,14 +565,47 @@ EXPORT_SYMBOL(memset); > * You should not use this function to access IO space, use > memcpy_toio() > * or memcpy_fromio() instead. > */ > -void *memcpy(void *dest, const void *src, size_t count) > + > +void *memcpy(void *dst, const void *src, size_t length) > { > - char *tmp = dest; > - const char *s = src; > + void *p=dst; > > - while (count--) > - *tmp++ = *s++; > - return dest; > + //check alignment > + if (( (int) dst & (sizeof(int) -1)) != ( (int) src & > (sizeof(int) -1) )) > + { > + //unaligned. This will never align so copy > byte-by-byte > + goto copyrest; > + } > + > + //seek aligment (lower bits should become 0). Because > + //we already tested the lower bits are equal, we only need > + //to test source or destination for matching alignment. > + while ( (length !=0) && (((int) src & (sizeof(int)-1 ))!=0) ) > + { > + > + *((char*) dst++)=*((char*)src++); > + length--; > + } > + > + //copy words > + while(length> (sizeof(int)-1) ) > + { > + *((int*) dst)=*((int*)src); > + dst+=sizeof(int); > + src+=sizeof(int); > + length-=sizeof(int); > + } > + > +copyrest: > + > + //now copy the rest byte-by-byte > + while(length !=0) > + { > + *((char*) dst++)=*((char*) src++); > + length--; > + } > + > + return p; > } > EXPORT_SYMBOL(memcpy); > #endif >
-- Mihai Donțu -- 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/
| |