IB: Add node_guid to struct ib_device
Add a node_guid field to struct ib_device. It is the responsibility of the low-level driver to initialize this field before registering a device with the midlayer. Convert everyone to looking at this field instead of calling ib_query_device() when all they want is the node GUID, and remove the node_guid field from struct ib_device_attr. Signed-off-by: Sean Hefty <sean.hefty@intel.com> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
committed by
Roland Dreier
parent
87635b71b5
commit
cf311cd49a
@@ -3163,22 +3163,6 @@ int ib_cm_init_qp_attr(struct ib_cm_id *cm_id,
|
||||
}
|
||||
EXPORT_SYMBOL(ib_cm_init_qp_attr);
|
||||
|
||||
static __be64 cm_get_ca_guid(struct ib_device *device)
|
||||
{
|
||||
struct ib_device_attr *device_attr;
|
||||
__be64 guid;
|
||||
int ret;
|
||||
|
||||
device_attr = kmalloc(sizeof *device_attr, GFP_KERNEL);
|
||||
if (!device_attr)
|
||||
return 0;
|
||||
|
||||
ret = ib_query_device(device, device_attr);
|
||||
guid = ret ? 0 : device_attr->node_guid;
|
||||
kfree(device_attr);
|
||||
return guid;
|
||||
}
|
||||
|
||||
static void cm_add_one(struct ib_device *device)
|
||||
{
|
||||
struct cm_device *cm_dev;
|
||||
@@ -3200,9 +3184,7 @@ static void cm_add_one(struct ib_device *device)
|
||||
return;
|
||||
|
||||
cm_dev->device = device;
|
||||
cm_dev->ca_guid = cm_get_ca_guid(device);
|
||||
if (!cm_dev->ca_guid)
|
||||
goto error1;
|
||||
cm_dev->ca_guid = device->node_guid;
|
||||
|
||||
set_bit(IB_MGMT_METHOD_SEND, reg_req.method_mask);
|
||||
for (i = 1; i <= device->phys_port_cnt; i++) {
|
||||
@@ -3217,11 +3199,11 @@ static void cm_add_one(struct ib_device *device)
|
||||
cm_recv_handler,
|
||||
port);
|
||||
if (IS_ERR(port->mad_agent))
|
||||
goto error2;
|
||||
goto error1;
|
||||
|
||||
ret = ib_modify_port(device, i, 0, &port_modify);
|
||||
if (ret)
|
||||
goto error3;
|
||||
goto error2;
|
||||
}
|
||||
ib_set_client_data(device, &cm_client, cm_dev);
|
||||
|
||||
@@ -3230,9 +3212,9 @@ static void cm_add_one(struct ib_device *device)
|
||||
write_unlock_irqrestore(&cm.device_lock, flags);
|
||||
return;
|
||||
|
||||
error3:
|
||||
ib_unregister_mad_agent(port->mad_agent);
|
||||
error2:
|
||||
ib_unregister_mad_agent(port->mad_agent);
|
||||
error1:
|
||||
port_modify.set_port_cap_mask = 0;
|
||||
port_modify.clr_port_cap_mask = IB_PORT_CM_SUP;
|
||||
while (--i) {
|
||||
@@ -3240,7 +3222,6 @@ error2:
|
||||
ib_modify_port(device, port->port_num, 0, &port_modify);
|
||||
ib_unregister_mad_agent(port->mad_agent);
|
||||
}
|
||||
error1:
|
||||
kfree(cm_dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -445,13 +445,7 @@ static int ib_device_uevent(struct class_device *cdev, char **envp,
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* It might be nice to pass the node GUID with the event, but
|
||||
* right now the only way to get it is to query the device
|
||||
* provider, and this can crash during device removal because
|
||||
* we are will be running after driver removal has started.
|
||||
* We could add a node_guid field to struct ib_device, or we
|
||||
* could just let userspace read the node GUID from sysfs when
|
||||
* devices are added.
|
||||
* It would be nice to pass the node GUID with the event...
|
||||
*/
|
||||
|
||||
envp[i] = NULL;
|
||||
@@ -623,21 +617,15 @@ static ssize_t show_sys_image_guid(struct class_device *cdev, char *buf)
|
||||
static ssize_t show_node_guid(struct class_device *cdev, char *buf)
|
||||
{
|
||||
struct ib_device *dev = container_of(cdev, struct ib_device, class_dev);
|
||||
struct ib_device_attr attr;
|
||||
ssize_t ret;
|
||||
|
||||
if (!ibdev_is_alive(dev))
|
||||
return -ENODEV;
|
||||
|
||||
ret = ib_query_device(dev, &attr);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return sprintf(buf, "%04x:%04x:%04x:%04x\n",
|
||||
be16_to_cpu(((__be16 *) &attr.node_guid)[0]),
|
||||
be16_to_cpu(((__be16 *) &attr.node_guid)[1]),
|
||||
be16_to_cpu(((__be16 *) &attr.node_guid)[2]),
|
||||
be16_to_cpu(((__be16 *) &attr.node_guid)[3]));
|
||||
be16_to_cpu(((__be16 *) &dev->node_guid)[0]),
|
||||
be16_to_cpu(((__be16 *) &dev->node_guid)[1]),
|
||||
be16_to_cpu(((__be16 *) &dev->node_guid)[2]),
|
||||
be16_to_cpu(((__be16 *) &dev->node_guid)[3]));
|
||||
}
|
||||
|
||||
static CLASS_DEVICE_ATTR(node_type, S_IRUGO, show_node_type, NULL);
|
||||
|
||||
@@ -157,7 +157,7 @@ ssize_t ib_uverbs_query_device(struct ib_uverbs_file *file,
|
||||
memset(&resp, 0, sizeof resp);
|
||||
|
||||
resp.fw_ver = attr.fw_ver;
|
||||
resp.node_guid = attr.node_guid;
|
||||
resp.node_guid = file->device->ib_dev->node_guid;
|
||||
resp.sys_image_guid = attr.sys_image_guid;
|
||||
resp.max_mr_size = attr.max_mr_size;
|
||||
resp.page_size_cap = attr.page_size_cap;
|
||||
|
||||
Reference in New Issue
Block a user