Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5417783e authored by Parav Pandit's avatar Parav Pandit Committed by Jason Gunthorpe
Browse files

RDMA/core: Support core port attributes in non init_net



Now that sysfs compatibility layer for non init_net exists, add core port
attributes such as pkey and gid table to non init_net ns.

Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
parent 4e0f7b90
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -336,4 +336,8 @@ int roce_resolve_route_from_path(struct sa_path_rec *rec,
				 const struct ib_gid_attr *attr);

struct net_device *rdma_read_gid_attr_ndev_rcu(const struct ib_gid_attr *attr);

void ib_free_port_attrs(struct ib_core_device *coredev);
int ib_setup_port_attrs(struct ib_core_device *coredev,
			bool alloc_hw_stats);
#endif /* _CORE_PRIV_H */
+6 −0
Original line number Diff line number Diff line
@@ -773,6 +773,9 @@ static int add_one_compat_dev(struct ib_device *device,
	ret = device_add(&cdev->dev);
	if (ret)
		goto add_err;
	ret = ib_setup_port_attrs(cdev, false);
	if (ret)
		goto port_err;

	ret = xa_err(xa_store(&device->compat_devs, rnet->id,
			      cdev, GFP_KERNEL));
@@ -783,6 +786,8 @@ static int add_one_compat_dev(struct ib_device *device,
	return 0;

insert_err:
	ib_free_port_attrs(cdev);
port_err:
	device_del(&cdev->dev);
add_err:
	put_device(&cdev->dev);
@@ -801,6 +806,7 @@ static void remove_one_compat_dev(struct ib_device *device, u32 id)
	cdev = xa_erase(&device->compat_devs, id);
	mutex_unlock(&device->compat_devs_mutex);
	if (cdev) {
		ib_free_port_attrs(cdev);
		device_del(&cdev->dev);
		put_device(&cdev->dev);
	}
+8 −7
Original line number Diff line number Diff line
@@ -1015,7 +1015,8 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port,
	return;
}

static int add_port(struct ib_core_device *coredev, int port_num)
static int add_port(struct ib_core_device *coredev,
		    int port_num, bool alloc_stats)
{
	struct ib_device *device = rdma_device_to_ibdev(&coredev->dev);
	struct ib_port *p;
@@ -1056,7 +1057,7 @@ static int add_port(struct ib_core_device *coredev, int port_num)
		goto err_put;
	}

	if (device->ops.process_mad) {
	if (device->ops.process_mad && alloc_stats) {
		p->pma_table = get_counter_table(device, port_num);
		ret = sysfs_create_group(&p->kobj, p->pma_table);
		if (ret)
@@ -1123,7 +1124,7 @@ static int add_port(struct ib_core_device *coredev, int port_num)
	 * port, so holder should be device. Therefore skip per port conunter
	 * initialization.
	 */
	if (device->ops.alloc_hw_stats && port_num)
	if (device->ops.alloc_hw_stats && port_num && alloc_stats)
		setup_hw_stats(device, p, port_num);

	list_add_tail(&p->kobj.entry, &coredev->port_list);
@@ -1280,7 +1281,7 @@ const struct attribute_group ib_dev_attr_group = {
	.attrs = ib_dev_attrs,
};

static void ib_free_port_attrs(struct ib_core_device *coredev)
void ib_free_port_attrs(struct ib_core_device *coredev)
{
	struct kobject *p, *t;

@@ -1307,7 +1308,7 @@ static void ib_free_port_attrs(struct ib_core_device *coredev)
	kobject_put(coredev->ports_kobj);
}

static int ib_setup_port_attrs(struct ib_core_device *coredev)
int ib_setup_port_attrs(struct ib_core_device *coredev, bool alloc_stats)
{
	struct ib_device *device = rdma_device_to_ibdev(&coredev->dev);
	unsigned int port;
@@ -1319,7 +1320,7 @@ static int ib_setup_port_attrs(struct ib_core_device *coredev)
		return -ENOMEM;

	rdma_for_each_port (device, port) {
		ret = add_port(coredev, port);
		ret = add_port(coredev, port, alloc_stats);
		if (ret)
			goto err_put;
	}
@@ -1335,7 +1336,7 @@ int ib_device_register_sysfs(struct ib_device *device)
{
	int ret;

	ret = ib_setup_port_attrs(&device->coredev);
	ret = ib_setup_port_attrs(&device->coredev, true);
	if (ret)
		return ret;