Re: [RFC][PATCH 2/9] deadlock prevention core
From: Peter Zijlstra <hidden>
Date: 2006-08-09 14:11:45
Also in:
linux-mm, lkml
On Wed, 2006-08-09 at 15:19 +0200, Thomas Graf wrote:
* Daniel Phillips [off-list ref] 2006-08-08 22:47quoted
David Miller wrote:quoted
From: Daniel Phillips <redacted>>>Can you please characterize the conditions under which skb->dev changesquoted
quoted
after the alloc? Are there writings on this subtlety?The packet scheduler and classifier can redirect packets to different devices, and can the netfilter layer. The setting of skb->dev is wholly transient and you cannot rely upon it to be the same as when you set it on allocation. Even simple things like the bonding device change skb->dev on every receive.Thankyou, this is easily fixed.It's not that simple, in order to just fix the most obvious case being packet forwarding when skb->dev changes its meaning from device the packet is coming from to device the packet will be leaving on is difficult. You can't unreserve at that point so you need to keep the original skb->dev. Since the packet is mostly likely queued before freeing you will lose the refcnt on the original skb->dev. Keeping a refcnt just for this memalloc stuff is out of question. Even keeping the ifindex on a best effort basis is unlikely an option, sk_buff is way overweight already.
I think Daniel was thinking of adding struct net_device * sk_buff::alloc_dev, I know I was after reading the first few mails. However if adding a field there is strict no-no.... /me takes a look at struct sk_buff Hmm, what does sk_buff::input_dev do? That seems to store the initial device?