Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: netdevsim: Add test cases for route deletion failure

Add IPv4 and IPv6 test cases that ensure that we are not leaking a
reference on the nexthop device when we are unable to delete its
associated route.

Without the fix in a previous patch ("netdevsim: fib: Fix reference
count leak on route deletion failure") both test cases get stuck,
waiting for the reference to be released from the dummy device [1][2].

[1]
unregister_netdevice: waiting for dummy1 to become free. Usage count = 5
leaked reference.
fib_check_nh+0x275/0x620
fib_create_info+0x237c/0x4d30
fib_table_insert+0x1dd/0x1d20
inet_rtm_newroute+0x11b/0x200
rtnetlink_rcv_msg+0x43b/0xd20
netlink_rcv_skb+0x15e/0x430
netlink_unicast+0x53b/0x800
netlink_sendmsg+0x945/0xe40
____sys_sendmsg+0x747/0x960
___sys_sendmsg+0x11d/0x190
__sys_sendmsg+0x118/0x1e0
do_syscall_64+0x34/0x80
entry_SYSCALL_64_after_hwframe+0x63/0xcd

[2]
unregister_netdevice: waiting for dummy1 to become free. Usage count = 5
leaked reference.
fib6_nh_init+0xc46/0x1ca0
ip6_route_info_create+0x1167/0x19a0
ip6_route_add+0x27/0x150
inet6_rtm_newroute+0x161/0x170
rtnetlink_rcv_msg+0x43b/0xd20
netlink_rcv_skb+0x15e/0x430
netlink_unicast+0x53b/0x800
netlink_sendmsg+0x945/0xe40
____sys_sendmsg+0x747/0x960
___sys_sendmsg+0x11d/0x190
__sys_sendmsg+0x118/0x1e0
do_syscall_64+0x34/0x80
entry_SYSCALL_64_after_hwframe+0x63/0xcd

Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: David Ahern <dsahern@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Ido Schimmel and committed by
David S. Miller
40823f3e 974be75f

+45
+45
tools/testing/selftests/drivers/net/netdevsim/fib.sh
··· 16 16 ipv4_replay 17 17 ipv4_flush 18 18 ipv4_error_path 19 + ipv4_delete_fail 19 20 ipv6_add 20 21 ipv6_metric 21 22 ipv6_append_single ··· 30 29 ipv6_replay_single 31 30 ipv6_replay_multipath 32 31 ipv6_error_path 32 + ipv6_delete_fail 33 33 " 34 34 NETDEVSIM_PATH=/sys/bus/netdevsim/ 35 35 DEV_ADDR=1337 36 36 DEV=netdevsim${DEV_ADDR} 37 37 SYSFS_NET_DIR=/sys/bus/netdevsim/devices/$DEV/net/ 38 + DEBUGFS_DIR=/sys/kernel/debug/netdevsim/$DEV/ 38 39 NUM_NETIFS=0 39 40 source $lib_dir/lib.sh 40 41 source $lib_dir/fib_offload_lib.sh ··· 158 155 # of the "IPv4/fib" resource. 159 156 ipv4_error_path_add 160 157 ipv4_error_path_replay 158 + } 159 + 160 + ipv4_delete_fail() 161 + { 162 + RET=0 163 + 164 + echo "y" > $DEBUGFS_DIR/fib/fail_route_delete 165 + 166 + ip -n testns1 link add name dummy1 type dummy 167 + ip -n testns1 link set dev dummy1 up 168 + 169 + ip -n testns1 route add 192.0.2.0/24 dev dummy1 170 + ip -n testns1 route del 192.0.2.0/24 dev dummy1 &> /dev/null 171 + 172 + # We should not be able to delete the netdev if we are leaking a 173 + # reference. 174 + ip -n testns1 link del dev dummy1 175 + 176 + log_test "IPv4 route delete failure" 177 + 178 + echo "n" > $DEBUGFS_DIR/fib/fail_route_delete 161 179 } 162 180 163 181 ipv6_add() ··· 326 302 ipv6_error_path_add_single 327 303 ipv6_error_path_add_multipath 328 304 ipv6_error_path_replay 305 + } 306 + 307 + ipv6_delete_fail() 308 + { 309 + RET=0 310 + 311 + echo "y" > $DEBUGFS_DIR/fib/fail_route_delete 312 + 313 + ip -n testns1 link add name dummy1 type dummy 314 + ip -n testns1 link set dev dummy1 up 315 + 316 + ip -n testns1 route add 2001:db8:1::/64 dev dummy1 317 + ip -n testns1 route del 2001:db8:1::/64 dev dummy1 &> /dev/null 318 + 319 + # We should not be able to delete the netdev if we are leaking a 320 + # reference. 321 + ip -n testns1 link del dev dummy1 322 + 323 + log_test "IPv6 route delete failure" 324 + 325 + echo "n" > $DEBUGFS_DIR/fib/fail_route_delete 329 326 } 330 327 331 328 fib_notify_on_flag_change_set()