Messages in this thread | | | Date | Wed, 23 Nov 2011 13:07:40 +0100 | From | "N. Coesel" <> | Subject | Re: Fast memcpy patch |
| |
Nihai,
At 12:45 23-11-2011, Mihai DonÈu wrote: >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.
If you can, yes please. I used diff -uprN to make the patch. It cross-compiles without warnings using gcc4.4 for ARM.
Nico COesel
> > --- 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
o---------------------------------------------------------------o | N C T Developments | |Innovative embedded solutions | o---------------------------------------------------------------o
-- 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/
| |