[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CPSMTPM-CMT109CYRka000629e3@CPSMTPM-CMT109.kpnxchange.com>
Date: Wed, 23 Nov 2011 13:07:40 +0100
From: "N. Coesel" <nico@...dev.nl>
To: Mihai DonÈu <mihai.dontu@...il.com>
Cc: linux-kernel@...r.kernel.org
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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists