[PATCH net-next 00/13] net: second round of netdevice refcount tracking
STALE1742d
LANDED
Landed in mainline as adc76fc97bd8 on 2021-12-08.
23 messages,
6 authors,
2022-01-05 · open the first message on its own page
From: Eric Dumazet <redacted>
The most interesting part of this series is probably
("inet: add net device refcount tracker to struct fib_nh_common")
but only future reports will confirm this guess.
Eric Dumazet (13):
net: eql: add net device refcount tracker
vlan: add net device refcount tracker
net: bridge: add net device refcount tracker
net: watchdog: add net device refcount tracker
net: switchdev: add net device refcount tracker
inet: add net device refcount tracker to struct fib_nh_common
ax25: add net device refcount tracker
llc: add net device refcount tracker
pktgen add net device refcount tracker
net/smc: add net device tracker to struct smc_pnetentry
netlink: add net device refcount tracker to struct ethnl_req_info
openvswitch: add net device refcount tracker to struct vport
net: sched: act_mirred: add net device refcount tracker
drivers/net/eql.c | 4 ++--
include/linux/if_eql.h | 1 +
include/linux/if_vlan.h | 3 +++
include/linux/netdevice.h | 2 ++
include/net/ax25.h | 3 +++
include/net/ip_fib.h | 2 ++
include/net/llc_conn.h | 1 +
include/net/tc_act/tc_mirred.h | 1 +
net/8021q/vlan_dev.c | 4 ++--
net/ax25/ax25_dev.c | 8 ++++----
net/bridge/br_if.c | 6 +++---
net/bridge/br_private.h | 1 +
net/core/pktgen.c | 8 +++++---
net/ethtool/netlink.c | 8 +++++---
net/ethtool/netlink.h | 2 ++
net/ipv4/fib_semantics.c | 12 +++++++-----
net/ipv6/route.c | 2 ++
net/llc/af_llc.c | 5 +++--
net/openvswitch/vport-netdev.c | 8 ++++----
net/openvswitch/vport.h | 2 ++
net/sched/act_mirred.c | 18 ++++++++++--------
net/sched/sch_generic.c | 10 ++++++----
net/smc/smc_pnet.c | 9 +++++----
net/switchdev/switchdev.c | 5 +++--
24 files changed, 79 insertions(+), 46 deletions(-)
--
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
include/linux/if_vlan.h | 3 +++
net/8021q/vlan_dev.c | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
index 41a518336673b496faf7ce0ea2a65068fe6814f2..8420fe5049272bbfa108df794bb351f7d87f7a5c 100644
--- a/include/linux/if_vlan.h
+++ b/include/linux/if_vlan.h @@ -162,6 +162,7 @@ struct netpoll;
* @ vlan_id : VLAN identifier
* @ flags : device flags
* @ real_dev : underlying netdevice
+ * @ dev_tracker : refcount tracker for @ real_dev reference
* @ real_dev_addr : address of underlying netdevice
* @ dent : proc dir entry
* @ vlan_pcpu_stats : ptr to percpu rx stats @@ -177,6 +178,8 @@ struct vlan_dev_priv {
u16 flags ;
struct net_device * real_dev ;
+ netdevice_tracker dev_tracker ;
+
unsigned char real_dev_addr [ ETH_ALEN ];
struct proc_dir_entry * dent ; diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c
index 866556e041b729af5ebd5184fa3a90374fc3c244..26d031a43cc1a70aa94a5f3efe895efacb612cad 100644
--- a/net/8021q/vlan_dev.c
+++ b/net/8021q/vlan_dev.c @@ -616,7 +616,7 @@ static int vlan_dev_init(struct net_device *dev)
return - ENOMEM ;
/* Get vlan's reference to real_dev */
- dev_hold ( real_dev );
+ dev_hold_track ( real_dev , & vlan -> dev_tracker , GFP_KERNEL );
return 0 ;
} @@ -848,7 +848,7 @@ static void vlan_dev_free(struct net_device *dev)
vlan -> vlan_pcpu_stats = NULL ;
/* Get rid of the vlan's reference to real_dev */
- dev_put ( vlan -> real_dev );
+ dev_put_track ( vlan -> real_dev , & vlan -> dev_tracker );
}
void vlan_setup ( struct net_device * dev ) --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
include/net/ip_fib.h | 2 ++
net/ipv4/fib_semantics.c | 12 +++++++-----
net/ipv6/route.c | 2 ++
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 3417ba2d27ad6a1b5612a8855d2788f10d9fdf25..c4297704bbcbaac0ad5da1675ae47dee1e133df4 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h @@ -79,6 +79,7 @@ struct fnhe_hash_bucket {
struct fib_nh_common {
struct net_device * nhc_dev ;
+ netdevice_tracker nhc_dev_tracker ;
int nhc_oif ;
unsigned char nhc_scope ;
u8 nhc_family ; @@ -111,6 +112,7 @@ struct fib_nh {
int nh_saddr_genid ;
#define fib_nh_family nh_common.nhc_family
#define fib_nh_dev nh_common.nhc_dev
+ #define fib_nh_dev_tracker nh_common.nhc_dev_tracker
#define fib_nh_oif nh_common.nhc_oif
#define fib_nh_flags nh_common.nhc_flags
#define fib_nh_lws nh_common.nhc_lwtstate diff --git a/net/ipv4/fib_semantics.c b/net/ipv4/fib_semantics.c
index fde7797b580694bb3924c5c6e9560cf04fd67387..3cad543dc7477aa94140d240ecd2014093befddd 100644
--- a/net/ipv4/fib_semantics.c
+++ b/net/ipv4/fib_semantics.c @@ -208,7 +208,7 @@ static void rt_fibinfo_free_cpus(struct rtable __rcu * __percpu *rtp)
void fib_nh_common_release ( struct fib_nh_common * nhc )
{
- dev_put ( nhc -> nhc_dev );
+ dev_put_track ( nhc -> nhc_dev , & nhc -> nhc_dev_tracker );
lwtstate_put ( nhc -> nhc_lwtstate );
rt_fibinfo_free_cpus ( nhc -> nhc_pcpu_rth_output );
rt_fibinfo_free ( & nhc -> nhc_rth_input ); @@ -1006,7 +1006,7 @@ static int fib_check_nh_v6_gw(struct net *net, struct fib_nh *nh,
err = ipv6_stub -> fib6_nh_init ( net , & fib6_nh , & cfg , GFP_KERNEL , extack );
if ( ! err ) {
nh -> fib_nh_dev = fib6_nh . fib_nh_dev ;
- dev_hold ( nh -> fib_nh_dev );
+ dev_hold_track ( nh -> fib_nh_dev , & nh -> fib_nh_dev_tracker , GFP_KERNEL );
nh -> fib_nh_oif = nh -> fib_nh_dev -> ifindex ;
nh -> fib_nh_scope = RT_SCOPE_LINK ;
@@ -1090,7 +1090,7 @@ static int fib_check_nh_v4_gw(struct net *net, struct fib_nh *nh, u32 table,
if ( ! netif_carrier_ok ( dev ))
nh -> fib_nh_flags |= RTNH_F_LINKDOWN ;
nh -> fib_nh_dev = dev ;
- dev_hold ( dev );
+ dev_hold_track ( dev , & nh -> fib_nh_dev_tracker , GFP_ATOMIC );
nh -> fib_nh_scope = RT_SCOPE_LINK ;
return 0 ;
} @@ -1144,7 +1144,7 @@ static int fib_check_nh_v4_gw(struct net *net, struct fib_nh *nh, u32 table,
"No egress device for nexthop gateway" );
goto out ;
}
- dev_hold ( dev );
+ dev_hold_track ( dev , & nh -> fib_nh_dev_tracker , GFP_ATOMIC );
if ( ! netif_carrier_ok ( dev ))
nh -> fib_nh_flags |= RTNH_F_LINKDOWN ;
err = ( dev -> flags & IFF_UP ) ? 0 : - ENETDOWN ; @@ -1178,7 +1178,7 @@ static int fib_check_nh_nongw(struct net *net, struct fib_nh *nh,
}
nh -> fib_nh_dev = in_dev -> dev ;
- dev_hold ( nh -> fib_nh_dev );
+ dev_hold_track ( nh -> fib_nh_dev , & nh -> fib_nh_dev_tracker , GFP_ATOMIC );
nh -> fib_nh_scope = RT_SCOPE_HOST ;
if ( ! netif_carrier_ok ( nh -> fib_nh_dev ))
nh -> fib_nh_flags |= RTNH_F_LINKDOWN ; @@ -1508,6 +1508,8 @@ struct fib_info *fib_create_info(struct fib_config *cfg,
err = - ENODEV ;
if ( ! nh -> fib_nh_dev )
goto failure ;
+ netdev_tracker_alloc ( nh -> fib_nh_dev , & nh -> fib_nh_dev_tracker ,
+ GFP_KERNEL );
} else {
int linkdown = 0 ;
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 8d834f901b483edf75c493620d38f979a4bcbf69..4d02a329ab6004169ebd31c5474ce8be5553d569 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c @@ -3628,6 +3628,8 @@ int fib6_nh_init(struct net *net, struct fib6_nh *fib6_nh,
}
fib6_nh -> fib_nh_dev = dev ;
+ netdev_tracker_alloc ( dev , & fib6_nh -> fib_nh_dev_tracker , gfp_flags );
+
fib6_nh -> fib_nh_oif = dev -> ifindex ;
err = 0 ;
out : --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
drivers/net/eql.c | 4 ++--
include/linux/if_eql.h | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/eql.c b/drivers/net/eql.c
index 8ef34901c2d8eef46ade52600c31359042463297..1111d1f33865edc7f98e7057118c9e4b8c8d327b 100644
--- a/drivers/net/eql.c
+++ b/drivers/net/eql.c @@ -225,7 +225,7 @@ static void eql_kill_one_slave(slave_queue_t *queue, slave_t *slave)
list_del ( & slave -> list );
queue -> num_slaves -- ;
slave -> dev -> flags &= ~ IFF_SLAVE ;
- dev_put ( slave -> dev );
+ dev_put_track ( slave -> dev , & slave -> dev_tracker );
kfree ( slave );
}
@@ -399,7 +399,7 @@ static int __eql_insert_slave(slave_queue_t *queue, slave_t *slave)
if ( duplicate_slave )
eql_kill_one_slave ( queue , duplicate_slave );
- dev_hold ( slave -> dev );
+ dev_hold_track ( slave -> dev , & slave -> dev_tracker , GFP_ATOMIC );
list_add ( & slave -> list , & queue -> all_slaves );
queue -> num_slaves ++ ;
slave -> dev -> flags |= IFF_SLAVE ; diff --git a/include/linux/if_eql.h b/include/linux/if_eql.h
index d984694c384d7dde37b7b1f9ac0a90e6ef7bb87f..d75601d613cc6859b692ab3a41b55893e5921dd9 100644
--- a/include/linux/if_eql.h
+++ b/include/linux/if_eql.h @@ -26,6 +26,7 @@
typedef struct slave {
struct list_head list ;
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
long priority ;
long priority_bps ;
long priority_Bps ; --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Add a netdevice_tracker inside struct net_device, to track
the self reference when a device has an active watchdog timer.
Signed-off-by: Eric Dumazet <redacted>
---
include/linux/netdevice.h | 2 ++
net/sched/sch_generic.c | 10 ++++++----
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 201d8c5be80685f89d7fdba4b61f83194beb9b13..235d5d082f1a446c8d898ffcc5b1983df7c04f35 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h @@ -1944,6 +1944,7 @@ enum netdev_ml_priv_type {
*
* @ dev_addr_shadow : Copy of @ dev_addr to catch direct writes .
* @ linkwatch_dev_tracker : refcount tracker used by linkwatch .
+ * @ watchdog_dev_tracker : refcount tracker used by watchdog .
*
* FIXME : cleanup struct net_device such that network protocol info
* moves out . @@ -2275,6 +2276,7 @@ struct net_device {
u8 dev_addr_shadow [ MAX_ADDR_LEN ];
netdevice_tracker linkwatch_dev_tracker ;
+ netdevice_tracker watchdog_dev_tracker ;
};
#define to_net_dev(d) container_of(d, struct net_device, dev)
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 8c8fbf2e385679e46a1b7af47eeac059fb8468cc..b07bd1c7330f54a00c44ecd2e354af76f62b64e8 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c @@ -499,6 +499,7 @@ EXPORT_SYMBOL(netif_tx_unlock);
static void dev_watchdog ( struct timer_list * t )
{
struct net_device * dev = from_timer ( dev , t , watchdog_timer );
+ bool release = true ;
spin_lock ( & dev -> tx_global_lock );
if ( ! qdisc_tx_is_noop ( dev )) { @@ -534,12 +535,13 @@ static void dev_watchdog(struct timer_list *t)
if ( ! mod_timer ( & dev -> watchdog_timer ,
round_jiffies ( jiffies +
dev -> watchdog_timeo )))
- dev_hold ( dev );
+ release = false ;
}
}
spin_unlock ( & dev -> tx_global_lock );
- dev_put ( dev );
+ if ( release )
+ dev_put_track ( dev , & dev -> watchdog_dev_tracker );
}
void __netdev_watchdog_up ( struct net_device * dev ) @@ -549,7 +551,7 @@ void __netdev_watchdog_up(struct net_device *dev)
dev -> watchdog_timeo = 5 * HZ ;
if ( ! mod_timer ( & dev -> watchdog_timer ,
round_jiffies ( jiffies + dev -> watchdog_timeo )))
- dev_hold ( dev );
+ dev_hold_track ( dev , & dev -> watchdog_dev_tracker , GFP_ATOMIC );
}
}
EXPORT_SYMBOL_GPL ( __netdev_watchdog_up ); @@ -563,7 +565,7 @@ static void dev_watchdog_down(struct net_device *dev)
{
netif_tx_lock_bh ( dev );
if ( del_timer ( & dev -> watchdog_timer ))
- dev_put ( dev );
+ dev_put_track ( dev , & dev -> watchdog_dev_tracker );
netif_tx_unlock_bh ( dev );
}
--
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/bridge/br_if.c | 6 +++---
net/bridge/br_private.h | 1 +
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
index 3915832a03c25e22ae2215ee93dceb0f8e5b5cc4..a52ad81596b72dde8e9a0affccd38c91ab59315d 100644
--- a/net/bridge/br_if.c
+++ b/net/bridge/br_if.c @@ -274,7 +274,7 @@ static void destroy_nbp(struct net_bridge_port *p)
p -> br = NULL ;
p -> dev = NULL ;
- dev_put ( dev );
+ dev_put_track ( dev , & p -> dev_tracker );
kobject_put ( & p -> kobj );
} @@ -423,7 +423,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
return ERR_PTR ( - ENOMEM );
p -> br = br ;
- dev_hold ( dev );
+ dev_hold_track ( dev , & p -> dev_tracker , GFP_KERNEL );
p -> dev = dev ;
p -> path_cost = port_cost ( dev );
p -> priority = 0x8000 >> BR_PORT_BITS ; @@ -434,7 +434,7 @@ static struct net_bridge_port *new_nbp(struct net_bridge *br,
br_stp_port_timer_init ( p );
err = br_multicast_add_port ( p );
if ( err ) {
- dev_put ( dev );
+ dev_put_track ( dev , & p -> dev_tracker );
kfree ( p );
p = ERR_PTR ( err );
} diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h
index c0efd697865abea651263fc5258715e50c151726..af2b3512d86c8bc0fe799d9d698fa9b6bf3cb94b 100644
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h @@ -344,6 +344,7 @@ struct net_bridge_mdb_entry {
struct net_bridge_port {
struct net_bridge * br ;
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
struct list_head list ;
unsigned long flags ; --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
include/net/llc_conn.h | 1 +
net/llc/af_llc.c | 5 +++--
2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/include/net/llc_conn.h b/include/net/llc_conn.h
index ea985aa7a6c5e64b6802c2399ad47db23fdbd9bf..2c1ea3414640523a3efc20ad626ae9896a418d1b 100644
--- a/include/net/llc_conn.h
+++ b/include/net/llc_conn.h @@ -38,6 +38,7 @@ struct llc_sock {
struct llc_addr laddr ; /* lsap/mac pair */
struct llc_addr daddr ; /* dsap/mac pair */
struct net_device * dev ; /* device to send to remote */
+ netdevice_tracker dev_tracker ;
u32 copied_seq ; /* head of yet unread data */
u8 retry_count ; /* number of retries */
u8 ack_must_be_send ; diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
index 3086f4a6ae683f1119d4813648bf9fd9ba215436..26c00ebf4fbae4d7dc1c27d180385470fa252be0 100644
--- a/net/llc/af_llc.c
+++ b/net/llc/af_llc.c @@ -224,7 +224,7 @@ static int llc_ui_release(struct socket *sock)
} else {
release_sock ( sk );
}
- dev_put ( llc -> dev );
+ dev_put_track ( llc -> dev , & llc -> dev_tracker );
sock_put ( sk );
llc_sk_free ( sk );
out : @@ -295,6 +295,7 @@ static int llc_ui_autobind(struct socket *sock, struct sockaddr_llc *addr)
llc -> dev = dev_getfirstbyhwtype ( & init_net , addr -> sllc_arphrd );
if ( ! llc -> dev )
goto out ;
+ netdev_tracker_alloc ( llc -> dev , & llc -> dev_tracker , GFP_KERNEL );
rc = - EUSERS ;
llc -> laddr . lsap = llc_ui_autoport ();
if ( ! llc -> laddr . lsap ) @@ -362,7 +363,7 @@ static int llc_ui_bind(struct socket *sock, struct sockaddr *uaddr, int addrlen)
} else
llc -> dev = dev_getbyhwaddr_rcu ( & init_net , addr -> sllc_arphrd ,
addr -> sllc_mac );
- dev_hold ( llc -> dev );
+ dev_hold_track ( llc -> dev , & llc -> dev_tracker , GFP_ATOMIC );
rcu_read_unlock ();
if ( ! llc -> dev )
goto out ; --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/switchdev/switchdev.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/net/switchdev/switchdev.c b/net/switchdev/switchdev.c
index 83460470e88315f9bee59271b6955294d0b6f42a..b62565278faccfb7f96228a19304a9ec6c161655 100644
--- a/net/switchdev/switchdev.c
+++ b/net/switchdev/switchdev.c @@ -28,6 +28,7 @@ typedef void switchdev_deferred_func_t(struct net_device *dev,
struct switchdev_deferred_item {
struct list_head list ;
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
switchdev_deferred_func_t * func ;
unsigned long data [];
}; @@ -63,7 +64,7 @@ void switchdev_deferred_process(void)
while (( dfitem = switchdev_deferred_dequeue ())) {
dfitem -> func ( dfitem -> dev , dfitem -> data );
- dev_put ( dfitem -> dev );
+ dev_put_track ( dfitem -> dev , & dfitem -> dev_tracker );
kfree ( dfitem );
}
} @@ -90,7 +91,7 @@ static int switchdev_deferred_enqueue(struct net_device *dev,
dfitem -> dev = dev ;
dfitem -> func = func ;
memcpy ( dfitem -> data , data , data_len );
- dev_hold ( dev );
+ dev_hold_track ( dev , & dfitem -> dev_tracker , GFP_ATOMIC );
spin_lock_bh ( & deferred_lock );
list_add_tail ( & dfitem -> list , & deferred );
spin_unlock_bh ( & deferred_lock ); --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/core/pktgen.c | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index a3d74e2704c42e3bec1aa502b911c1b952a56cf1..560a5e712dc32fe4aa2cfaa751c3fe1e462c614f 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c @@ -410,6 +410,7 @@ struct pktgen_dev {
* device name ( not when the inject is
* started as it used to do .)
*/
+ netdevice_tracker dev_tracker ;
char odevname [ 32 ];
struct flow_state * flows ;
unsigned int cflows ; /* Concurrent flows (config) */ @@ -2099,7 +2100,7 @@ static int pktgen_setup_dev(const struct pktgen_net *pn,
/* Clean old setups */
if ( pkt_dev -> odev ) {
- dev_put ( pkt_dev -> odev );
+ dev_put_track ( pkt_dev -> odev , & pkt_dev -> dev_tracker );
pkt_dev -> odev = NULL ;
}
@@ -2117,6 +2118,7 @@ static int pktgen_setup_dev(const struct pktgen_net *pn,
err = - ENETDOWN ;
} else {
pkt_dev -> odev = odev ;
+ netdev_tracker_alloc ( odev , & pkt_dev -> dev_tracker , GFP_KERNEL );
return 0 ;
}
@@ -3805,7 +3807,7 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname)
return add_dev_to_thread ( t , pkt_dev );
out2 :
- dev_put ( pkt_dev -> odev );
+ dev_put_track ( pkt_dev -> odev , & pkt_dev -> dev_tracker );
out1 :
#ifdef CONFIG_XFRM
free_SAs ( pkt_dev ); @@ -3899,7 +3901,7 @@ static int pktgen_remove_device(struct pktgen_thread *t,
/* Dis-associate from the interface */
if ( pkt_dev -> odev ) {
- dev_put ( pkt_dev -> odev );
+ dev_put_track ( pkt_dev -> odev , & pkt_dev -> dev_tracker );
pkt_dev -> odev = NULL ;
}
--
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
include/net/ax25.h | 3 +++
net/ax25/ax25_dev.c | 8 ++++----
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/include/net/ax25.h b/include/net/ax25.h
index 03d409de61ad0e7d37ba0e805a07475e40bab478..526e49589197909b459de068222c4a9cf76050ba 100644
--- a/include/net/ax25.h
+++ b/include/net/ax25.h @@ -229,7 +229,10 @@ struct ctl_table;
typedef struct ax25_dev {
struct ax25_dev * next ;
+
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
+
struct net_device * forward ;
struct ctl_table_header * sysheader ;
int values [ AX25_MAX_VALUES ]; diff --git a/net/ax25/ax25_dev.c b/net/ax25/ax25_dev.c
index d0a043a51848b3141a6e1f2a7b1ed53a51931ae3..256fadb94df3125ddc2f5ed5f8b1c91d6e243546 100644
--- a/net/ax25/ax25_dev.c
+++ b/net/ax25/ax25_dev.c @@ -58,7 +58,7 @@ void ax25_dev_device_up(struct net_device *dev)
dev -> ax25_ptr = ax25_dev ;
ax25_dev -> dev = dev ;
- dev_hold ( dev );
+ dev_hold_track ( dev , & ax25_dev -> dev_tracker , GFP_ATOMIC );
ax25_dev -> forward = NULL ;
ax25_dev -> values [ AX25_VALUES_IPDEFMODE ] = AX25_DEF_IPDEFMODE ; @@ -114,7 +114,7 @@ void ax25_dev_device_down(struct net_device *dev)
ax25_dev_list = s -> next ;
spin_unlock_bh ( & ax25_dev_lock );
dev -> ax25_ptr = NULL ;
- dev_put ( dev );
+ dev_put_track ( dev , & ax25_dev -> dev_tracker );
kfree ( ax25_dev );
return ;
} @@ -124,7 +124,7 @@ void ax25_dev_device_down(struct net_device *dev)
s -> next = ax25_dev -> next ;
spin_unlock_bh ( & ax25_dev_lock );
dev -> ax25_ptr = NULL ;
- dev_put ( dev );
+ dev_put_track ( dev , & ax25_dev -> dev_tracker );
kfree ( ax25_dev );
return ;
} @@ -188,7 +188,7 @@ void __exit ax25_dev_free(void)
ax25_dev = ax25_dev_list ;
while ( ax25_dev != NULL ) {
s = ax25_dev ;
- dev_put ( ax25_dev -> dev );
+ dev_put_track ( ax25_dev -> dev , & ax25_dev -> dev_tracker );
ax25_dev = ax25_dev -> next ;
kfree ( s );
} --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/smc/smc_pnet.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c
index 67e9d9fde08540fe1e152b85c450a0165eb37747..e171cc6483f84aac0e3cf496079a7ca57807b991 100644
--- a/net/smc/smc_pnet.c
+++ b/net/smc/smc_pnet.c @@ -64,6 +64,7 @@ struct smc_pnetentry {
struct {
char eth_name [ IFNAMSIZ + 1 ];
struct net_device * ndev ;
+ netdevice_tracker dev_tracker ;
};
struct {
char ib_name [ IB_DEVICE_NAME_MAX + 1 ]; @@ -119,7 +120,7 @@ static int smc_pnet_remove_by_pnetid(struct net *net, char *pnet_name)
smc_pnet_match ( pnetelem -> pnet_name , pnet_name )) {
list_del ( & pnetelem -> list );
if ( pnetelem -> type == SMC_PNET_ETH && pnetelem -> ndev ) {
- dev_put ( pnetelem -> ndev );
+ dev_put_track ( pnetelem -> ndev , & pnetelem -> dev_tracker );
pr_warn_ratelimited ( "smc: net device %s "
"erased user defined "
"pnetid %.16s \n " , @@ -195,7 +196,7 @@ static int smc_pnet_add_by_ndev(struct net_device *ndev)
list_for_each_entry_safe ( pnetelem , tmp_pe , & pnettable -> pnetlist , list ) {
if ( pnetelem -> type == SMC_PNET_ETH && ! pnetelem -> ndev &&
! strncmp ( pnetelem -> eth_name , ndev -> name , IFNAMSIZ )) {
- dev_hold ( ndev );
+ dev_hold_track ( ndev , & pnetelem -> dev_tracker , GFP_ATOMIC );
pnetelem -> ndev = ndev ;
rc = 0 ;
pr_warn_ratelimited ( "smc: adding net device %s with " @@ -226,7 +227,7 @@ static int smc_pnet_remove_by_ndev(struct net_device *ndev)
write_lock ( & pnettable -> lock );
list_for_each_entry_safe ( pnetelem , tmp_pe , & pnettable -> pnetlist , list ) {
if ( pnetelem -> type == SMC_PNET_ETH && pnetelem -> ndev == ndev ) {
- dev_put ( pnetelem -> ndev );
+ dev_put_track ( pnetelem -> ndev , & pnetelem -> dev_tracker );
pnetelem -> ndev = NULL ;
rc = 0 ;
pr_warn_ratelimited ( "smc: removing net device %s with " @@ -368,7 +369,7 @@ static int smc_pnet_add_eth(struct smc_pnettable *pnettable, struct net *net,
memcpy ( new_pe -> pnet_name , pnet_name , SMC_MAX_PNETID_LEN );
strncpy ( new_pe -> eth_name , eth_name , IFNAMSIZ );
new_pe -> ndev = ndev ;
-
+ netdev_tracker_alloc ( ndev , & new_pe -> dev_tracker , GFP_KERNEL );
rc = - EEXIST ;
new_netdev = true ;
write_lock ( & pnettable -> lock ); --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/ethtool/netlink.c | 8 +++++---
net/ethtool/netlink.h | 2 ++
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index 38b44c0291b11af2c6d59c532c0c4ad4bba2ce27..eaa50af074be563cdac9d700cdb0f9d32a54252c 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c @@ -141,6 +141,7 @@ int ethnl_parse_header_dev_get(struct ethnl_req_info *req_info,
}
req_info -> dev = dev ;
+ netdev_tracker_alloc ( dev , & req_info -> dev_tracker , GFP_KERNEL );
req_info -> flags = flags ;
return 0 ;
} @@ -399,7 +400,7 @@ static int ethnl_default_doit(struct sk_buff *skb, struct genl_info *info)
ops -> cleanup_data ( reply_data );
genlmsg_end ( rskb , reply_payload );
- dev_put ( req_info -> dev );
+ dev_put_track ( req_info -> dev , & req_info -> dev_tracker );
kfree ( reply_data );
kfree ( req_info );
return genlmsg_reply ( rskb , info ); @@ -411,7 +412,7 @@ static int ethnl_default_doit(struct sk_buff *skb, struct genl_info *info)
if ( ops -> cleanup_data )
ops -> cleanup_data ( reply_data );
err_dev :
- dev_put ( req_info -> dev );
+ dev_put_track ( req_info -> dev , & req_info -> dev_tracker );
kfree ( reply_data );
kfree ( req_info );
return ret ; @@ -547,7 +548,7 @@ static int ethnl_default_start(struct netlink_callback *cb)
* same parser as for non - dump ( doit ) requests is used , it
* would take reference to the device if it finds one
*/
- dev_put ( req_info -> dev );
+ dev_put_track ( req_info -> dev , & req_info -> dev_tracker );
req_info -> dev = NULL ;
}
if ( ret < 0 ) @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info -> dev = dev ;
+ netdev_tracker_alloc ( dev , & req_info -> dev_tracker , GFP_KERNEL );
req_info -> flags |= ETHTOOL_FLAG_COMPACT_BITSETS ;
ethnl_init_reply_data ( reply_data , ops , dev ); diff --git a/net/ethtool/netlink.h b/net/ethtool/netlink.h
index 490598e5eedd9a614bf64ced6be482523cad12cf..a779bbb0c524f00e7a798bc8448bebbd43b65488 100644
--- a/net/ethtool/netlink.h
+++ b/net/ethtool/netlink.h @@ -222,6 +222,7 @@ static inline unsigned int ethnl_reply_header_size(void)
/**
* struct ethnl_req_info - base type of request information for GET requests
* @ dev : network device the request is for ( may be null )
+ * @ dev_tracker : refcount tracker for @ dev reference
* @ flags : request flags common for all request types
*
* This is a common base for request specific structures holding data from @@ -230,6 +231,7 @@ static inline unsigned int ethnl_reply_header_size(void)
*/
struct ethnl_req_info {
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
u32 flags ;
};
--
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/openvswitch/vport-netdev.c | 8 ++++----
net/openvswitch/vport.h | 2 ++
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/net/openvswitch/vport-netdev.c b/net/openvswitch/vport-netdev.c
index c1ad6699b1f89d9f00ba85a9f23c89b1661ec812..b498dac4e1e0046f6a325a1cdf0afa38c95ef722 100644
--- a/net/openvswitch/vport-netdev.c
+++ b/net/openvswitch/vport-netdev.c @@ -82,7 +82,7 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
err = - ENODEV ;
goto error_free_vport ;
}
-
+ netdev_tracker_alloc ( vport -> dev , & vport -> dev_tracker , GFP_KERNEL );
if ( vport -> dev -> flags & IFF_LOOPBACK ||
( vport -> dev -> type != ARPHRD_ETHER &&
vport -> dev -> type != ARPHRD_NONE ) || @@ -115,7 +115,7 @@ struct vport *ovs_netdev_link(struct vport *vport, const char *name)
error_unlock :
rtnl_unlock ();
error_put :
- dev_put ( vport -> dev );
+ dev_put_track ( vport -> dev , & vport -> dev_tracker );
error_free_vport :
ovs_vport_free ( vport );
return ERR_PTR ( err ); @@ -137,7 +137,7 @@ static void vport_netdev_free(struct rcu_head *rcu)
{
struct vport * vport = container_of ( rcu , struct vport , rcu );
- dev_put ( vport -> dev );
+ dev_put_track ( vport -> dev , & vport -> dev_tracker );
ovs_vport_free ( vport );
}
@@ -173,7 +173,7 @@ void ovs_netdev_tunnel_destroy(struct vport *vport)
*/
if ( vport -> dev -> reg_state == NETREG_REGISTERED )
rtnl_delete_link ( vport -> dev );
- dev_put ( vport -> dev );
+ dev_put_track ( vport -> dev , & vport -> dev_tracker );
vport -> dev = NULL ;
rtnl_unlock ();
diff --git a/net/openvswitch/vport.h b/net/openvswitch/vport.h
index 8a930ca6d6b17d88c08536083c0d888cce3e99c2..9de5030d9801c7065a4cf5478cfc3778891a6535 100644
--- a/net/openvswitch/vport.h
+++ b/net/openvswitch/vport.h @@ -58,6 +58,7 @@ struct vport_portids {
/**
* struct vport - one port within a datapath
* @ dev : Pointer to net_device .
+ * @ dev_tracker : refcount tracker for @ dev reference
* @ dp : Datapath to which this port belongs .
* @ upcall_portids : RCU protected ' struct vport_portids ' .
* @ port_no : Index into @ dp ' s @ ports array . @@ -69,6 +70,7 @@ struct vport_portids {
*/
struct vport {
struct net_device * dev ;
+ netdevice_tracker dev_tracker ;
struct datapath * dp ;
struct vport_portids __rcu * upcall_portids ;
u16 port_no ; --
2.34.1.400.ga245620fadb-goog
From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
include/net/tc_act/tc_mirred.h | 1 +
net/sched/act_mirred.c | 18 ++++++++++--------
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/include/net/tc_act/tc_mirred.h b/include/net/tc_act/tc_mirred.h
index 1cace4c69e4450963e5392a555d7b3fd9f10456d..32ce8ea36950e86745cc1d31f49e69962ff2c6ee 100644
--- a/include/net/tc_act/tc_mirred.h
+++ b/include/net/tc_act/tc_mirred.h @@ -10,6 +10,7 @@ struct tcf_mirred {
int tcfm_eaction ;
bool tcfm_mac_header_xmit ;
struct net_device __rcu * tcfm_dev ;
+ netdevice_tracker tcfm_dev_tracker ;
struct list_head tcfm_list ;
};
#define to_mirred(a) ((struct tcf_mirred *)a) diff --git a/net/sched/act_mirred.c b/net/sched/act_mirred.c
index efc963ab995a333ab21ec3d00884097c6a10a2b4..952416bd65e6ae00fe048a32b37252d1ed13ef0a 100644
--- a/net/sched/act_mirred.c
+++ b/net/sched/act_mirred.c @@ -79,7 +79,7 @@ static void tcf_mirred_release(struct tc_action *a)
/* last reference to action, no need to lock */
dev = rcu_dereference_protected ( m -> tcfm_dev , 1 );
- dev_put ( dev );
+ dev_put_track ( dev , & m -> tcfm_dev_tracker );
}
static const struct nla_policy mirred_policy [ TCA_MIRRED_MAX + 1 ] = { @@ -101,7 +101,6 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
bool mac_header_xmit = false ;
struct tc_mirred * parm ;
struct tcf_mirred * m ;
- struct net_device * dev ;
bool exists = false ;
int ret , err ;
u32 index ; @@ -171,16 +170,19 @@ static int tcf_mirred_init(struct net *net, struct nlattr *nla,
spin_lock_bh ( & m -> tcf_lock );
if ( parm -> ifindex ) {
- dev = dev_get_by_index ( net , parm -> ifindex );
- if ( ! dev ) {
+ struct net_device * odev , * ndev ;
+
+ ndev = dev_get_by_index ( net , parm -> ifindex );
+ if ( ! ndev ) {
spin_unlock_bh ( & m -> tcf_lock );
err = - ENODEV ;
goto put_chain ;
}
- mac_header_xmit = dev_is_mac_header_xmit ( dev );
- dev = rcu_replace_pointer ( m -> tcfm_dev , dev ,
+ mac_header_xmit = dev_is_mac_header_xmit ( ndev );
+ odev = rcu_replace_pointer ( m -> tcfm_dev , ndev ,
lockdep_is_held ( & m -> tcf_lock ));
- dev_put ( dev );
+ dev_put_track ( odev , & m -> tcfm_dev_tracker );
+ netdev_tracker_alloc ( ndev , & m -> tcfm_dev_tracker , GFP_ATOMIC );
m -> tcfm_mac_header_xmit = mac_header_xmit ;
}
goto_ch = tcf_action_set_ctrlact ( * a , parm -> action , goto_ch ); @@ -400,7 +402,7 @@ static int mirred_device_event(struct notifier_block *unused,
list_for_each_entry ( m , & mirred_list , tcfm_list ) {
spin_lock_bh ( & m -> tcf_lock );
if ( tcf_mirred_dev_dereference ( m ) == dev ) {
- dev_put ( dev );
+ dev_put_track ( dev , & m -> tcfm_dev_tracker );
/* Note : no rcu grace period necessary, as
* net_device are already rcu protected .
*/ --
2.34.1.400.ga245620fadb-goog
Hello:
This series was applied to netdev/net-next.git (master)
by Jakub Kicinski [off-list ref]:
On Mon, 6 Dec 2021 17:30:26 -0800 you wrote: From: Eric Dumazet <redacted>
The most interesting part of this series is probably
("inet: add net device refcount tracker to struct fib_nh_common")
but only future reports will confirm this guess.
Eric Dumazet (13):
net: eql: add net device refcount tracker
vlan: add net device refcount tracker
net: bridge: add net device refcount tracker
net: watchdog: add net device refcount tracker
net: switchdev: add net device refcount tracker
inet: add net device refcount tracker to struct fib_nh_common
ax25: add net device refcount tracker
llc: add net device refcount tracker
pktgen add net device refcount tracker
net/smc: add net device tracker to struct smc_pnetentry
netlink: add net device refcount tracker to struct ethnl_req_info
openvswitch: add net device refcount tracker to struct vport
net: sched: act_mirred: add net device refcount tracker
[...]
Here is the summary with links:
- [net-next,01/13] net: eql: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/08f0b22d731f
- [net-next,02/13] vlan: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/19c9ebf6ed70
- [net-next,03/13] net: bridge: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/b2dcdc7f731d
- [net-next,04/13] net: watchdog: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/f12bf6f3f942
- [net-next,05/13] net: switchdev: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/4fc003fe0313
- [net-next,06/13] inet: add net device refcount tracker to struct fib_nh_common
https://git.kernel.org/netdev/net-next/c/e44b14ebae10
- [net-next,07/13] ax25: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/66ce07f7802b
- [net-next,08/13] llc: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/615d069dcf12
- [net-next,09/13] pktgen add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/035f1f2b96ae
- [net-next,10/13] net/smc: add net device tracker to struct smc_pnetentry
https://git.kernel.org/netdev/net-next/c/b60645248af3
- [net-next,11/13] netlink: add net device refcount tracker to struct ethnl_req_info
https://git.kernel.org/netdev/net-next/c/e4b8954074f6
- [net-next,12/13] openvswitch: add net device refcount tracker to struct vport
https://git.kernel.org/netdev/net-next/c/e7c8ab8419d7
- [net-next,13/13] net: sched: act_mirred: add net device refcount tracker
https://git.kernel.org/netdev/net-next/c/ada066b2e02c
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
On 07/12/2021 02:30, Eric Dumazet wrote: From: Eric Dumazet <redacted>
Signed-off-by: Eric Dumazet <redacted>
---
net/smc/smc_pnet.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
Acked-by: Karsten Graul <redacted>
On Mon, 2021-12-06 at 17:30 -0800, Eric Dumazet wrote: quoted hunk @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
+ netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
I may have missed a follow-up patch (did a search on netdev now, but
...), but I'm hitting warnings from this and I'm not sure it's right?
This req_info is just allocated briefly and freed again, and I'm not
even sure there's a dev_get/dev_put involved here, I didn't see any?
At least it would seem we need to free the tracker at the end of this
function, or perhaps never even create one?
johannes
On Tue, Jan 4, 2022 at 7:29 AM Johannes Berg [off-list ref] wrote:
On Mon, 2021-12-06 at 17:30 -0800, Eric Dumazet wrote: quoted @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
+ netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
I may have missed a follow-up patch (did a search on netdev now, but
...), but I'm hitting warnings from this and I'm not sure it's right?
This req_info is just allocated briefly and freed again, and I'm not
even sure there's a dev_get/dev_put involved here, I didn't see any?
We had a fix.
commit 34ac17ecbf575eb079094d44f1bd30c66897aa21
Author: Eric Dumazet [off-list ref]
Date: Tue Dec 14 00:42:30 2021 -0800
ethtool: use ethnl_parse_header_dev_put()
At least it would seem we need to free the tracker at the end of this
function, or perhaps never even create one?
johannes
Hi Eric,
quoted quoted @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
+ netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
I may have missed a follow-up patch (did a search on netdev now, but
...), but I'm hitting warnings from this and I'm not sure it's right?
This req_info is just allocated briefly and freed again, and I'm not
even sure there's a dev_get/dev_put involved here, I didn't see any?
We had a fix.
commit 34ac17ecbf575eb079094d44f1bd30c66897aa21
Author: Eric Dumazet [off-list ref]
Date: Tue Dec 14 00:42:30 2021 -0800
ethtool: use ethnl_parse_header_dev_put()
Hmm. I have this in my tree, and I don't think it affected
ethnl_default_notify() anyway?
johannes
On Tue, Jan 4, 2022 at 8:07 AM Johannes Berg [off-list ref] wrote:
Hi Eric,
quoted quoted quoted @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
+ netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
I may have missed a follow-up patch (did a search on netdev now, but
...), but I'm hitting warnings from this and I'm not sure it's right?
This req_info is just allocated briefly and freed again, and I'm not
even sure there's a dev_get/dev_put involved here, I didn't see any?
We had a fix.
commit 34ac17ecbf575eb079094d44f1bd30c66897aa21
Author: Eric Dumazet [off-list ref]
Date: Tue Dec 14 00:42:30 2021 -0800
ethtool: use ethnl_parse_header_dev_put()
Hmm. I have this in my tree, and I don't think it affected
ethnl_default_notify() anyway?
Strange, syzbot have not reported anything there.
ethnl_parse_header_dev_get() needs to take a ref, but
indeed ethnl_default_notify() does its own allocation/freeing.
diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index ea23659fab28..5fe8f4ae2ceb 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c @@ -627,7 +627,6 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
- netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
ethnl_init_reply_data(reply_data, ops, dev);
On Tue, 2022-01-04 at 08:22 -0800, Eric Dumazet wrote: On Tue, Jan 4, 2022 at 8:07 AM Johannes Berg [off-list ref] wrote: quoted
Hi Eric,
quoted quoted quoted @@ -624,6 +625,7 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
+ netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
req_info->flags |= ETHTOOL_FLAG_COMPACT_BITSETS;
I may have missed a follow-up patch (did a search on netdev now, but
...), but I'm hitting warnings from this and I'm not sure it's right?
This req_info is just allocated briefly and freed again, and I'm not
even sure there's a dev_get/dev_put involved here, I didn't see any?
We had a fix.
commit 34ac17ecbf575eb079094d44f1bd30c66897aa21
Author: Eric Dumazet [off-list ref]
Date: Tue Dec 14 00:42:30 2021 -0800
ethtool: use ethnl_parse_header_dev_put()
Hmm. I have this in my tree, and I don't think it affected
ethnl_default_notify() anyway?
Strange, syzbot have not reported anything there.
:)
Not sure - I'm hitting it in one of the wireless bridging tests.
ethnl_parse_header_dev_get() needs to take a ref, but
indeed ethnl_default_notify() does its own allocation/freeing.
Right.
quoted hunk diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index ea23659fab28..5fe8f4ae2ceb 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c @@ -627,7 +627,6 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
- netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
So I had already tested both this and explicitly doing
netdev_tracker_free() when req_info is freed, both work fine.
Tested-by: Johannes Berg <johannes@sipsolutions.net>
Just wasn't sure it was correct or I was missing something. :)
johannes
On Tue, 04 Jan 2022 17:23:51 +0100 Johannes Berg wrote: quoted diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index ea23659fab28..5fe8f4ae2ceb 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c @@ -627,7 +627,6 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
- netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
So I had already tested both this and explicitly doing
netdev_tracker_free() when req_info is freed, both work fine.
Tested-by: Johannes Berg <johannes@sipsolutions.net>
Just wasn't sure it was correct or I was missing something. :)
Hi Eric, I didn't see this one submitted, is it coming?
No rush, just checking if it fell thru the cracks.
On Wed, Jan 5, 2022 at 8:57 AM Jakub Kicinski [off-list ref] wrote:
On Tue, 04 Jan 2022 17:23:51 +0100 Johannes Berg wrote: quoted quoted diff --git a/net/ethtool/netlink.c b/net/ethtool/netlink.c
index ea23659fab28..5fe8f4ae2ceb 100644
--- a/net/ethtool/netlink.c
+++ b/net/ethtool/netlink.c @@ -627,7 +627,6 @@ static void ethnl_default_notify(struct net_device *dev, unsigned int cmd,
}
req_info->dev = dev;
- netdev_tracker_alloc(dev, &req_info->dev_tracker, GFP_KERNEL);
So I had already tested both this and explicitly doing
netdev_tracker_free() when req_info is freed, both work fine.
Tested-by: Johannes Berg <johannes@sipsolutions.net>
Just wasn't sure it was correct or I was missing something. :)
Hi Eric, I didn't see this one submitted, is it coming?
No rush, just checking if it fell thru the cracks.
Yes, this is coming ;)