mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 05:04:02 +02:00
RDMA/core: Make device names unique per net namespace
Use rdma_dev_access_netns() to scope RDMA device name lookup and "%d" name allocation to the relevant net namespace. Keep shared mode and CONFIG_NET_NS=n behaviour system-wide. Signed-off-by: Jiri Pirko <jiri@nvidia.com> Link: https://patch.msgid.link/20260716132316.1495242-12-jiri@resnulli.us Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
parent
4ad1fe8e25
commit
625ca0d94c
|
|
@ -129,7 +129,7 @@ static DECLARE_RWSEM(rdma_nets_rwsem);
|
|||
bool ib_devices_shared_netns = true;
|
||||
module_param_named(netns_mode, ib_devices_shared_netns, bool, 0444);
|
||||
MODULE_PARM_DESC(netns_mode,
|
||||
"Share device among net namespaces; default=1 (shared)");
|
||||
"Share device among net namespaces; default=1 (shared). In exclusive mode device names are unique per net namespace");
|
||||
/**
|
||||
* rdma_dev_access_netns() - Return whether an rdma device can be accessed
|
||||
* from a specified net namespace or not.
|
||||
|
|
@ -359,7 +359,8 @@ static struct ib_device *__ib_device_get_by_name(const char *name,
|
|||
unsigned long index;
|
||||
|
||||
xa_for_each (&devices, index, device)
|
||||
if (!strcmp(name, dev_name(&device->dev)))
|
||||
if (rdma_dev_access_netns(device, net) &&
|
||||
!strcmp(name, dev_name(&device->dev)))
|
||||
return device;
|
||||
|
||||
return NULL;
|
||||
|
|
@ -437,7 +438,11 @@ int ib_device_set_dim(struct ib_device *ibdev, u8 use_dim)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Pick a free index for the '%d' style @name pattern. */
|
||||
/*
|
||||
* Pick a free index for the '%d' style @name pattern within net namespace
|
||||
* @net. Returns the index on success or a negative errno. The caller builds
|
||||
* the final unique device name from the returned index.
|
||||
*/
|
||||
static int __alloc_name_id(struct net *net, const char *name,
|
||||
const struct ib_device *skip)
|
||||
{
|
||||
|
|
@ -452,7 +457,7 @@ static int __alloc_name_id(struct net *net, const char *name,
|
|||
xa_for_each (&devices, index, device) {
|
||||
char buf[IB_DEVICE_NAME_MAX];
|
||||
|
||||
if (device == skip)
|
||||
if (device == skip || !rdma_dev_access_netns(device, net))
|
||||
continue;
|
||||
if (sscanf(dev_name(&device->dev), name, &i) != 1)
|
||||
continue;
|
||||
|
|
@ -1233,7 +1238,8 @@ static __net_init int rdma_dev_init_net(struct net *net)
|
|||
}
|
||||
|
||||
/*
|
||||
* Assign the unique string device name and the unique device index. This is
|
||||
* Assign the unique string device name and the unique device index. The device
|
||||
* name is unique within the net namespace the device is assigned to. This is
|
||||
* undone by ib_dealloc_device.
|
||||
*/
|
||||
static int assign_name(struct ib_device *device, const char *name)
|
||||
|
|
@ -1416,8 +1422,9 @@ static void ib_device_notify_register(struct ib_device *device)
|
|||
/**
|
||||
* ib_register_device - Register an IB device with IB core
|
||||
* @device: Device to register
|
||||
* @name: unique string device name. This may include a '%' which will
|
||||
* cause a unique index to be added to the passed device name.
|
||||
* @name: device name, unique within the device's net namespace. This may
|
||||
* include a '%' which will cause a unique index to be added to the
|
||||
* passed device name.
|
||||
* @dma_device: pointer to a DMA-capable device. If %NULL, then the IB
|
||||
* device will be used. In this case the caller should fully
|
||||
* setup the ibdev for DMA. This usually means using dma_virt_ops.
|
||||
|
|
@ -1708,6 +1715,7 @@ static bool rdma_dev_name_in_netns(struct ib_device *skip, struct net *net,
|
|||
|
||||
xa_for_each(&devices, index, device)
|
||||
if (device != skip &&
|
||||
rdma_dev_access_netns(device, net) &&
|
||||
!strcmp(name, dev_name(&device->dev)))
|
||||
return true;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user