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>
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;
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;
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