diff mbox series

[2/3] ksmbd: add smbd max io size parameter

Message ID 20220516074140.28522-2-linkinjeon@kernel.org
State New
Headers show
Series [1/3] ksmbd: handle smb2 query dir request for OutputBufferLength that is too small | expand

Commit Message

Namjae Jeon May 16, 2022, 7:41 a.m. UTC
Add 'smbd max io size' parameter to adjust smbd-direct max read/write
size.

Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
---
 fs/ksmbd/ksmbd_netlink.h  | 3 ++-
 fs/ksmbd/transport_ipc.c  | 3 +++
 fs/ksmbd/transport_rdma.c | 8 +++++++-
 fs/ksmbd/transport_rdma.h | 6 ++++++
 4 files changed, 18 insertions(+), 2 deletions(-)

Comments

Hyunchul Lee May 17, 2022, 8:06 a.m. UTC | #1
2022년 5월 16일 (월) 오후 4:42, Namjae Jeon <linkinjeon@kernel.org>님이 작성:
>
> Add 'smbd max io size' parameter to adjust smbd-direct max read/write
> size.
>
> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
> ---

Looks good to me.
Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>

>  fs/ksmbd/ksmbd_netlink.h  | 3 ++-
>  fs/ksmbd/transport_ipc.c  | 3 +++
>  fs/ksmbd/transport_rdma.c | 8 +++++++-
>  fs/ksmbd/transport_rdma.h | 6 ++++++
>  4 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/fs/ksmbd/ksmbd_netlink.h b/fs/ksmbd/ksmbd_netlink.h
> index ebe6ca08467a..52aa0adeb951 100644
> --- a/fs/ksmbd/ksmbd_netlink.h
> +++ b/fs/ksmbd/ksmbd_netlink.h
> @@ -104,7 +104,8 @@ struct ksmbd_startup_request {
>                                          */
>         __u32   sub_auth[3];            /* Subauth value for Security ID */
>         __u32   smb2_max_credits;       /* MAX credits */
> -       __u32   reserved[128];          /* Reserved room */
> +       __u32   smbd_max_io_size;       /* smbd read write size */
> +       __u32   reserved[127];          /* Reserved room */
>         __u32   ifc_list_sz;            /* interfaces list size */
>         __s8    ____payload[];
>  };
> diff --git a/fs/ksmbd/transport_ipc.c b/fs/ksmbd/transport_ipc.c
> index 3ad6881e0f7e..7cb0eeb07c80 100644
> --- a/fs/ksmbd/transport_ipc.c
> +++ b/fs/ksmbd/transport_ipc.c
> @@ -26,6 +26,7 @@
>  #include "mgmt/ksmbd_ida.h"
>  #include "connection.h"
>  #include "transport_tcp.h"
> +#include "transport_rdma.h"
>
>  #define IPC_WAIT_TIMEOUT       (2 * HZ)
>
> @@ -303,6 +304,8 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
>                 init_smb2_max_trans_size(req->smb2_max_trans);
>         if (req->smb2_max_credits)
>                 init_smb2_max_credits(req->smb2_max_credits);
> +       if (req->smbd_max_io_size)
> +               init_smbd_max_io_size(req->smbd_max_io_size);
>
>         ret = ksmbd_set_netbios_name(req->netbios_name);
>         ret |= ksmbd_set_server_string(req->server_string);
> diff --git a/fs/ksmbd/transport_rdma.c b/fs/ksmbd/transport_rdma.c
> index 19a605fd46ff..6d652ff38b82 100644
> --- a/fs/ksmbd/transport_rdma.c
> +++ b/fs/ksmbd/transport_rdma.c
> @@ -80,7 +80,7 @@ static int smb_direct_max_fragmented_recv_size = 1024 * 1024;
>  /*  The maximum single-message size which can be received */
>  static int smb_direct_max_receive_size = 8192;
>
> -static int smb_direct_max_read_write_size = 8 * 1024 * 1024;
> +static int smb_direct_max_read_write_size = SMBD_DEFAULT_IOSIZE;
>
>  static LIST_HEAD(smb_direct_device_list);
>  static DEFINE_RWLOCK(smb_direct_device_lock);
> @@ -214,6 +214,12 @@ struct smb_direct_rdma_rw_msg {
>         struct scatterlist      sg_list[];
>  };
>
> +void init_smbd_max_io_size(unsigned int sz)
> +{
> +       sz = clamp_val(sz, SMBD_MIN_IOSIZE, SMBD_MAX_IOSIZE);
> +       smb_direct_max_read_write_size = sz;
> +}
> +
>  static inline int get_buf_page_count(void *buf, int size)
>  {
>         return DIV_ROUND_UP((uintptr_t)buf + size, PAGE_SIZE) -
> diff --git a/fs/ksmbd/transport_rdma.h b/fs/ksmbd/transport_rdma.h
> index 5567d93a6f96..e7b4e6790fab 100644
> --- a/fs/ksmbd/transport_rdma.h
> +++ b/fs/ksmbd/transport_rdma.h
> @@ -7,6 +7,10 @@
>  #ifndef __KSMBD_TRANSPORT_RDMA_H__
>  #define __KSMBD_TRANSPORT_RDMA_H__
>
> +#define SMBD_DEFAULT_IOSIZE (8 * 1024 * 1024)
> +#define SMBD_MIN_IOSIZE (512 * 1024)
> +#define SMBD_MAX_IOSIZE (16 * 1024 * 1024)
> +
>  /* SMB DIRECT negotiation request packet [MS-SMBD] 2.2.1 */
>  struct smb_direct_negotiate_req {
>         __le16 min_version;
> @@ -52,10 +56,12 @@ struct smb_direct_data_transfer {
>  int ksmbd_rdma_init(void);
>  void ksmbd_rdma_destroy(void);
>  bool ksmbd_rdma_capable_netdev(struct net_device *netdev);
> +void init_smbd_max_io_size(unsigned int sz);
>  #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; }
> +static inline void init_smbd_max_io_size(unsigned int sz) { }
>  #endif
>
>  #endif /* __KSMBD_TRANSPORT_RDMA_H__ */
> --
> 2.25.1
>
diff mbox series

Patch

diff --git a/fs/ksmbd/ksmbd_netlink.h b/fs/ksmbd/ksmbd_netlink.h
index ebe6ca08467a..52aa0adeb951 100644
--- a/fs/ksmbd/ksmbd_netlink.h
+++ b/fs/ksmbd/ksmbd_netlink.h
@@ -104,7 +104,8 @@  struct ksmbd_startup_request {
 					 */
 	__u32	sub_auth[3];		/* Subauth value for Security ID */
 	__u32	smb2_max_credits;	/* MAX credits */
-	__u32	reserved[128];		/* Reserved room */
+	__u32	smbd_max_io_size;	/* smbd read write size */
+	__u32	reserved[127];		/* Reserved room */
 	__u32	ifc_list_sz;		/* interfaces list size */
 	__s8	____payload[];
 };
diff --git a/fs/ksmbd/transport_ipc.c b/fs/ksmbd/transport_ipc.c
index 3ad6881e0f7e..7cb0eeb07c80 100644
--- a/fs/ksmbd/transport_ipc.c
+++ b/fs/ksmbd/transport_ipc.c
@@ -26,6 +26,7 @@ 
 #include "mgmt/ksmbd_ida.h"
 #include "connection.h"
 #include "transport_tcp.h"
+#include "transport_rdma.h"
 
 #define IPC_WAIT_TIMEOUT	(2 * HZ)
 
@@ -303,6 +304,8 @@  static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
 		init_smb2_max_trans_size(req->smb2_max_trans);
 	if (req->smb2_max_credits)
 		init_smb2_max_credits(req->smb2_max_credits);
+	if (req->smbd_max_io_size)
+		init_smbd_max_io_size(req->smbd_max_io_size);
 
 	ret = ksmbd_set_netbios_name(req->netbios_name);
 	ret |= ksmbd_set_server_string(req->server_string);
diff --git a/fs/ksmbd/transport_rdma.c b/fs/ksmbd/transport_rdma.c
index 19a605fd46ff..6d652ff38b82 100644
--- a/fs/ksmbd/transport_rdma.c
+++ b/fs/ksmbd/transport_rdma.c
@@ -80,7 +80,7 @@  static int smb_direct_max_fragmented_recv_size = 1024 * 1024;
 /*  The maximum single-message size which can be received */
 static int smb_direct_max_receive_size = 8192;
 
-static int smb_direct_max_read_write_size = 8 * 1024 * 1024;
+static int smb_direct_max_read_write_size = SMBD_DEFAULT_IOSIZE;
 
 static LIST_HEAD(smb_direct_device_list);
 static DEFINE_RWLOCK(smb_direct_device_lock);
@@ -214,6 +214,12 @@  struct smb_direct_rdma_rw_msg {
 	struct scatterlist	sg_list[];
 };
 
+void init_smbd_max_io_size(unsigned int sz)
+{
+	sz = clamp_val(sz, SMBD_MIN_IOSIZE, SMBD_MAX_IOSIZE);
+	smb_direct_max_read_write_size = sz;
+}
+
 static inline int get_buf_page_count(void *buf, int size)
 {
 	return DIV_ROUND_UP((uintptr_t)buf + size, PAGE_SIZE) -
diff --git a/fs/ksmbd/transport_rdma.h b/fs/ksmbd/transport_rdma.h
index 5567d93a6f96..e7b4e6790fab 100644
--- a/fs/ksmbd/transport_rdma.h
+++ b/fs/ksmbd/transport_rdma.h
@@ -7,6 +7,10 @@ 
 #ifndef __KSMBD_TRANSPORT_RDMA_H__
 #define __KSMBD_TRANSPORT_RDMA_H__
 
+#define SMBD_DEFAULT_IOSIZE (8 * 1024 * 1024)
+#define SMBD_MIN_IOSIZE (512 * 1024)
+#define SMBD_MAX_IOSIZE (16 * 1024 * 1024)
+
 /* SMB DIRECT negotiation request packet [MS-SMBD] 2.2.1 */
 struct smb_direct_negotiate_req {
 	__le16 min_version;
@@ -52,10 +56,12 @@  struct smb_direct_data_transfer {
 int ksmbd_rdma_init(void);
 void ksmbd_rdma_destroy(void);
 bool ksmbd_rdma_capable_netdev(struct net_device *netdev);
+void init_smbd_max_io_size(unsigned int sz);
 #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; }
+static inline void init_smbd_max_io_size(unsigned int sz) { }
 #endif
 
 #endif /* __KSMBD_TRANSPORT_RDMA_H__ */