Whamcloud - gitweb
LU-17460 lnet: properly handle net_device referencing 82/55582/5
authorJames Simmons <jsimmons@infradead.org>
Mon, 8 Jul 2024 20:20:52 +0000 (16:20 -0400)
committerOleg Drokin <green@whamcloud.com>
Sat, 13 Jul 2024 20:54:05 +0000 (20:54 +0000)
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 <jsimmons@infradead.org>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55582
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lnet/klnds/socklnd/socklnd.c
lnet/lnet/lib-socket.c
lustre/tests/sanity-lnet.sh

index 0c0ba02..8ed664f 100644 (file)
@@ -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;
 
index 7eb8dc5..d44d8dd 100644 (file)
@@ -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;
index 7590b12..2e5036b 100755 (executable)
@@ -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