From 25ad71fa9e5be305b16948174240c1c50bf4d7e5 Mon Sep 17 00:00:00 2001 From: James Simmons Date: Mon, 8 Jul 2024 16:20:52 -0400 Subject: [PATCH] LU-17460 lnet: properly handle net_device referencing Most of the time LNet uses __in[6]_dev_get_xxx() which does no reference changes. The one expection is the use of dev_get_by_index() called in lnet_create_socket(). Replace dev_get_by_index() with dev_get_by_index_rcu(). Also examined the code to make sure the right type of locking was done. If we use rcu locking we should use for_each_netdev_rcu() so update ksocknal_ip2index(). Test-Parameters: trivial testlist=sanity-lnet Fixes: e4fa181abf1 ("LU-10391 lnet: allow creation of IPv6 socket.") Fixes: 09c6e2b8722 ("LU-16836 lnet: ensure dev notification on lnd startup") Change-Id: I0c496652553318bd0e47fa1e03d6e631fd8421bb Signed-off-by: James Simmons Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55582 Reviewed-by: Chris Horn Reviewed-by: Serguei Smirnov Reviewed-by: Oleg Drokin Tested-by: jenkins Tested-by: Maloo --- lnet/klnds/socklnd/socklnd.c | 2 +- lnet/lnet/lib-socket.c | 17 ++++++++++++----- lustre/tests/sanity-lnet.sh | 3 --- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/lnet/klnds/socklnd/socklnd.c b/lnet/klnds/socklnd/socklnd.c index 0c0ba02..8ed664f 100644 --- a/lnet/klnds/socklnd/socklnd.c +++ b/lnet/klnds/socklnd/socklnd.c @@ -37,7 +37,7 @@ static int ksocknal_ip2index(struct sockaddr *addr, struct lnet_ni *ni, return ret; rcu_read_lock(); - for_each_netdev(ni->ni_net_ns, dev) { + for_each_netdev_rcu(ni->ni_net_ns, dev) { int flags = dev_get_flags(dev); struct in_device *in_dev; diff --git a/lnet/lnet/lib-socket.c b/lnet/lnet/lib-socket.c index 7eb8dc5..d44d8dd 100644 --- a/lnet/lnet/lib-socket.c +++ b/lnet/lnet/lib-socket.c @@ -264,12 +264,19 @@ retry: if (interface >= 0 && remaddr) { struct sockaddr_in6 *rem = (void *)remaddr; - - ipv6_dev_get_saddr(ns, - dev_get_by_index(ns, - interface), - &rem->sin6_addr, 0, + struct net_device *dev; + + rcu_read_lock(); + dev = dev_get_by_index_rcu(ns, interface); + if (!dev) { + CERROR("No net device for interface %d\n", + interface); + rcu_read_unlock(); + goto failed; + } + ipv6_dev_get_saddr(ns, dev, &rem->sin6_addr, 0, &sin6->sin6_addr); + rcu_read_unlock(); } sin6->sin6_port = htons(local_port); break; diff --git a/lustre/tests/sanity-lnet.sh b/lustre/tests/sanity-lnet.sh index 7590b12..2e5036b 100755 --- a/lustre/tests/sanity-lnet.sh +++ b/lustre/tests/sanity-lnet.sh @@ -328,14 +328,11 @@ if [[ $NETTYPE =~ (tcp|o2ib)[0-9]* ]]; then always_except LU-14288 103 always_except LU-17457 208 always_except LU-9680 213 - always_except LU-17460 214 always_except LU-17458 220 always_except LU-5960 230 always_except LU-9680 231 always_except LU-17457 255 always_except LU-9680 302 - always_except LU-17460 303 - always_except LU-17460 500 FAKE_NID="${FAKE_IPV6}@tcp" else -- 1.8.3.1