lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 1051/1095] ksmbd: add smbd max io size parameter
    Date
    From: Namjae Jeon <linkinjeon@kernel.org>

    [ Upstream commit 65bb45b97b578c8eed1ffa80caec84708df49729 ]

    Add 'smbd max io size' parameter to adjust smbd-direct max read/write
    size.

    Signed-off-by: Namjae Jeon <linkinjeon@kernel.org>
    Reviewed-by: Hyunchul Lee <hyc.lee@gmail.com>
    Signed-off-by: Steve French <stfrench@microsoft.com>
    Signed-off-by: Sasha Levin <sashal@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(-)

    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 b44a5e584bac..afc66b9765e7 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.35.1


    \
     
     \ /
      Last update: 2022-08-16 01:38    [W:4.140 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site