This function returns the namespace of a struct ib_device if the RDMA subsystem is in exclusive network namespace mode. If the subsystem is in shared namespace mode, this function returns NULL. Signed-off-by: Ka-Cheong Poon <ka-cheong.poon@xxxxxxxxxx> --- drivers/infiniband/core/device.c | 16 ++++++++++++++++ include/rdma/ib_verbs.h | 1 + 2 files changed, 17 insertions(+) diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index c36b4d2b61e0..a3dd95bf3050 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c @@ -144,6 +144,22 @@ bool rdma_dev_access_netns(const struct ib_device *dev, const struct net *net) } EXPORT_SYMBOL(rdma_dev_access_netns); +/** + * rdma_dev_to_netns() - Return the net namespace of a given device if the + * RDMA subsystem is in exclusive network namespace + * mode. If it is in shared namespace mode, this + * function returns NULL. Caller can use it to + * differentiate the two modes of the RDMA subsystem. + * + * @device: Pointer to rdma device to get the namespace + */ +struct net *rdma_dev_to_netns(const struct ib_device *device) +{ + return ib_devices_shared_netns ? NULL : + read_pnet(&device->coredev.rdma_net); +} +EXPORT_SYMBOL(rdma_dev_to_netns); + /* * xarray has this behavior where it won't iterate over NULL values stored in * allocated arrays. So we need our own iterator to see all values stored in diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index c0b2fa7e9b95..aeced1a3324f 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -4715,6 +4715,7 @@ static inline struct ib_device *rdma_device_to_ibdev(struct device *device) bool rdma_dev_access_netns(const struct ib_device *device, const struct net *net); +struct net *rdma_dev_to_netns(const struct ib_device *device); #define IB_ROCE_UDP_ENCAP_VALID_PORT_MIN (0xC000) #define IB_GRH_FLOWLABEL_MASK (0x000FFFFF) -- 2.18.4