Index: linux-2.6.10/net/core/neighbour.c =================================================================== --- linux-2.6.10.orig/net/core/neighbour.c 2005-01-21 11:04:23.000000000 +0100 +++ linux-2.6.10/net/core/neighbour.c 2005-01-31 11:20:38.000000000 +0100 @@ -876,6 +876,9 @@ int __neigh_event_send(struct neighbour struct sk_buff *buff; buff = neigh->arp_queue.next; __skb_unlink(buff, &neigh->arp_queue); + /* Make sure the change of skb->head is + * visible on all CPUs */ + smp_wmb(); kfree_skb(buff); } __skb_queue_tail(&neigh->arp_queue, skb); Index: linux-2.6.10/net/core/skbuff.c =================================================================== --- linux-2.6.10.orig/net/core/skbuff.c 2005-01-21 11:04:15.000000000 +0100 +++ linux-2.6.10/net/core/skbuff.c 2005-01-31 11:20:52.000000000 +0100 @@ -275,6 +275,7 @@ void kfree_skbmem(struct sk_buff *skb) void __kfree_skb(struct sk_buff *skb) { + smp_rmb(); if (skb->list) { printk(KERN_WARNING "Warning: kfree_skb passed an skb still " "on a list (from %p).\n", NET_CALLER(skb));