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

Commit 0f6ef65d authored by Parav Pandit's avatar Parav Pandit Committed by Doug Ledford
Browse files

RDMA/core: Do not expose unsupported counters



If the provider driver (such as rdma_rxe) doesn't support pma counters,
avoid exposing its directory similar to optional hw_counters directory.
If core fails to read the PMA counter, return an error so that user can
retry later if needed.

Fixes: 35c4cbb1 ("IB/core: Create get_perf_mad function in sysfs.c")
Reported-by: default avatarHolger Hoffstätte <holger@applied-asynchrony.com>
Tested-by: default avatarHolger Hoffstätte <holger@applied-asynchrony.com>
Signed-off-by: default avatarParav Pandit <parav@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leonro@mellanox.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 60f1fc20
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -512,7 +512,7 @@ static ssize_t show_pma_counter(struct ib_port *p, struct port_attribute *attr,
	ret = get_perf_mad(p->ibdev, p->port_num, tab_attr->attr_id, &data,
			40 + offset / 8, sizeof(data));
	if (ret < 0)
		return sprintf(buf, "N/A (no PMA)\n");
		return ret;

	switch (width) {
	case 4:
@@ -1057,10 +1057,12 @@ static int add_port(struct ib_device *device, int port_num,
		goto err_put;
	}

	if (device->process_mad) {
		p->pma_table = get_counter_table(device, port_num);
		ret = sysfs_create_group(&p->kobj, p->pma_table);
		if (ret)
			goto err_put_gid_attrs;
	}

	p->gid_group.name  = "gids";
	p->gid_group.attrs = alloc_group_attrs(show_port_gid, attr.gid_tbl_len);
@@ -1173,6 +1175,7 @@ static int add_port(struct ib_device *device, int port_num,
	p->gid_group.attrs = NULL;

err_remove_pma:
	if (p->pma_table)
		sysfs_remove_group(&p->kobj, p->pma_table);

err_put_gid_attrs:
@@ -1289,6 +1292,8 @@ static void free_port_list_attributes(struct ib_device *device)
			kfree(port->hw_stats);
			free_hsag(&port->kobj, port->hw_stats_ag);
		}

		if (port->pma_table)
			sysfs_remove_group(p, port->pma_table);
		sysfs_remove_group(p, &port->pkey_group);
		sysfs_remove_group(p, &port->gid_group);