On Tue, 2016-03-08 at 14:42 -0800, Alexander Duyck wrote: > The code for csum_block_add was doing a funky byteswap to swap the even and > odd bytes of the checksum if the offset was odd. Instead of doing this we > can save ourselves some trouble and just shift by 8 as this should have the > same effect in terms of the final checksum value and only requires one > instruction.
3 instructions? > In addition we can update csum_block_sub to just use csum_block_add with a > inverse value for csum2. This way we follow the same code path as > csum_block_add without having to duplicate it. > > Signed-off-by: Alexander Duyck <adu...@mirantis.com> > --- > include/net/checksum.h | 11 +++++------ > 1 file changed, 5 insertions(+), 6 deletions(-) > > diff --git a/include/net/checksum.h b/include/net/checksum.h > index 10a16b5bd1c7..f9fac66c0e66 100644 > --- a/include/net/checksum.h > +++ b/include/net/checksum.h > @@ -88,8 +88,10 @@ static inline __wsum > csum_block_add(__wsum csum, __wsum csum2, int offset) > { > u32 sum = (__force u32)csum2; > - if (offset&1) > - sum = ((sum&0xFF00FF)<<8)+((sum>>8)&0xFF00FF); > + > + if (offset & 1) > + sum = (sum << 24) + (sum >> 8); Maybe use ror32(sum, 8); or maybe something like: { u32 sum; /* rotated csum2 of odd offset will be the right checksum */ if (offset & 1) sum = ror32((__force u32)csum2, 8); else sum = (__force u32)csum2;