diff options
Diffstat (limited to 'drivers/infiniband/core')
-rw-r--r-- | drivers/infiniband/core/cache.c | 10 | ||||
-rw-r--r-- | drivers/infiniband/core/cm.c | 4 | ||||
-rw-r--r-- | drivers/infiniband/core/device.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/core/iwpm_msg.c | 2 | ||||
-rw-r--r-- | drivers/infiniband/core/mad.c | 6 | ||||
-rw-r--r-- | drivers/infiniband/core/sysfs.c | 24 |
6 files changed, 35 insertions, 17 deletions
diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index c2e257d97eff..040966775f40 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c | |||
@@ -178,6 +178,7 @@ static int write_gid(struct ib_device *ib_dev, u8 port, | |||
178 | { | 178 | { |
179 | int ret = 0; | 179 | int ret = 0; |
180 | struct net_device *old_net_dev; | 180 | struct net_device *old_net_dev; |
181 | enum ib_gid_type old_gid_type; | ||
181 | 182 | ||
182 | /* in rdma_cap_roce_gid_table, this funciton should be protected by a | 183 | /* in rdma_cap_roce_gid_table, this funciton should be protected by a |
183 | * sleep-able lock. | 184 | * sleep-able lock. |
@@ -199,6 +200,7 @@ static int write_gid(struct ib_device *ib_dev, u8 port, | |||
199 | } | 200 | } |
200 | 201 | ||
201 | old_net_dev = table->data_vec[ix].attr.ndev; | 202 | old_net_dev = table->data_vec[ix].attr.ndev; |
203 | old_gid_type = table->data_vec[ix].attr.gid_type; | ||
202 | if (old_net_dev && old_net_dev != attr->ndev) | 204 | if (old_net_dev && old_net_dev != attr->ndev) |
203 | dev_put(old_net_dev); | 205 | dev_put(old_net_dev); |
204 | /* if modify_gid failed, just delete the old gid */ | 206 | /* if modify_gid failed, just delete the old gid */ |
@@ -207,10 +209,14 @@ static int write_gid(struct ib_device *ib_dev, u8 port, | |||
207 | attr = &zattr; | 209 | attr = &zattr; |
208 | table->data_vec[ix].context = NULL; | 210 | table->data_vec[ix].context = NULL; |
209 | } | 211 | } |
210 | if (default_gid) | 212 | |
211 | table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT; | ||
212 | memcpy(&table->data_vec[ix].gid, gid, sizeof(*gid)); | 213 | memcpy(&table->data_vec[ix].gid, gid, sizeof(*gid)); |
213 | memcpy(&table->data_vec[ix].attr, attr, sizeof(*attr)); | 214 | memcpy(&table->data_vec[ix].attr, attr, sizeof(*attr)); |
215 | if (default_gid) { | ||
216 | table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT; | ||
217 | if (action == GID_TABLE_WRITE_ACTION_DEL) | ||
218 | table->data_vec[ix].attr.gid_type = old_gid_type; | ||
219 | } | ||
214 | if (table->data_vec[ix].attr.ndev && | 220 | if (table->data_vec[ix].attr.ndev && |
215 | table->data_vec[ix].attr.ndev != old_net_dev) | 221 | table->data_vec[ix].attr.ndev != old_net_dev) |
216 | dev_hold(table->data_vec[ix].attr.ndev); | 222 | dev_hold(table->data_vec[ix].attr.ndev); |
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c index 1d92e091e22e..c99525512b34 100644 --- a/drivers/infiniband/core/cm.c +++ b/drivers/infiniband/core/cm.c | |||
@@ -3452,14 +3452,14 @@ static int cm_establish(struct ib_cm_id *cm_id) | |||
3452 | work->cm_event.event = IB_CM_USER_ESTABLISHED; | 3452 | work->cm_event.event = IB_CM_USER_ESTABLISHED; |
3453 | 3453 | ||
3454 | /* Check if the device started its remove_one */ | 3454 | /* Check if the device started its remove_one */ |
3455 | spin_lock_irq(&cm.lock); | 3455 | spin_lock_irqsave(&cm.lock, flags); |
3456 | if (!cm_dev->going_down) { | 3456 | if (!cm_dev->going_down) { |
3457 | queue_delayed_work(cm.wq, &work->work, 0); | 3457 | queue_delayed_work(cm.wq, &work->work, 0); |
3458 | } else { | 3458 | } else { |
3459 | kfree(work); | 3459 | kfree(work); |
3460 | ret = -ENODEV; | 3460 | ret = -ENODEV; |
3461 | } | 3461 | } |
3462 | spin_unlock_irq(&cm.lock); | 3462 | spin_unlock_irqrestore(&cm.lock, flags); |
3463 | 3463 | ||
3464 | out: | 3464 | out: |
3465 | return ret; | 3465 | return ret; |
diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c index 5516fb070344..5c155fa91eec 100644 --- a/drivers/infiniband/core/device.c +++ b/drivers/infiniband/core/device.c | |||
@@ -661,6 +661,9 @@ int ib_query_port(struct ib_device *device, | |||
661 | if (err || port_attr->subnet_prefix) | 661 | if (err || port_attr->subnet_prefix) |
662 | return err; | 662 | return err; |
663 | 663 | ||
664 | if (rdma_port_get_link_layer(device, port_num) != IB_LINK_LAYER_INFINIBAND) | ||
665 | return 0; | ||
666 | |||
664 | err = ib_query_gid(device, port_num, 0, &gid, NULL); | 667 | err = ib_query_gid(device, port_num, 0, &gid, NULL); |
665 | if (err) | 668 | if (err) |
666 | return err; | 669 | return err; |
@@ -1024,7 +1027,8 @@ static int __init ib_core_init(void) | |||
1024 | goto err_mad; | 1027 | goto err_mad; |
1025 | } | 1028 | } |
1026 | 1029 | ||
1027 | if (ib_add_ibnl_clients()) { | 1030 | ret = ib_add_ibnl_clients(); |
1031 | if (ret) { | ||
1028 | pr_warn("Couldn't register ibnl clients\n"); | 1032 | pr_warn("Couldn't register ibnl clients\n"); |
1029 | goto err_sa; | 1033 | goto err_sa; |
1030 | } | 1034 | } |
diff --git a/drivers/infiniband/core/iwpm_msg.c b/drivers/infiniband/core/iwpm_msg.c index 43e3fa27102b..1c41b95cefec 100644 --- a/drivers/infiniband/core/iwpm_msg.c +++ b/drivers/infiniband/core/iwpm_msg.c | |||
@@ -506,7 +506,7 @@ int iwpm_add_and_query_mapping_cb(struct sk_buff *skb, | |||
506 | if (!nlmsg_request) { | 506 | if (!nlmsg_request) { |
507 | pr_info("%s: Could not find a matching request (seq = %u)\n", | 507 | pr_info("%s: Could not find a matching request (seq = %u)\n", |
508 | __func__, msg_seq); | 508 | __func__, msg_seq); |
509 | return -EINVAL; | 509 | return -EINVAL; |
510 | } | 510 | } |
511 | pm_msg = nlmsg_request->req_buffer; | 511 | pm_msg = nlmsg_request->req_buffer; |
512 | local_sockaddr = (struct sockaddr_storage *) | 512 | local_sockaddr = (struct sockaddr_storage *) |
diff --git a/drivers/infiniband/core/mad.c b/drivers/infiniband/core/mad.c index 82fb511112da..2d49228f28b2 100644 --- a/drivers/infiniband/core/mad.c +++ b/drivers/infiniband/core/mad.c | |||
@@ -1638,9 +1638,9 @@ static void remove_mad_reg_req(struct ib_mad_agent_private *agent_priv) | |||
1638 | /* Now, check to see if there are any methods still in use */ | 1638 | /* Now, check to see if there are any methods still in use */ |
1639 | if (!check_method_table(method)) { | 1639 | if (!check_method_table(method)) { |
1640 | /* If not, release management method table */ | 1640 | /* If not, release management method table */ |
1641 | kfree(method); | 1641 | kfree(method); |
1642 | class->method_table[mgmt_class] = NULL; | 1642 | class->method_table[mgmt_class] = NULL; |
1643 | /* Any management classes left ? */ | 1643 | /* Any management classes left ? */ |
1644 | if (!check_class_table(class)) { | 1644 | if (!check_class_table(class)) { |
1645 | /* If not, release management class table */ | 1645 | /* If not, release management class table */ |
1646 | kfree(class); | 1646 | kfree(class); |
diff --git a/drivers/infiniband/core/sysfs.c b/drivers/infiniband/core/sysfs.c index 5e573bb18660..a5793c8f1590 100644 --- a/drivers/infiniband/core/sysfs.c +++ b/drivers/infiniband/core/sysfs.c | |||
@@ -889,9 +889,9 @@ static struct attribute *alloc_hsa_lifespan(char *name, u8 port_num) | |||
889 | static void setup_hw_stats(struct ib_device *device, struct ib_port *port, | 889 | static void setup_hw_stats(struct ib_device *device, struct ib_port *port, |
890 | u8 port_num) | 890 | u8 port_num) |
891 | { | 891 | { |
892 | struct attribute_group *hsag = NULL; | 892 | struct attribute_group *hsag; |
893 | struct rdma_hw_stats *stats; | 893 | struct rdma_hw_stats *stats; |
894 | int i = 0, ret; | 894 | int i, ret; |
895 | 895 | ||
896 | stats = device->alloc_hw_stats(device, port_num); | 896 | stats = device->alloc_hw_stats(device, port_num); |
897 | 897 | ||
@@ -899,19 +899,22 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port, | |||
899 | return; | 899 | return; |
900 | 900 | ||
901 | if (!stats->names || stats->num_counters <= 0) | 901 | if (!stats->names || stats->num_counters <= 0) |
902 | goto err; | 902 | goto err_free_stats; |
903 | 903 | ||
904 | /* | ||
905 | * Two extra attribue elements here, one for the lifespan entry and | ||
906 | * one to NULL terminate the list for the sysfs core code | ||
907 | */ | ||
904 | hsag = kzalloc(sizeof(*hsag) + | 908 | hsag = kzalloc(sizeof(*hsag) + |
905 | // 1 extra for the lifespan config entry | 909 | sizeof(void *) * (stats->num_counters + 2), |
906 | sizeof(void *) * (stats->num_counters + 1), | ||
907 | GFP_KERNEL); | 910 | GFP_KERNEL); |
908 | if (!hsag) | 911 | if (!hsag) |
909 | return; | 912 | goto err_free_stats; |
910 | 913 | ||
911 | ret = device->get_hw_stats(device, stats, port_num, | 914 | ret = device->get_hw_stats(device, stats, port_num, |
912 | stats->num_counters); | 915 | stats->num_counters); |
913 | if (ret != stats->num_counters) | 916 | if (ret != stats->num_counters) |
914 | goto err; | 917 | goto err_free_hsag; |
915 | 918 | ||
916 | stats->timestamp = jiffies; | 919 | stats->timestamp = jiffies; |
917 | 920 | ||
@@ -922,10 +925,13 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port, | |||
922 | hsag->attrs[i] = alloc_hsa(i, port_num, stats->names[i]); | 925 | hsag->attrs[i] = alloc_hsa(i, port_num, stats->names[i]); |
923 | if (!hsag->attrs[i]) | 926 | if (!hsag->attrs[i]) |
924 | goto err; | 927 | goto err; |
928 | sysfs_attr_init(hsag->attrs[i]); | ||
925 | } | 929 | } |
926 | 930 | ||
927 | /* treat an error here as non-fatal */ | 931 | /* treat an error here as non-fatal */ |
928 | hsag->attrs[i] = alloc_hsa_lifespan("lifespan", port_num); | 932 | hsag->attrs[i] = alloc_hsa_lifespan("lifespan", port_num); |
933 | if (hsag->attrs[i]) | ||
934 | sysfs_attr_init(hsag->attrs[i]); | ||
929 | 935 | ||
930 | if (port) { | 936 | if (port) { |
931 | struct kobject *kobj = &port->kobj; | 937 | struct kobject *kobj = &port->kobj; |
@@ -946,10 +952,12 @@ static void setup_hw_stats(struct ib_device *device, struct ib_port *port, | |||
946 | return; | 952 | return; |
947 | 953 | ||
948 | err: | 954 | err: |
949 | kfree(stats); | ||
950 | for (; i >= 0; i--) | 955 | for (; i >= 0; i--) |
951 | kfree(hsag->attrs[i]); | 956 | kfree(hsag->attrs[i]); |
957 | err_free_hsag: | ||
952 | kfree(hsag); | 958 | kfree(hsag); |
959 | err_free_stats: | ||
960 | kfree(stats); | ||
953 | return; | 961 | return; |
954 | } | 962 | } |
955 | 963 | ||