ksmbd: set RDMA capability for FSCTL_QUERY_NETWORK_INTERFACE_INFO
authorHyunchul Lee <hyc.lee@gmail.com>
Tue, 13 Jul 2021 07:09:34 +0000 (16:09 +0900)
committerNamjae Jeon <namjae.jeon@samsung.com>
Tue, 13 Jul 2021 08:22:51 +0000 (17:22 +0900)
set RDMA capability for
FSCTL_QUERY_NETWORK_INTERFACE_INFO.

Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com>
Signed-off-by: Namjae Jeon <namjae.jeon@samsung.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/ksmbd/smb2pdu.c
fs/ksmbd/transport_rdma.c
fs/ksmbd/transport_rdma.h

index ee91d99..c1a5945 100644 (file)
@@ -22,6 +22,7 @@
 #include "asn1.h"
 #include "connection.h"
 #include "transport_ipc.h"
+#include "transport_rdma.h"
 #include "vfs.h"
 #include "vfs_cache.h"
 #include "misc.h"
@@ -7028,11 +7029,11 @@ static int fsctl_query_iface_info_ioctl(struct ksmbd_conn *conn,
                                &rsp->Buffer[nbytes];
                nii_rsp->IfIndex = cpu_to_le32(netdev->ifindex);
 
-               /* TODO: specify the RDMA capabilities */
+               nii_rsp->Capability = 0;
                if (netdev->num_tx_queues > 1)
-                       nii_rsp->Capability = cpu_to_le32(RSS_CAPABLE);
-               else
-                       nii_rsp->Capability = 0;
+                       nii_rsp->Capability |= cpu_to_le32(RSS_CAPABLE);
+               if (ksmbd_rdma_capable_netdev(netdev))
+                       nii_rsp->Capability |= cpu_to_le32(RDMA_CAPABLE);
 
                nii_rsp->Next = cpu_to_le32(152);
                nii_rsp->Reserved = 0;
index d5728c8..f818fe3 100644 (file)
@@ -2033,6 +2033,20 @@ int ksmbd_rdma_destroy(void)
        return 0;
 }
 
+bool ksmbd_rdma_capable_netdev(struct net_device *netdev)
+{
+       struct ib_device *ibdev;
+       bool rdma_capable = false;
+
+       ibdev = ib_device_get_by_netdev(netdev, RDMA_DRIVER_UNKNOWN);
+       if (ibdev) {
+               if (rdma_frwr_is_supported(&ibdev->attrs))
+                       rdma_capable = true;
+               ib_device_put(ibdev);
+       }
+       return rdma_capable;
+}
+
 static struct ksmbd_transport_ops ksmbd_smb_direct_transport_ops = {
        .prepare        = smb_direct_prepare,
        .disconnect     = smb_direct_disconnect,
index da60fce..72e2574 100644 (file)
@@ -53,9 +53,11 @@ struct smb_direct_data_transfer {
 #ifdef CONFIG_SMB_SERVER_SMBDIRECT
 int ksmbd_rdma_init(void);
 int ksmbd_rdma_destroy(void);
+bool ksmbd_rdma_capable_netdev(struct net_device *netdev);
 #else
 static inline int ksmbd_rdma_init(void) { return 0; }
 static inline int ksmbd_rdma_destroy(void) { return 0; }
+static inline bool ksmbd_rdma_capable_netdev(struct net_device *netdev) { return false; }
 #endif
 
 #endif /* __KSMBD_TRANSPORT_RDMA_H__ */