In article <20030609.031341.77044985.davem@redhat.com> (at Mon, 09 Jun 2003 03:13:41 -0700 (PDT)), "David S. Miller" <davem@redhat.com> says: > It's unlikely to be the reason for the profile hit on a modern x86. > They are all really fast at reading/writing L1. : > This is also why the net/core/skbuff.c initialization hacks are so > effective as well. > > Trust me, this has every symptom of excess store buffer traffic :) Ok, how about this? Index: linux25/include/net/dst.h =================================================================== RCS file: /cvsroot/usagi/usagi/kernel/linux25/include/net/dst.h,v retrieving revision 1.7 diff -u -r1.7 dst.h --- linux25/include/net/dst.h 20 Apr 2003 14:55:48 -0000 1.7 +++ linux25/include/net/dst.h 9 Jun 2003 10:26:30 -0000 @@ -38,7 +38,7 @@ struct dst_entry { struct dst_entry *next; - atomic_t __refcnt; /* client references */ + int __use; struct dst_entry *child; struct net_device *dev; @@ -48,14 +48,12 @@ #define DST_NOXFRM 2 #define DST_NOPOLICY 4 #define DST_NOHASH 8 - unsigned long lastuse; unsigned long expires; unsigned short header_len; /* more space at head required */ unsigned short trailer_len; /* space to reserve at tail */ u32 metrics[RTAX_MAX]; - struct dst_entry *path; unsigned long rate_last; /* rate limiting for ICMP */ unsigned long rate_tokens; @@ -66,16 +64,24 @@ struct hh_cache *hh; struct xfrm_state *xfrm; - int (*input)(struct sk_buff*); - int (*output)(struct sk_buff*); - #ifdef CONFIG_NET_CLS_ROUTE __u32 tclassid; #endif - struct dst_ops *ops; struct rcu_head rcu_head; - + + /* These elements should be at the end of dst_entry{}; + * see net/core/dst.c:dst_alloc() -- yoshfuji */ + u32 __dst_memset_tail[0]; + + atomic_t __refcnt; /* client references */ + unsigned long lastuse; + + struct dst_entry *path; + int (*input)(struct sk_buff*); + int (*output)(struct sk_buff*); + struct dst_ops *ops; + char info[0]; }; Index: linux25/net/core/dst.c =================================================================== RCS file: /cvsroot/usagi/usagi/kernel/linux25/net/core/dst.c,v retrieving revision 1.1.1.9 diff -u -r1.1.1.9 dst.c --- linux25/net/core/dst.c 27 May 2003 02:59:54 -0000 1.1.1.9 +++ linux25/net/core/dst.c 9 Jun 2003 10:26:30 -0000 @@ -122,13 +122,16 @@ dst = kmem_cache_alloc(ops->kmem_cachep, SLAB_ATOMIC); if (!dst) return NULL; - memset(dst, 0, ops->entry_size); + memset(dst, 0, offsetof(struct dst_entry, __dst_memset_tail)); atomic_set(&dst->__refcnt, 0); - dst->ops = ops; dst->lastuse = jiffies; dst->path = dst; dst->input = dst_discard; dst->output = dst_blackhole; + dst->ops = ops; + if (ops->entry_size > offsetof(struct dst_entry, info)) + memset(&dst->info, 0, ops->entry_size - offsetof(struct dst_entry, info)); + #if RT_CACHE_DEBUG >= 2 atomic_inc(&dst_total); #endif -- Hideaki YOSHIFUJI @ USAGI Project <yoshfuji@linux-ipv6.org> GPG FP: 9022 65EB 1ECF 3AD1 0BDF 80D8 4807 F894 E062 0EEA - : send the line "unsubscribe linux-net" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html