• David Wei's avatar
    netdevsim: forward skbs from one connected port to another · 9eb95228
    David Wei authored
    Forward skbs sent from one netdevsim port to its connected netdevsim
    port using dev_forward_skb, in a spirit similar to veth.
    
    Add a tx_dropped variable to struct netdevsim, tracking the number of
    skbs that could not be forwarded using dev_forward_skb().
    
    The xmit() function accessing the peer ptr is protected by an RCU read
    critical section. The rcu_read_lock() is functionally redundant as since
    v5.0 all softirqs are implicitly RCU read critical sections; but it is
    useful for human readers.
    
    If another CPU is concurrently in nsim_destroy(), then it will first set
    the peer ptr to NULL. This does not affect any existing readers that
    dereferenced a non-NULL peer. Then, in unregister_netdevice(), there is
    a synchronize_rcu() before the netdev is actually unregistered and
    freed. This ensures that any readers i.e. xmit() that got a non-NULL
    peer will complete before the netdev is freed.
    
    Any readers after the RCU_INIT_POINTER() but before synchronize_rcu()
    will dereference NULL, making it safe.
    
    The codepath to nsim_destroy() and nsim_create() takes both the newly
    added nsim_dev_list_lock and rtnl_lock. This makes it safe with
    concurrent calls to linking two netdevsims together.
    Signed-off-by: default avatarDavid Wei <dw@davidwei.uk>
    Reviewed-by: default avatarMaciek Machnikowski <maciek@machnikowski.net>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    9eb95228
netdevsim.h 10.1 KB