net: add CONFIG_PCPU_DEV_REFCNT
I was working on a syzbot issue, claiming one device could not be
dismantled because its refcount was -1
unregister_netdevice: waiting for sit0 to become free. Usage count = -1
It would be nice if syzbot could trigger a warning at the time
this reference count became negative.
This patch adds CONFIG_PCPU_DEV_REFCNT options which defaults
to per cpu variables (as before this patch) on SMP builds.
v2: free_dev label in alloc_netdev_mqs() is moved to avoid
a compiler warning (-Wunused-label), as reported
by kernel test robot <lkp@intel.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
942f0c6e28
commit
919067cc84
@@ -2092,7 +2092,12 @@ struct net_device {
|
||||
u32 proto_down_reason;
|
||||
|
||||
struct list_head todo_list;
|
||||
|
||||
#ifdef CONFIG_PCPU_DEV_REFCNT
|
||||
int __percpu *pcpu_refcnt;
|
||||
#else
|
||||
refcount_t dev_refcnt;
|
||||
#endif
|
||||
|
||||
struct list_head link_watch_list;
|
||||
|
||||
@@ -4044,7 +4049,11 @@ void netdev_run_todo(void);
|
||||
*/
|
||||
static inline void dev_put(struct net_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_PCPU_DEV_REFCNT
|
||||
this_cpu_dec(*dev->pcpu_refcnt);
|
||||
#else
|
||||
refcount_dec(&dev->dev_refcnt);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4055,7 +4064,11 @@ static inline void dev_put(struct net_device *dev)
|
||||
*/
|
||||
static inline void dev_hold(struct net_device *dev)
|
||||
{
|
||||
#ifdef CONFIG_PCPU_DEV_REFCNT
|
||||
this_cpu_inc(*dev->pcpu_refcnt);
|
||||
#else
|
||||
refcount_inc(&dev->dev_refcnt);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Carrier loss detection, dial on demand. The functions netif_carrier_on
|
||||
|
||||
Reference in New Issue
Block a user