[NET]: Speed up __alloc_skb()
authorBenjamin LaHaise <bcrl@kvack.org>
Tue, 3 Jan 2006 22:06:50 +0000 (14:06 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 3 Jan 2006 22:06:50 +0000 (14:06 -0800)
commit4947d3ef8de7b4f42aed6ea9ba689dc8fb45b5a5
treea4e77f0271702e4ff34a7a9e0c9598a3807204ee
parent17ba15fb6264f27374bc87f4c3f8519b80289d85
[NET]: Speed up __alloc_skb()

From: Benjamin LaHaise <bcrl@kvack.org>

In __alloc_skb(), the use of skb_shinfo() which casts a u8 * to the
shared info structure results in gcc being forced to do a reload of the
pointer since it has no information on possible aliasing.  Fix this by
using a pointer to refer to skb_shared_info.

By initializing skb_shared_info sequentially, the write combining buffers
can reduce the number of memory transactions to a single write.  Reorder
the initialization in __alloc_skb() to match the structure definition.
There is also an alignment issue on 64 bit systems with skb_shared_info
by converting nr_frags to a short everything packs up nicely.

Also, pass the slab cache pointer according to the fclone flag instead
of using two almost identical function calls.

This raises bw_unix performance up to a peak of 707KB/s when combined
with the spinlock patch.  It should help other networking protocols, too.

Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/core/skbuff.c