Skip to content

Commit 44f1877

Browse files
kuba-moovijay-suman
authored andcommitted
net: netdevsim: try to close UDP port harness races
[ Upstream commit 50bf398 ] syzbot discovered that we remove the debugfs files after we free the netdev. Try to clean up the relevant dir while the device is still around. Reported-by: [email protected] Fixes: 424be63 ("netdevsim: add UDP tunnel port offload support") Reviewed-by: Michal Swiatkowski <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit cfb17f637562e15066480e7eaa23b3a8854f29e5) Signed-off-by: Vijayendra Suman <[email protected]>
1 parent 572a477 commit 44f1877

File tree

3 files changed

+23
-17
lines changed

3 files changed

+23
-17
lines changed

drivers/net/netdevsim/netdevsim.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ struct netdevsim {
118118
u32 sleep;
119119
u32 __ports[2][NSIM_UDP_TUNNEL_N_PORTS];
120120
u32 (*ports)[NSIM_UDP_TUNNEL_N_PORTS];
121+
struct dentry *ddir;
121122
struct debugfs_u32_array dfs_ports[2];
122123
} udp_ports;
123124

drivers/net/netdevsim/udp_tunnels.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,11 @@ nsim_udp_tunnels_info_reset_write(struct file *file, const char __user *data,
112112
struct net_device *dev = file->private_data;
113113
struct netdevsim *ns = netdev_priv(dev);
114114

115-
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
116115
rtnl_lock();
117-
udp_tunnel_nic_reset_ntf(dev);
116+
if (dev->reg_state == NETREG_REGISTERED) {
117+
memset(ns->udp_ports.ports, 0, sizeof(ns->udp_ports.__ports));
118+
udp_tunnel_nic_reset_ntf(dev);
119+
}
118120
rtnl_unlock();
119121

120122
return count;
@@ -144,23 +146,23 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
144146
else
145147
ns->udp_ports.ports = nsim_dev->udp_ports.__ports;
146148

147-
debugfs_create_u32("udp_ports_inject_error", 0600,
148-
ns->nsim_dev_port->ddir,
149+
ns->udp_ports.ddir = debugfs_create_dir("udp_ports",
150+
ns->nsim_dev_port->ddir);
151+
152+
debugfs_create_u32("inject_error", 0600, ns->udp_ports.ddir,
149153
&ns->udp_ports.inject_error);
150154

151155
ns->udp_ports.dfs_ports[0].array = ns->udp_ports.ports[0];
152156
ns->udp_ports.dfs_ports[0].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
153-
debugfs_create_u32_array("udp_ports_table0", 0400,
154-
ns->nsim_dev_port->ddir,
157+
debugfs_create_u32_array("table0", 0400, ns->udp_ports.ddir,
155158
&ns->udp_ports.dfs_ports[0]);
156159

157160
ns->udp_ports.dfs_ports[1].array = ns->udp_ports.ports[1];
158161
ns->udp_ports.dfs_ports[1].n_elements = NSIM_UDP_TUNNEL_N_PORTS;
159-
debugfs_create_u32_array("udp_ports_table1", 0400,
160-
ns->nsim_dev_port->ddir,
162+
debugfs_create_u32_array("table1", 0400, ns->udp_ports.ddir,
161163
&ns->udp_ports.dfs_ports[1]);
162164

163-
debugfs_create_file("udp_ports_reset", 0200, ns->nsim_dev_port->ddir,
165+
debugfs_create_file("reset", 0200, ns->udp_ports.ddir,
164166
dev, &nsim_udp_tunnels_info_reset_fops);
165167

166168
/* Note: it's not normal to allocate the info struct like this!
@@ -196,6 +198,9 @@ int nsim_udp_tunnels_info_create(struct nsim_dev *nsim_dev,
196198

197199
void nsim_udp_tunnels_info_destroy(struct net_device *dev)
198200
{
201+
struct netdevsim *ns = netdev_priv(dev);
202+
203+
debugfs_remove_recursive(ns->udp_ports.ddir);
199204
kfree(dev->udp_tunnel_nic_info);
200205
dev->udp_tunnel_nic_info = NULL;
201206
}

tools/testing/selftests/drivers/net/netdevsim/udp_tunnel_nic.sh

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ function pre_ethtool {
142142
}
143143

144144
function check_table {
145-
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
145+
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
146146
local -n expected=$2
147147
local last=$3
148148

@@ -212,7 +212,7 @@ function check_tables {
212212
}
213213

214214
function print_table {
215-
local path=$NSIM_DEV_DFS/ports/$port/udp_ports_table$1
215+
local path=$NSIM_DEV_DFS/ports/$port/udp_ports/table$1
216216
read -a have < $path
217217

218218
tree $NSIM_DEV_DFS/
@@ -640,7 +640,7 @@ for port in 0 1; do
640640
NSIM_NETDEV=`get_netdev_name old_netdevs`
641641
ifconfig $NSIM_NETDEV up
642642

643-
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
643+
echo 110 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
644644

645645
msg="1 - create VxLANs v6"
646646
exp0=( 0 0 0 0 )
@@ -662,7 +662,7 @@ for port in 0 1; do
662662
new_geneve gnv0 20000
663663

664664
msg="2 - destroy GENEVE"
665-
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports_inject_error
665+
echo 2 > $NSIM_DEV_DFS/ports/$port/udp_ports/inject_error
666666
exp1=( `mke 20000 2` 0 0 0 )
667667
del_dev gnv0
668668

@@ -763,7 +763,7 @@ for port in 0 1; do
763763
msg="create VxLANs v4"
764764
new_vxlan vxlan0 10000 $NSIM_NETDEV
765765

766-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
766+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
767767
check_tables
768768

769769
msg="NIC device goes down"
@@ -774,7 +774,7 @@ for port in 0 1; do
774774
fi
775775
check_tables
776776

777-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
777+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
778778
check_tables
779779

780780
msg="NIC device goes up again"
@@ -788,7 +788,7 @@ for port in 0 1; do
788788
del_dev vxlan0
789789
check_tables
790790

791-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
791+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
792792
check_tables
793793

794794
msg="destroy NIC"
@@ -895,7 +895,7 @@ msg="vacate VxLAN in overflow table"
895895
exp0=( `mke 10000 1` `mke 10004 1` 0 `mke 10003 1` )
896896
del_dev vxlan2
897897

898-
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports_reset
898+
echo 1 > $NSIM_DEV_DFS/ports/$port/udp_ports/reset
899899
check_tables
900900

901901
msg="tunnels destroyed 2"

0 commit comments

Comments
 (0)