Thread (3 messages) flat view 3 messages, 2 authors, 2017-01-25

Re: sk_buff and reference counting netdev pointers

From: Cong Wang <hidden>
Date: 2017-01-23 23:45:30

On Mon, Jan 23, 2017 at 2:37 PM, Joel Cunningham [off-list ref] wrote:
Hi,

I’m working on a research effort to understand the synchronization mechanisms for accessing and modifying a struct net_device object.  One area that isn’t clear is the net device pointer (dev) stored in a struct sk_buff.  From my investigation, the pointer appears to be assigned without increasing the struct net_device’s reference count (example __netdev_alloc_skb doesn’t call dev_hold) and also when the sk_buff is freed (kfree_skb) no call to dev_put() is made.  This seems to leave a possibility of an skb referencing a stale net device unless something is cleaning up all the skbs during unregister_netdevice() (which waits for all outstanding references to be released).  Any insight in understanding how this is working would be appreciated!
This is a very common question.

synchronize_net() is supposed to wait for on-flying packets, since
both for TX and RX paths we acquire RCU read lock.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help