Message ID | 20220516074140.28522-2-linkinjeon@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [1/3] ksmbd: handle smb2 query dir request for OutputBufferLength that is too small | expand |
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 --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__ */
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(-)