hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/infiniband/hw/usnic/usnic_ib_main.c
....@@ -76,7 +76,7 @@
7676 static int usnic_ib_dump_vf_hdr(void *obj, char *buf, int buf_sz)
7777 {
7878 struct usnic_ib_vf *vf = obj;
79
- return scnprintf(buf, buf_sz, "PF: %s ", vf->pf->ib_dev.name);
79
+ return scnprintf(buf, buf_sz, "PF: %s ", dev_name(&vf->pf->ib_dev.dev));
8080 }
8181 /* End callback dump funcs */
8282
....@@ -89,9 +89,15 @@
8989
9090 void usnic_ib_log_vf(struct usnic_ib_vf *vf)
9191 {
92
- char buf[1000];
93
- usnic_ib_dump_vf(vf, buf, sizeof(buf));
92
+ char *buf = kzalloc(1000, GFP_KERNEL);
93
+
94
+ if (!buf)
95
+ return;
96
+
97
+ usnic_ib_dump_vf(vf, buf, 1000);
9498 usnic_dbg("%s\n", buf);
99
+
100
+ kfree(buf);
95101 }
96102
97103 /* Start of netdev section */
....@@ -114,7 +120,7 @@
114120 IB_QPS_ERR,
115121 NULL);
116122 if (status) {
117
- usnic_err("Failed to transistion qp grp %u from %s to %s\n",
123
+ usnic_err("Failed to transition qp grp %u from %s to %s\n",
118124 qp_grp->grp_id,
119125 usnic_ib_qp_grp_state_to_string
120126 (cur_state),
....@@ -138,7 +144,7 @@
138144 netdev = us_ibdev->netdev;
139145 switch (event) {
140146 case NETDEV_REBOOT:
141
- usnic_info("PF Reset on %s\n", us_ibdev->ib_dev.name);
147
+ usnic_info("PF Reset on %s\n", dev_name(&us_ibdev->ib_dev.dev));
142148 usnic_ib_qp_grp_modify_active_to_err(us_ibdev);
143149 ib_event.event = IB_EVENT_PORT_ERR;
144150 ib_event.device = &us_ibdev->ib_dev;
....@@ -151,7 +157,8 @@
151157 if (!us_ibdev->ufdev->link_up &&
152158 netif_carrier_ok(netdev)) {
153159 usnic_fwd_carrier_up(us_ibdev->ufdev);
154
- usnic_info("Link UP on %s\n", us_ibdev->ib_dev.name);
160
+ usnic_info("Link UP on %s\n",
161
+ dev_name(&us_ibdev->ib_dev.dev));
155162 ib_event.event = IB_EVENT_PORT_ACTIVE;
156163 ib_event.device = &us_ibdev->ib_dev;
157164 ib_event.element.port_num = 1;
....@@ -159,7 +166,8 @@
159166 } else if (us_ibdev->ufdev->link_up &&
160167 !netif_carrier_ok(netdev)) {
161168 usnic_fwd_carrier_down(us_ibdev->ufdev);
162
- usnic_info("Link DOWN on %s\n", us_ibdev->ib_dev.name);
169
+ usnic_info("Link DOWN on %s\n",
170
+ dev_name(&us_ibdev->ib_dev.dev));
163171 usnic_ib_qp_grp_modify_active_to_err(us_ibdev);
164172 ib_event.event = IB_EVENT_PORT_ERR;
165173 ib_event.device = &us_ibdev->ib_dev;
....@@ -168,17 +176,17 @@
168176 } else {
169177 usnic_dbg("Ignoring %s on %s\n",
170178 netdev_cmd_to_name(event),
171
- us_ibdev->ib_dev.name);
179
+ dev_name(&us_ibdev->ib_dev.dev));
172180 }
173181 break;
174182 case NETDEV_CHANGEADDR:
175183 if (!memcmp(us_ibdev->ufdev->mac, netdev->dev_addr,
176184 sizeof(us_ibdev->ufdev->mac))) {
177185 usnic_dbg("Ignoring addr change on %s\n",
178
- us_ibdev->ib_dev.name);
186
+ dev_name(&us_ibdev->ib_dev.dev));
179187 } else {
180188 usnic_info(" %s old mac: %pM new mac: %pM\n",
181
- us_ibdev->ib_dev.name,
189
+ dev_name(&us_ibdev->ib_dev.dev),
182190 us_ibdev->ufdev->mac,
183191 netdev->dev_addr);
184192 usnic_fwd_set_mac(us_ibdev->ufdev, netdev->dev_addr);
....@@ -193,19 +201,19 @@
193201 case NETDEV_CHANGEMTU:
194202 if (us_ibdev->ufdev->mtu != netdev->mtu) {
195203 usnic_info("MTU Change on %s old: %u new: %u\n",
196
- us_ibdev->ib_dev.name,
204
+ dev_name(&us_ibdev->ib_dev.dev),
197205 us_ibdev->ufdev->mtu, netdev->mtu);
198206 usnic_fwd_set_mtu(us_ibdev->ufdev, netdev->mtu);
199207 usnic_ib_qp_grp_modify_active_to_err(us_ibdev);
200208 } else {
201209 usnic_dbg("Ignoring MTU change on %s\n",
202
- us_ibdev->ib_dev.name);
210
+ dev_name(&us_ibdev->ib_dev.dev));
203211 }
204212 break;
205213 default:
206214 usnic_dbg("Ignoring event %s on %s",
207215 netdev_cmd_to_name(event),
208
- us_ibdev->ib_dev.name);
216
+ dev_name(&us_ibdev->ib_dev.dev));
209217 }
210218 mutex_unlock(&us_ibdev->usdev_lock);
211219 }
....@@ -214,18 +222,17 @@
214222 unsigned long event, void *ptr)
215223 {
216224 struct usnic_ib_dev *us_ibdev;
225
+ struct ib_device *ibdev;
217226
218227 struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
219228
220
- mutex_lock(&usnic_ib_ibdev_list_lock);
221
- list_for_each_entry(us_ibdev, &usnic_ib_ibdev_list, ib_dev_link) {
222
- if (us_ibdev->netdev == netdev) {
223
- usnic_ib_handle_usdev_event(us_ibdev, event);
224
- break;
225
- }
226
- }
227
- mutex_unlock(&usnic_ib_ibdev_list_lock);
229
+ ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_USNIC);
230
+ if (!ibdev)
231
+ return NOTIFY_DONE;
228232
233
+ us_ibdev = container_of(ibdev, struct usnic_ib_dev, ib_dev);
234
+ usnic_ib_handle_usdev_event(us_ibdev, event);
235
+ ib_device_put(ibdev);
229236 return NOTIFY_DONE;
230237 }
231238
....@@ -267,7 +274,7 @@
267274 default:
268275 usnic_info("Ignoring event %s on %s",
269276 netdev_cmd_to_name(event),
270
- us_ibdev->ib_dev.name);
277
+ dev_name(&us_ibdev->ib_dev.dev));
271278 }
272279 mutex_unlock(&us_ibdev->usdev_lock);
273280
....@@ -280,16 +287,15 @@
280287 struct usnic_ib_dev *us_ibdev;
281288 struct in_ifaddr *ifa = ptr;
282289 struct net_device *netdev = ifa->ifa_dev->dev;
290
+ struct ib_device *ibdev;
283291
284
- mutex_lock(&usnic_ib_ibdev_list_lock);
285
- list_for_each_entry(us_ibdev, &usnic_ib_ibdev_list, ib_dev_link) {
286
- if (us_ibdev->netdev == netdev) {
287
- usnic_ib_handle_inet_event(us_ibdev, event, ptr);
288
- break;
289
- }
290
- }
291
- mutex_unlock(&usnic_ib_ibdev_list_lock);
292
+ ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_USNIC);
293
+ if (!ibdev)
294
+ return NOTIFY_DONE;
292295
296
+ us_ibdev = container_of(ibdev, struct usnic_ib_dev, ib_dev);
297
+ usnic_ib_handle_inet_event(us_ibdev, event, ptr);
298
+ ib_device_put(ibdev);
293299 return NOTIFY_DONE;
294300 }
295301 static struct notifier_block usnic_ib_inetaddr_notifier = {
....@@ -309,7 +315,6 @@
309315 if (err)
310316 return err;
311317
312
- immutable->pkey_tbl_len = attr.pkey_tbl_len;
313318 immutable->gid_tbl_len = attr.gid_tbl_len;
314319
315320 return 0;
....@@ -328,6 +333,35 @@
328333 snprintf(str, IB_FW_VERSION_NAME_MAX, "%s", info.fw_version);
329334 }
330335
336
+static const struct ib_device_ops usnic_dev_ops = {
337
+ .owner = THIS_MODULE,
338
+ .driver_id = RDMA_DRIVER_USNIC,
339
+ .uverbs_abi_ver = USNIC_UVERBS_ABI_VERSION,
340
+
341
+ .alloc_pd = usnic_ib_alloc_pd,
342
+ .alloc_ucontext = usnic_ib_alloc_ucontext,
343
+ .create_cq = usnic_ib_create_cq,
344
+ .create_qp = usnic_ib_create_qp,
345
+ .dealloc_pd = usnic_ib_dealloc_pd,
346
+ .dealloc_ucontext = usnic_ib_dealloc_ucontext,
347
+ .dereg_mr = usnic_ib_dereg_mr,
348
+ .destroy_cq = usnic_ib_destroy_cq,
349
+ .destroy_qp = usnic_ib_destroy_qp,
350
+ .get_dev_fw_str = usnic_get_dev_fw_str,
351
+ .get_link_layer = usnic_ib_port_link_layer,
352
+ .get_port_immutable = usnic_port_immutable,
353
+ .mmap = usnic_ib_mmap,
354
+ .modify_qp = usnic_ib_modify_qp,
355
+ .query_device = usnic_ib_query_device,
356
+ .query_gid = usnic_ib_query_gid,
357
+ .query_port = usnic_ib_query_port,
358
+ .query_qp = usnic_ib_query_qp,
359
+ .reg_user_mr = usnic_ib_reg_mr,
360
+ INIT_RDMA_OBJ_SIZE(ib_pd, usnic_ib_pd, ibpd),
361
+ INIT_RDMA_OBJ_SIZE(ib_cq, usnic_ib_cq, ibcq),
362
+ INIT_RDMA_OBJ_SIZE(ib_ucontext, usnic_ib_ucontext, ibucontext),
363
+};
364
+
331365 /* Start of PF discovery section */
332366 static void *usnic_ib_device_add(struct pci_dev *dev)
333367 {
....@@ -335,11 +369,12 @@
335369 union ib_gid gid;
336370 struct in_device *ind;
337371 struct net_device *netdev;
372
+ int ret;
338373
339374 usnic_dbg("\n");
340375 netdev = pci_get_drvdata(dev);
341376
342
- us_ibdev = (struct usnic_ib_dev *)ib_alloc_device(sizeof(*us_ibdev));
377
+ us_ibdev = ib_alloc_device(usnic_ib_dev, ib_dev);
343378 if (!us_ibdev) {
344379 usnic_err("Device %s context alloc failed\n",
345380 netdev_name(pci_get_drvdata(dev)));
....@@ -358,13 +393,10 @@
358393
359394 us_ibdev->pdev = dev;
360395 us_ibdev->netdev = pci_get_drvdata(dev);
361
- us_ibdev->ib_dev.owner = THIS_MODULE;
362396 us_ibdev->ib_dev.node_type = RDMA_NODE_USNIC_UDP;
363397 us_ibdev->ib_dev.phys_port_cnt = USNIC_IB_PORT_CNT;
364398 us_ibdev->ib_dev.num_comp_vectors = USNIC_IB_NUM_COMP_VECTORS;
365399 us_ibdev->ib_dev.dev.parent = &dev->dev;
366
- us_ibdev->ib_dev.uverbs_abi_ver = USNIC_UVERBS_ABI_VERSION;
367
- strlcpy(us_ibdev->ib_dev.name, "usnic_%d", IB_DEVICE_NAME_MAX);
368400
369401 us_ibdev->ib_dev.uverbs_cmd_mask =
370402 (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
....@@ -385,38 +417,16 @@
385417 (1ull << IB_USER_VERBS_CMD_DETACH_MCAST) |
386418 (1ull << IB_USER_VERBS_CMD_OPEN_QP);
387419
388
- us_ibdev->ib_dev.query_device = usnic_ib_query_device;
389
- us_ibdev->ib_dev.query_port = usnic_ib_query_port;
390
- us_ibdev->ib_dev.query_pkey = usnic_ib_query_pkey;
391
- us_ibdev->ib_dev.query_gid = usnic_ib_query_gid;
392
- us_ibdev->ib_dev.get_netdev = usnic_get_netdev;
393
- us_ibdev->ib_dev.get_link_layer = usnic_ib_port_link_layer;
394
- us_ibdev->ib_dev.alloc_pd = usnic_ib_alloc_pd;
395
- us_ibdev->ib_dev.dealloc_pd = usnic_ib_dealloc_pd;
396
- us_ibdev->ib_dev.create_qp = usnic_ib_create_qp;
397
- us_ibdev->ib_dev.modify_qp = usnic_ib_modify_qp;
398
- us_ibdev->ib_dev.query_qp = usnic_ib_query_qp;
399
- us_ibdev->ib_dev.destroy_qp = usnic_ib_destroy_qp;
400
- us_ibdev->ib_dev.create_cq = usnic_ib_create_cq;
401
- us_ibdev->ib_dev.destroy_cq = usnic_ib_destroy_cq;
402
- us_ibdev->ib_dev.reg_user_mr = usnic_ib_reg_mr;
403
- us_ibdev->ib_dev.dereg_mr = usnic_ib_dereg_mr;
404
- us_ibdev->ib_dev.alloc_ucontext = usnic_ib_alloc_ucontext;
405
- us_ibdev->ib_dev.dealloc_ucontext = usnic_ib_dealloc_ucontext;
406
- us_ibdev->ib_dev.mmap = usnic_ib_mmap;
407
- us_ibdev->ib_dev.create_ah = usnic_ib_create_ah;
408
- us_ibdev->ib_dev.destroy_ah = usnic_ib_destroy_ah;
409
- us_ibdev->ib_dev.post_send = usnic_ib_post_send;
410
- us_ibdev->ib_dev.post_recv = usnic_ib_post_recv;
411
- us_ibdev->ib_dev.poll_cq = usnic_ib_poll_cq;
412
- us_ibdev->ib_dev.req_notify_cq = usnic_ib_req_notify_cq;
413
- us_ibdev->ib_dev.get_dma_mr = usnic_ib_get_dma_mr;
414
- us_ibdev->ib_dev.get_port_immutable = usnic_port_immutable;
415
- us_ibdev->ib_dev.get_dev_fw_str = usnic_get_dev_fw_str;
420
+ ib_set_device_ops(&us_ibdev->ib_dev, &usnic_dev_ops);
416421
422
+ rdma_set_device_sysfs_group(&us_ibdev->ib_dev, &usnic_attr_group);
417423
418
- us_ibdev->ib_dev.driver_id = RDMA_DRIVER_USNIC;
419
- if (ib_register_device(&us_ibdev->ib_dev, NULL))
424
+ ret = ib_device_set_netdev(&us_ibdev->ib_dev, us_ibdev->netdev, 1);
425
+ if (ret)
426
+ goto err_fwd_dealloc;
427
+
428
+ dma_set_max_seg_size(&dev->dev, SZ_2G);
429
+ if (ib_register_device(&us_ibdev->ib_dev, "usnic_%d", &dev->dev))
420430 goto err_fwd_dealloc;
421431
422432 usnic_fwd_set_mtu(us_ibdev->ufdev, us_ibdev->netdev->mtu);
....@@ -424,11 +434,16 @@
424434 if (netif_carrier_ok(us_ibdev->netdev))
425435 usnic_fwd_carrier_up(us_ibdev->ufdev);
426436
427
- ind = in_dev_get(netdev);
428
- if (ind->ifa_list)
429
- usnic_fwd_add_ipaddr(us_ibdev->ufdev,
430
- ind->ifa_list->ifa_address);
431
- in_dev_put(ind);
437
+ rcu_read_lock();
438
+ ind = __in_dev_get_rcu(netdev);
439
+ if (ind) {
440
+ const struct in_ifaddr *ifa;
441
+
442
+ ifa = rcu_dereference(ind->ifa_list);
443
+ if (ifa)
444
+ usnic_fwd_add_ipaddr(us_ibdev->ufdev, ifa->ifa_address);
445
+ }
446
+ rcu_read_unlock();
432447
433448 usnic_mac_ip_to_gid(us_ibdev->netdev->perm_addr,
434449 us_ibdev->ufdev->inaddr, &gid.raw[0]);
....@@ -437,9 +452,9 @@
437452 kref_init(&us_ibdev->vf_cnt);
438453
439454 usnic_info("Added ibdev: %s netdev: %s with mac %pM Link: %u MTU: %u\n",
440
- us_ibdev->ib_dev.name, netdev_name(us_ibdev->netdev),
441
- us_ibdev->ufdev->mac, us_ibdev->ufdev->link_up,
442
- us_ibdev->ufdev->mtu);
455
+ dev_name(&us_ibdev->ib_dev.dev),
456
+ netdev_name(us_ibdev->netdev), us_ibdev->ufdev->mac,
457
+ us_ibdev->ufdev->link_up, us_ibdev->ufdev->mtu);
443458 return us_ibdev;
444459
445460 err_fwd_dealloc:
....@@ -452,7 +467,7 @@
452467
453468 static void usnic_ib_device_remove(struct usnic_ib_dev *us_ibdev)
454469 {
455
- usnic_info("Unregistering %s\n", us_ibdev->ib_dev.name);
470
+ usnic_info("Unregistering %s\n", dev_name(&us_ibdev->ib_dev.dev));
456471 usnic_ib_sysfs_unregister_usdev(us_ibdev);
457472 usnic_fwd_dev_free(us_ibdev->ufdev);
458473 ib_unregister_device(&us_ibdev->ib_dev);
....@@ -471,15 +486,17 @@
471486 &usnic_ib_ibdev_list, ib_dev_link) {
472487 if (us_ibdev->pdev == dev) {
473488 list_del(&us_ibdev->ib_dev_link);
474
- usnic_ib_device_remove(us_ibdev);
475489 found = true;
476490 break;
477491 }
478492 }
479493
480
- WARN(!found, "Failed to remove PF %s\n", pci_name(dev));
481494
482495 mutex_unlock(&usnic_ib_ibdev_list_lock);
496
+ if (found)
497
+ usnic_ib_device_remove(us_ibdev);
498
+ else
499
+ WARN(1, "Failed to remove PF %s\n", pci_name(dev));
483500 }
484501
485502 static struct usnic_ib_dev *usnic_ib_discover_pf(struct usnic_vnic *vnic)
....@@ -591,7 +608,7 @@
591608 mutex_unlock(&pf->usdev_lock);
592609
593610 usnic_info("Registering usnic VF %s into PF %s\n", pci_name(pdev),
594
- pf->ib_dev.name);
611
+ dev_name(&pf->ib_dev.dev));
595612 usnic_ib_log_vf(vf);
596613 return 0;
597614
....@@ -646,7 +663,7 @@
646663
647664 err = usnic_uiom_init(DRV_NAME);
648665 if (err) {
649
- usnic_err("Unable to initalize umem with err %d\n", err);
666
+ usnic_err("Unable to initialize umem with err %d\n", err);
650667 return err;
651668 }
652669
....@@ -685,7 +702,6 @@
685702 out_pci_unreg:
686703 pci_unregister_driver(&usnic_ib_pci_driver);
687704 out_umem_fini:
688
- usnic_uiom_fini();
689705
690706 return err;
691707 }
....@@ -698,7 +714,6 @@
698714 unregister_inetaddr_notifier(&usnic_ib_inetaddr_notifier);
699715 unregister_netdevice_notifier(&usnic_ib_netdevice_notifier);
700716 pci_unregister_driver(&usnic_ib_pci_driver);
701
- usnic_uiom_fini();
702717 }
703718
704719 MODULE_DESCRIPTION("Cisco VIC (usNIC) Verbs Driver");