Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

smb: server: make use of smbdirect_netdev_rdma_capable_mode_type()

This removes is basically the same logic.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>

authored by

Stefan Metzmacher and committed by
Steve French
33b2894e 81a7a3a0

+2 -120
+2 -120
fs/smb/server/transport_rdma.c
··· 77 77 78 78 static int smb_direct_max_read_write_size = SMBD_DEFAULT_IOSIZE; 79 79 80 - static LIST_HEAD(smb_direct_device_list); 81 - static DEFINE_RWLOCK(smb_direct_device_lock); 82 - 83 - struct smb_direct_device { 84 - struct ib_device *ib_dev; 85 - struct list_head list; 86 - }; 87 - 88 80 static struct smb_direct_listener { 89 81 int port; 90 82 ··· 492 500 return ret; 493 501 } 494 502 495 - static int smb_direct_ib_client_add(struct ib_device *ib_dev) 496 - { 497 - struct smb_direct_device *smb_dev; 498 - 499 - if (!smbdirect_frwr_is_supported(&ib_dev->attrs)) 500 - return 0; 501 - 502 - smb_dev = kzalloc_obj(*smb_dev, KSMBD_DEFAULT_GFP); 503 - if (!smb_dev) 504 - return -ENOMEM; 505 - smb_dev->ib_dev = ib_dev; 506 - 507 - write_lock(&smb_direct_device_lock); 508 - list_add(&smb_dev->list, &smb_direct_device_list); 509 - write_unlock(&smb_direct_device_lock); 510 - 511 - ksmbd_debug(RDMA, "ib device added: name %s\n", ib_dev->name); 512 - return 0; 513 - } 514 - 515 - static void smb_direct_ib_client_remove(struct ib_device *ib_dev, 516 - void *client_data) 517 - { 518 - struct smb_direct_device *smb_dev, *tmp; 519 - 520 - write_lock(&smb_direct_device_lock); 521 - list_for_each_entry_safe(smb_dev, tmp, &smb_direct_device_list, list) { 522 - if (smb_dev->ib_dev == ib_dev) { 523 - list_del(&smb_dev->list); 524 - kfree(smb_dev); 525 - break; 526 - } 527 - } 528 - write_unlock(&smb_direct_device_lock); 529 - } 530 - 531 - static struct ib_client smb_direct_ib_client = { 532 - .name = "ksmbd_smb_direct_ib", 533 - .add = smb_direct_ib_client_add, 534 - .remove = smb_direct_ib_client_remove, 535 - }; 536 - 537 503 int ksmbd_rdma_init(void) 538 504 { 539 505 int ret; ··· 499 549 smb_direct_ib_listener = smb_direct_iw_listener = (struct smb_direct_listener) { 500 550 .socket = NULL, 501 551 }; 502 - 503 - ret = ib_register_client(&smb_direct_ib_client); 504 - if (ret) { 505 - pr_err("failed to ib_register_client\n"); 506 - return ret; 507 - } 508 552 509 553 /* When a client is running out of send credits, the credits are 510 554 * granted by the server's sending a packet using this queue. ··· 542 598 543 599 void ksmbd_rdma_stop_listening(void) 544 600 { 545 - if (!smb_direct_ib_listener.socket && !smb_direct_iw_listener.socket) 546 - return; 547 - 548 - ib_unregister_client(&smb_direct_ib_client); 549 - 550 601 smb_direct_listener_destroy(&smb_direct_ib_listener); 551 602 smb_direct_listener_destroy(&smb_direct_iw_listener); 552 603 } ··· 554 615 } 555 616 } 556 617 557 - static bool ksmbd_find_rdma_capable_netdev(struct net_device *netdev) 558 - { 559 - struct smb_direct_device *smb_dev; 560 - int i; 561 - bool rdma_capable = false; 562 - 563 - read_lock(&smb_direct_device_lock); 564 - list_for_each_entry(smb_dev, &smb_direct_device_list, list) { 565 - for (i = 0; i < smb_dev->ib_dev->phys_port_cnt; i++) { 566 - struct net_device *ndev; 567 - 568 - ndev = ib_device_get_netdev(smb_dev->ib_dev, i + 1); 569 - if (!ndev) 570 - continue; 571 - 572 - if (ndev == netdev) { 573 - dev_put(ndev); 574 - rdma_capable = true; 575 - goto out; 576 - } 577 - dev_put(ndev); 578 - } 579 - } 580 - out: 581 - read_unlock(&smb_direct_device_lock); 582 - 583 - if (rdma_capable == false) { 584 - struct ib_device *ibdev; 585 - 586 - ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN); 587 - if (ibdev) { 588 - rdma_capable = smbdirect_frwr_is_supported(&ibdev->attrs); 589 - ib_device_put(ibdev); 590 - } 591 - } 592 - 593 - ksmbd_debug(RDMA, "netdev(%s) rdma capable : %s\n", 594 - netdev->name, str_true_false(rdma_capable)); 595 - 596 - return rdma_capable; 597 - } 598 - 599 618 bool ksmbd_rdma_capable_netdev(struct net_device *netdev) 600 619 { 601 - struct net_device *lower_dev; 602 - struct list_head *iter; 620 + u8 node_type = smbdirect_netdev_rdma_capable_node_type(netdev); 603 621 604 - if (ksmbd_find_rdma_capable_netdev(netdev)) 605 - return true; 606 - 607 - /* check if netdev is bridge or VLAN */ 608 - if (netif_is_bridge_master(netdev) || 609 - netdev->priv_flags & IFF_802_1Q_VLAN) 610 - netdev_for_each_lower_dev(netdev, lower_dev, iter) 611 - if (ksmbd_find_rdma_capable_netdev(lower_dev)) 612 - return true; 613 - 614 - /* check if netdev is IPoIB safely without layer violation */ 615 - if (netdev->type == ARPHRD_INFINIBAND) 616 - return true; 617 - 618 - return false; 622 + return node_type != RDMA_NODE_UNSPECIFIED; 619 623 } 620 624 621 625 static const struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = {