* [PATCH 1/4] ksmbd: register ksmbd ib client with ib_register_client() @ 2021-12-29 14:14 Namjae Jeon 2021-12-29 14:14 ` [PATCH 2/4] ksmbd: set 445 port to smbdirect port by default Namjae Jeon ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: Namjae Jeon @ 2021-12-29 14:14 UTC (permalink / raw) To: linux-cifs; +Cc: Namjae Jeon, Hyunchul Lee From: Hyunchul Lee <hyc.lee@gmail.com> Register ksmbd ib client with ib_register_client() to find the rdma capable network adapter. If ops.get_netdev(Chelsio NICs) is NULL, ksmbd will find it using ib_device_get_by_netdev in old way. Signed-off-by: Hyunchul Lee <hyc.lee@gmail.com> Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> --- fs/ksmbd/transport_rdma.c | 107 ++++++++++++++++++++++++++++++++++---- fs/ksmbd/transport_rdma.h | 2 +- 2 files changed, 98 insertions(+), 11 deletions(-) diff --git a/fs/ksmbd/transport_rdma.c b/fs/ksmbd/transport_rdma.c index 7e57cbb0bb35..339fa4f025f7 100644 --- a/fs/ksmbd/transport_rdma.c +++ b/fs/ksmbd/transport_rdma.c @@ -79,6 +79,14 @@ static int smb_direct_max_read_write_size = 1024 * 1024; static int smb_direct_max_outstanding_rw_ops = 8; +static LIST_HEAD(smb_direct_device_list); +static DEFINE_RWLOCK(smb_direct_device_lock); + +struct smb_direct_device { + struct ib_device *ib_dev; + struct list_head list; +}; + static struct smb_direct_listener { struct rdma_cm_id *cm_id; } smb_direct_listener; @@ -2007,12 +2015,61 @@ static int smb_direct_listen(int port) return ret; } +static int smb_direct_ib_client_add(struct ib_device *ib_dev) +{ + struct smb_direct_device *smb_dev; + + if (!ib_dev->ops.get_netdev || + !rdma_frwr_is_supported(&ib_dev->attrs)) + return 0; + + smb_dev = kzalloc(sizeof(*smb_dev), GFP_KERNEL); + if (!smb_dev) + return -ENOMEM; + smb_dev->ib_dev = ib_dev; + + write_lock(&smb_direct_device_lock); + list_add(&smb_dev->list, &smb_direct_device_list); + write_unlock(&smb_direct_device_lock); + + ksmbd_debug(RDMA, "ib device added: name %s\n", ib_dev->name); + return 0; +} + +static void smb_direct_ib_client_remove(struct ib_device *ib_dev, + void *client_data) +{ + struct smb_direct_device *smb_dev, *tmp; + + write_lock(&smb_direct_device_lock); + list_for_each_entry_safe(smb_dev, tmp, &smb_direct_device_list, list) { + if (smb_dev->ib_dev == ib_dev) { + list_del(&smb_dev->list); + kfree(smb_dev); + break; + } + } + write_unlock(&smb_direct_device_lock); +} + +static struct ib_client smb_direct_ib_client = { + .name = "ksmbd_smb_direct_ib", + .add = smb_direct_ib_client_add, + .remove = smb_direct_ib_client_remove, +}; + int ksmbd_rdma_init(void) { int ret; smb_direct_listener.cm_id = NULL; + ret = ib_register_client(&smb_direct_ib_client); + if (ret) { + pr_err("failed to ib_register_client\n"); + return ret; + } + /* When a client is running out of send credits, the credits are * granted by the server's sending a packet using this queue. * This avoids the situation that a clients cannot send packets @@ -2036,30 +2093,60 @@ int ksmbd_rdma_init(void) return 0; } -int ksmbd_rdma_destroy(void) +void ksmbd_rdma_destroy(void) { - if (smb_direct_listener.cm_id) - rdma_destroy_id(smb_direct_listener.cm_id); + if (!smb_direct_listener.cm_id) + return; + + ib_unregister_client(&smb_direct_ib_client); + rdma_destroy_id(smb_direct_listener.cm_id); + smb_direct_listener.cm_id = NULL; if (smb_direct_wq) { destroy_workqueue(smb_direct_wq); smb_direct_wq = NULL; } - return 0; } bool ksmbd_rdma_capable_netdev(struct net_device *netdev) { - struct ib_device *ibdev; + struct smb_direct_device *smb_dev; + int i; 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); + read_lock(&smb_direct_device_lock); + list_for_each_entry(smb_dev, &smb_direct_device_list, list) { + for (i = 0; i < smb_dev->ib_dev->phys_port_cnt; i++) { + struct net_device *ndev; + + ndev = smb_dev->ib_dev->ops.get_netdev(smb_dev->ib_dev, + i + 1); + if (!ndev) + continue; + + if (ndev == netdev) { + dev_put(ndev); + rdma_capable = true; + goto out; + } + dev_put(ndev); + } + } +out: + read_unlock(&smb_direct_device_lock); + + if (rdma_capable == false) { + struct ib_device *ibdev; + + 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; } diff --git a/fs/ksmbd/transport_rdma.h b/fs/ksmbd/transport_rdma.h index 0fa8adc0776f..ab9250a7cb86 100644 --- a/fs/ksmbd/transport_rdma.h +++ b/fs/ksmbd/transport_rdma.h @@ -52,7 +52,7 @@ struct smb_direct_data_transfer { #ifdef CONFIG_SMB_SERVER_SMBDIRECT int ksmbd_rdma_init(void); -int ksmbd_rdma_destroy(void); +void ksmbd_rdma_destroy(void); bool ksmbd_rdma_capable_netdev(struct net_device *netdev); #else static inline int ksmbd_rdma_init(void) { return 0; } -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 2/4] ksmbd: set 445 port to smbdirect port by default 2021-12-29 14:14 [PATCH 1/4] ksmbd: register ksmbd ib client with ib_register_client() Namjae Jeon @ 2021-12-29 14:14 ` Namjae Jeon 2021-12-29 14:14 ` [PATCH 3/4] ksmbd: add support for smb2 max credit parameter Namjae Jeon 2021-12-29 14:14 ` [PATCH 4/4] ksmbd: move credit charge deduction under processing request Namjae Jeon 2 siblings, 0 replies; 5+ messages in thread From: Namjae Jeon @ 2021-12-29 14:14 UTC (permalink / raw) To: linux-cifs; +Cc: Namjae Jeon When SMB Direct is used with iWARP, Windows use 5445 port for smb direct port, 445 port for SMB. This patch check ib_device using ib_client to know if NICs type is iWARP or Infiniband. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> --- fs/ksmbd/transport_rdma.c | 15 ++++++++++++--- fs/ksmbd/transport_rdma.h | 2 -- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/ksmbd/transport_rdma.c b/fs/ksmbd/transport_rdma.c index 339fa4f025f7..f89b64e27836 100644 --- a/fs/ksmbd/transport_rdma.c +++ b/fs/ksmbd/transport_rdma.c @@ -34,7 +34,8 @@ #include "smbstatus.h" #include "transport_rdma.h" -#define SMB_DIRECT_PORT 5445 +#define SMB_DIRECT_PORT_IWARP 5445 +#define SMB_DIRECT_PORT_INFINIBAND 445 #define SMB_DIRECT_VERSION_LE cpu_to_le16(0x0100) @@ -60,6 +61,10 @@ * as defined in [MS-SMBD] 3.1.1.1 * Those may change after a SMB_DIRECT negotiation */ + +/* Set 445 port to SMB Direct port by default */ +static int smb_direct_port = SMB_DIRECT_PORT_INFINIBAND; + /* The local peer's maximum number of credits to grant to the peer */ static int smb_direct_receive_credit_max = 255; @@ -1942,7 +1947,7 @@ static int smb_direct_handle_connect_request(struct rdma_cm_id *new_cm_id) KSMBD_TRANS(t)->handler = kthread_run(ksmbd_conn_handler_loop, KSMBD_TRANS(t)->conn, "ksmbd:r%u", - SMB_DIRECT_PORT); + smb_direct_port); if (IS_ERR(KSMBD_TRANS(t)->handler)) { int ret = PTR_ERR(KSMBD_TRANS(t)->handler); @@ -2019,6 +2024,10 @@ static int smb_direct_ib_client_add(struct ib_device *ib_dev) { struct smb_direct_device *smb_dev; + /* Set 5445 port if device type is iWARP(No IB) */ + if (ib_dev->node_type != RDMA_NODE_IB_CA) + smb_direct_port = SMB_DIRECT_PORT_IWARP; + if (!ib_dev->ops.get_netdev || !rdma_frwr_is_supported(&ib_dev->attrs)) return 0; @@ -2080,7 +2089,7 @@ int ksmbd_rdma_init(void) if (!smb_direct_wq) return -ENOMEM; - ret = smb_direct_listen(SMB_DIRECT_PORT); + ret = smb_direct_listen(smb_direct_port); if (ret) { destroy_workqueue(smb_direct_wq); smb_direct_wq = NULL; diff --git a/fs/ksmbd/transport_rdma.h b/fs/ksmbd/transport_rdma.h index ab9250a7cb86..5567d93a6f96 100644 --- a/fs/ksmbd/transport_rdma.h +++ b/fs/ksmbd/transport_rdma.h @@ -7,8 +7,6 @@ #ifndef __KSMBD_TRANSPORT_RDMA_H__ #define __KSMBD_TRANSPORT_RDMA_H__ -#define SMB_DIRECT_PORT 5445 - /* SMB DIRECT negotiation request packet [MS-SMBD] 2.2.1 */ struct smb_direct_negotiate_req { __le16 min_version; -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH 3/4] ksmbd: add support for smb2 max credit parameter 2021-12-29 14:14 [PATCH 1/4] ksmbd: register ksmbd ib client with ib_register_client() Namjae Jeon 2021-12-29 14:14 ` [PATCH 2/4] ksmbd: set 445 port to smbdirect port by default Namjae Jeon @ 2021-12-29 14:14 ` Namjae Jeon 2021-12-30 22:00 ` Hyunchul Lee 2021-12-29 14:14 ` [PATCH 4/4] ksmbd: move credit charge deduction under processing request Namjae Jeon 2 siblings, 1 reply; 5+ messages in thread From: Namjae Jeon @ 2021-12-29 14:14 UTC (permalink / raw) To: linux-cifs; +Cc: Namjae Jeon Add smb2 max credits parameter to adjust maximum credits value to limit number of outstanding requests. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> --- fs/ksmbd/connection.h | 1 - fs/ksmbd/ksmbd_netlink.h | 1 + fs/ksmbd/smb2misc.c | 2 +- fs/ksmbd/smb2ops.c | 16 ++++++++++++---- fs/ksmbd/smb2pdu.c | 8 ++++---- fs/ksmbd/smb2pdu.h | 1 + fs/ksmbd/smb_common.h | 1 + fs/ksmbd/transport_ipc.c | 2 ++ 8 files changed, 22 insertions(+), 10 deletions(-) diff --git a/fs/ksmbd/connection.h b/fs/ksmbd/connection.h index 72dfd155b5bf..42ffb6d9c5d8 100644 --- a/fs/ksmbd/connection.h +++ b/fs/ksmbd/connection.h @@ -62,7 +62,6 @@ struct ksmbd_conn { /* References which are made for this Server object*/ atomic_t r_count; unsigned short total_credits; - unsigned short max_credits; spinlock_t credits_lock; wait_queue_head_t req_running_q; /* Lock to protect requests list*/ diff --git a/fs/ksmbd/ksmbd_netlink.h b/fs/ksmbd/ksmbd_netlink.h index c6718a05d347..a5c2861792ae 100644 --- a/fs/ksmbd/ksmbd_netlink.h +++ b/fs/ksmbd/ksmbd_netlink.h @@ -103,6 +103,7 @@ struct ksmbd_startup_request { * we set the SPARSE_FILES bit (0x40). */ __u32 sub_auth[3]; /* Subauth value for Security ID */ + __u32 smb2_max_credits; /* MAX credits */ __u32 ifc_list_sz; /* interfaces list size */ __s8 ____payload[]; }; diff --git a/fs/ksmbd/smb2misc.c b/fs/ksmbd/smb2misc.c index 50d0b1022289..6892d1822269 100644 --- a/fs/ksmbd/smb2misc.c +++ b/fs/ksmbd/smb2misc.c @@ -326,7 +326,7 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn, ksmbd_debug(SMB, "Insufficient credit charge, given: %d, needed: %d\n", credit_charge, calc_credit_num); return 1; - } else if (credit_charge > conn->max_credits) { + } else if (credit_charge > conn->vals->max_credits) { ksmbd_debug(SMB, "Too large credit charge: %d\n", credit_charge); return 1; } diff --git a/fs/ksmbd/smb2ops.c b/fs/ksmbd/smb2ops.c index 02a44d28bdaf..ab23da2120b9 100644 --- a/fs/ksmbd/smb2ops.c +++ b/fs/ksmbd/smb2ops.c @@ -19,6 +19,7 @@ static struct smb_version_values smb21_server_values = { .max_read_size = SMB21_DEFAULT_IOSIZE, .max_write_size = SMB21_DEFAULT_IOSIZE, .max_trans_size = SMB21_DEFAULT_IOSIZE, + .max_credits = SMB2_MAX_CREDITS, .large_lock_type = 0, .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, .shared_lock_type = SMB2_LOCKFLAG_SHARED, @@ -44,6 +45,7 @@ static struct smb_version_values smb30_server_values = { .max_read_size = SMB3_DEFAULT_IOSIZE, .max_write_size = SMB3_DEFAULT_IOSIZE, .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, + .max_credits = SMB2_MAX_CREDITS, .large_lock_type = 0, .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, .shared_lock_type = SMB2_LOCKFLAG_SHARED, @@ -70,6 +72,7 @@ static struct smb_version_values smb302_server_values = { .max_read_size = SMB3_DEFAULT_IOSIZE, .max_write_size = SMB3_DEFAULT_IOSIZE, .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, + .max_credits = SMB2_MAX_CREDITS, .large_lock_type = 0, .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, .shared_lock_type = SMB2_LOCKFLAG_SHARED, @@ -96,6 +99,7 @@ static struct smb_version_values smb311_server_values = { .max_read_size = SMB3_DEFAULT_IOSIZE, .max_write_size = SMB3_DEFAULT_IOSIZE, .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, + .max_credits = SMB2_MAX_CREDITS, .large_lock_type = 0, .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, .shared_lock_type = SMB2_LOCKFLAG_SHARED, @@ -197,7 +201,6 @@ void init_smb2_1_server(struct ksmbd_conn *conn) conn->ops = &smb2_0_server_ops; conn->cmds = smb2_0_server_cmds; conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); - conn->max_credits = SMB2_MAX_CREDITS; conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE; if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) @@ -215,7 +218,6 @@ void init_smb3_0_server(struct ksmbd_conn *conn) conn->ops = &smb3_0_server_ops; conn->cmds = smb2_0_server_cmds; conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); - conn->max_credits = SMB2_MAX_CREDITS; conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) @@ -240,7 +242,6 @@ void init_smb3_02_server(struct ksmbd_conn *conn) conn->ops = &smb3_0_server_ops; conn->cmds = smb2_0_server_cmds; conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); - conn->max_credits = SMB2_MAX_CREDITS; conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) @@ -265,7 +266,6 @@ int init_smb3_11_server(struct ksmbd_conn *conn) conn->ops = &smb3_11_server_ops; conn->cmds = smb2_0_server_cmds; conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); - conn->max_credits = SMB2_MAX_CREDITS; conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) @@ -304,3 +304,11 @@ void init_smb2_max_trans_size(unsigned int sz) smb302_server_values.max_trans_size = sz; smb311_server_values.max_trans_size = sz; } + +void init_smb2_max_credits(unsigned int sz) +{ + smb21_server_values.max_credits = sz; + smb30_server_values.max_credits = sz; + smb302_server_values.max_credits = sz; + smb311_server_values.max_credits = sz; +} diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c index b00108921bbb..860fe3a03ad7 100644 --- a/fs/ksmbd/smb2pdu.c +++ b/fs/ksmbd/smb2pdu.c @@ -308,7 +308,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) hdr->CreditCharge = req_hdr->CreditCharge; - if (conn->total_credits > conn->max_credits) { + if (conn->total_credits > conn->vals->max_credits) { hdr->CreditRequest = 0; pr_err("Total credits overflow: %d\n", conn->total_credits); return -EINVAL; @@ -329,12 +329,12 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) if (hdr->Command == SMB2_NEGOTIATE) aux_max = 0; else - aux_max = conn->max_credits - credit_charge; + aux_max = conn->vals->max_credits - credit_charge; aux_credits = min_t(unsigned short, aux_credits, aux_max); credits_granted = credit_charge + aux_credits; - if (conn->max_credits - conn->total_credits < credits_granted) - credits_granted = conn->max_credits - + if (conn->vals->max_credits - conn->total_credits < credits_granted) + credits_granted = conn->vals->max_credits - conn->total_credits; conn->total_credits += credits_granted; diff --git a/fs/ksmbd/smb2pdu.h b/fs/ksmbd/smb2pdu.h index 4a3e4339d4c4..725b800c29c8 100644 --- a/fs/ksmbd/smb2pdu.h +++ b/fs/ksmbd/smb2pdu.h @@ -980,6 +980,7 @@ int init_smb3_11_server(struct ksmbd_conn *conn); void init_smb2_max_read_size(unsigned int sz); void init_smb2_max_write_size(unsigned int sz); void init_smb2_max_trans_size(unsigned int sz); +void init_smb2_max_credits(unsigned int sz); bool is_smb2_neg_cmd(struct ksmbd_work *work); bool is_smb2_rsp(struct ksmbd_work *work); diff --git a/fs/ksmbd/smb_common.h b/fs/ksmbd/smb_common.h index 50590842b651..e1369b4345a9 100644 --- a/fs/ksmbd/smb_common.h +++ b/fs/ksmbd/smb_common.h @@ -365,6 +365,7 @@ struct smb_version_values { __u32 max_read_size; __u32 max_write_size; __u32 max_trans_size; + __u32 max_credits; __u32 large_lock_type; __u32 exclusive_lock_type; __u32 shared_lock_type; diff --git a/fs/ksmbd/transport_ipc.c b/fs/ksmbd/transport_ipc.c index 1acf1892a466..3ad6881e0f7e 100644 --- a/fs/ksmbd/transport_ipc.c +++ b/fs/ksmbd/transport_ipc.c @@ -301,6 +301,8 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req) init_smb2_max_write_size(req->smb2_max_write); if (req->smb2_max_trans) init_smb2_max_trans_size(req->smb2_max_trans); + if (req->smb2_max_credits) + init_smb2_max_credits(req->smb2_max_credits); ret = ksmbd_set_netbios_name(req->netbios_name); ret |= ksmbd_set_server_string(req->server_string); -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH 3/4] ksmbd: add support for smb2 max credit parameter 2021-12-29 14:14 ` [PATCH 3/4] ksmbd: add support for smb2 max credit parameter Namjae Jeon @ 2021-12-30 22:00 ` Hyunchul Lee 0 siblings, 0 replies; 5+ messages in thread From: Hyunchul Lee @ 2021-12-30 22:00 UTC (permalink / raw) To: Namjae Jeon; +Cc: linux-cifs 2021년 12월 31일 (금) 오전 2:55, Namjae Jeon <linkinjeon@kernel.org>님이 작성: > > Add smb2 max credits parameter to adjust maximum credits value to limit > number of outstanding requests. > > Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> Acked-by: Hyunchul Lee <hyc.lee@gmail.com> > --- > fs/ksmbd/connection.h | 1 - > fs/ksmbd/ksmbd_netlink.h | 1 + > fs/ksmbd/smb2misc.c | 2 +- > fs/ksmbd/smb2ops.c | 16 ++++++++++++---- > fs/ksmbd/smb2pdu.c | 8 ++++---- > fs/ksmbd/smb2pdu.h | 1 + > fs/ksmbd/smb_common.h | 1 + > fs/ksmbd/transport_ipc.c | 2 ++ > 8 files changed, 22 insertions(+), 10 deletions(-) > > diff --git a/fs/ksmbd/connection.h b/fs/ksmbd/connection.h > index 72dfd155b5bf..42ffb6d9c5d8 100644 > --- a/fs/ksmbd/connection.h > +++ b/fs/ksmbd/connection.h > @@ -62,7 +62,6 @@ struct ksmbd_conn { > /* References which are made for this Server object*/ > atomic_t r_count; > unsigned short total_credits; > - unsigned short max_credits; > spinlock_t credits_lock; > wait_queue_head_t req_running_q; > /* Lock to protect requests list*/ > diff --git a/fs/ksmbd/ksmbd_netlink.h b/fs/ksmbd/ksmbd_netlink.h > index c6718a05d347..a5c2861792ae 100644 > --- a/fs/ksmbd/ksmbd_netlink.h > +++ b/fs/ksmbd/ksmbd_netlink.h > @@ -103,6 +103,7 @@ struct ksmbd_startup_request { > * we set the SPARSE_FILES bit (0x40). > */ > __u32 sub_auth[3]; /* Subauth value for Security ID */ > + __u32 smb2_max_credits; /* MAX credits */ > __u32 ifc_list_sz; /* interfaces list size */ > __s8 ____payload[]; > }; > diff --git a/fs/ksmbd/smb2misc.c b/fs/ksmbd/smb2misc.c > index 50d0b1022289..6892d1822269 100644 > --- a/fs/ksmbd/smb2misc.c > +++ b/fs/ksmbd/smb2misc.c > @@ -326,7 +326,7 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn, > ksmbd_debug(SMB, "Insufficient credit charge, given: %d, needed: %d\n", > credit_charge, calc_credit_num); > return 1; > - } else if (credit_charge > conn->max_credits) { > + } else if (credit_charge > conn->vals->max_credits) { > ksmbd_debug(SMB, "Too large credit charge: %d\n", credit_charge); > return 1; > } > diff --git a/fs/ksmbd/smb2ops.c b/fs/ksmbd/smb2ops.c > index 02a44d28bdaf..ab23da2120b9 100644 > --- a/fs/ksmbd/smb2ops.c > +++ b/fs/ksmbd/smb2ops.c > @@ -19,6 +19,7 @@ static struct smb_version_values smb21_server_values = { > .max_read_size = SMB21_DEFAULT_IOSIZE, > .max_write_size = SMB21_DEFAULT_IOSIZE, > .max_trans_size = SMB21_DEFAULT_IOSIZE, > + .max_credits = SMB2_MAX_CREDITS, > .large_lock_type = 0, > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, > .shared_lock_type = SMB2_LOCKFLAG_SHARED, > @@ -44,6 +45,7 @@ static struct smb_version_values smb30_server_values = { > .max_read_size = SMB3_DEFAULT_IOSIZE, > .max_write_size = SMB3_DEFAULT_IOSIZE, > .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, > + .max_credits = SMB2_MAX_CREDITS, > .large_lock_type = 0, > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, > .shared_lock_type = SMB2_LOCKFLAG_SHARED, > @@ -70,6 +72,7 @@ static struct smb_version_values smb302_server_values = { > .max_read_size = SMB3_DEFAULT_IOSIZE, > .max_write_size = SMB3_DEFAULT_IOSIZE, > .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, > + .max_credits = SMB2_MAX_CREDITS, > .large_lock_type = 0, > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, > .shared_lock_type = SMB2_LOCKFLAG_SHARED, > @@ -96,6 +99,7 @@ static struct smb_version_values smb311_server_values = { > .max_read_size = SMB3_DEFAULT_IOSIZE, > .max_write_size = SMB3_DEFAULT_IOSIZE, > .max_trans_size = SMB3_DEFAULT_TRANS_SIZE, > + .max_credits = SMB2_MAX_CREDITS, > .large_lock_type = 0, > .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE, > .shared_lock_type = SMB2_LOCKFLAG_SHARED, > @@ -197,7 +201,6 @@ void init_smb2_1_server(struct ksmbd_conn *conn) > conn->ops = &smb2_0_server_ops; > conn->cmds = smb2_0_server_cmds; > conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); > - conn->max_credits = SMB2_MAX_CREDITS; > conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE; > > if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) > @@ -215,7 +218,6 @@ void init_smb3_0_server(struct ksmbd_conn *conn) > conn->ops = &smb3_0_server_ops; > conn->cmds = smb2_0_server_cmds; > conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); > - conn->max_credits = SMB2_MAX_CREDITS; > conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; > > if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) > @@ -240,7 +242,6 @@ void init_smb3_02_server(struct ksmbd_conn *conn) > conn->ops = &smb3_0_server_ops; > conn->cmds = smb2_0_server_cmds; > conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); > - conn->max_credits = SMB2_MAX_CREDITS; > conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; > > if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) > @@ -265,7 +266,6 @@ int init_smb3_11_server(struct ksmbd_conn *conn) > conn->ops = &smb3_11_server_ops; > conn->cmds = smb2_0_server_cmds; > conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds); > - conn->max_credits = SMB2_MAX_CREDITS; > conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE; > > if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES) > @@ -304,3 +304,11 @@ void init_smb2_max_trans_size(unsigned int sz) > smb302_server_values.max_trans_size = sz; > smb311_server_values.max_trans_size = sz; > } > + > +void init_smb2_max_credits(unsigned int sz) > +{ > + smb21_server_values.max_credits = sz; > + smb30_server_values.max_credits = sz; > + smb302_server_values.max_credits = sz; > + smb311_server_values.max_credits = sz; > +} > diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c > index b00108921bbb..860fe3a03ad7 100644 > --- a/fs/ksmbd/smb2pdu.c > +++ b/fs/ksmbd/smb2pdu.c > @@ -308,7 +308,7 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) > > hdr->CreditCharge = req_hdr->CreditCharge; > > - if (conn->total_credits > conn->max_credits) { > + if (conn->total_credits > conn->vals->max_credits) { > hdr->CreditRequest = 0; > pr_err("Total credits overflow: %d\n", conn->total_credits); > return -EINVAL; > @@ -329,12 +329,12 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) > if (hdr->Command == SMB2_NEGOTIATE) > aux_max = 0; > else > - aux_max = conn->max_credits - credit_charge; > + aux_max = conn->vals->max_credits - credit_charge; > aux_credits = min_t(unsigned short, aux_credits, aux_max); > credits_granted = credit_charge + aux_credits; > > - if (conn->max_credits - conn->total_credits < credits_granted) > - credits_granted = conn->max_credits - > + if (conn->vals->max_credits - conn->total_credits < credits_granted) > + credits_granted = conn->vals->max_credits - > conn->total_credits; > > conn->total_credits += credits_granted; > diff --git a/fs/ksmbd/smb2pdu.h b/fs/ksmbd/smb2pdu.h > index 4a3e4339d4c4..725b800c29c8 100644 > --- a/fs/ksmbd/smb2pdu.h > +++ b/fs/ksmbd/smb2pdu.h > @@ -980,6 +980,7 @@ int init_smb3_11_server(struct ksmbd_conn *conn); > void init_smb2_max_read_size(unsigned int sz); > void init_smb2_max_write_size(unsigned int sz); > void init_smb2_max_trans_size(unsigned int sz); > +void init_smb2_max_credits(unsigned int sz); > > bool is_smb2_neg_cmd(struct ksmbd_work *work); > bool is_smb2_rsp(struct ksmbd_work *work); > diff --git a/fs/ksmbd/smb_common.h b/fs/ksmbd/smb_common.h > index 50590842b651..e1369b4345a9 100644 > --- a/fs/ksmbd/smb_common.h > +++ b/fs/ksmbd/smb_common.h > @@ -365,6 +365,7 @@ struct smb_version_values { > __u32 max_read_size; > __u32 max_write_size; > __u32 max_trans_size; > + __u32 max_credits; > __u32 large_lock_type; > __u32 exclusive_lock_type; > __u32 shared_lock_type; > diff --git a/fs/ksmbd/transport_ipc.c b/fs/ksmbd/transport_ipc.c > index 1acf1892a466..3ad6881e0f7e 100644 > --- a/fs/ksmbd/transport_ipc.c > +++ b/fs/ksmbd/transport_ipc.c > @@ -301,6 +301,8 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req) > init_smb2_max_write_size(req->smb2_max_write); > if (req->smb2_max_trans) > init_smb2_max_trans_size(req->smb2_max_trans); > + if (req->smb2_max_credits) > + init_smb2_max_credits(req->smb2_max_credits); > > ret = ksmbd_set_netbios_name(req->netbios_name); > ret |= ksmbd_set_server_string(req->server_string); > -- > 2.25.1 > -- Thanks, Hyunchul ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH 4/4] ksmbd: move credit charge deduction under processing request 2021-12-29 14:14 [PATCH 1/4] ksmbd: register ksmbd ib client with ib_register_client() Namjae Jeon 2021-12-29 14:14 ` [PATCH 2/4] ksmbd: set 445 port to smbdirect port by default Namjae Jeon 2021-12-29 14:14 ` [PATCH 3/4] ksmbd: add support for smb2 max credit parameter Namjae Jeon @ 2021-12-29 14:14 ` Namjae Jeon 2 siblings, 0 replies; 5+ messages in thread From: Namjae Jeon @ 2021-12-29 14:14 UTC (permalink / raw) To: linux-cifs; +Cc: Namjae Jeon Moves the credit charge deduction from total_credits under the processing a request. When repeating smb2 lock request and other command request, there will be a problem that ->total_credits does not decrease. Signed-off-by: Namjae Jeon <linkinjeon@kernel.org> --- fs/ksmbd/smb2misc.c | 7 ++----- fs/ksmbd/smb2pdu.c | 16 ++++++++++------ 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/fs/ksmbd/smb2misc.c b/fs/ksmbd/smb2misc.c index 6892d1822269..fedcb753c7af 100644 --- a/fs/ksmbd/smb2misc.c +++ b/fs/ksmbd/smb2misc.c @@ -289,7 +289,7 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn, unsigned int req_len = 0, expect_resp_len = 0, calc_credit_num, max_len; unsigned short credit_charge = le16_to_cpu(hdr->CreditCharge); void *__hdr = hdr; - int ret; + int ret = 0; switch (hdr->Command) { case SMB2_QUERY_INFO: @@ -332,10 +332,7 @@ static int smb2_validate_credit_charge(struct ksmbd_conn *conn, } spin_lock(&conn->credits_lock); - if (credit_charge <= conn->total_credits) { - conn->total_credits -= credit_charge; - ret = 0; - } else { + if (credit_charge > conn->total_credits) { ksmbd_debug(SMB, "Insufficient credits granted, given: %u, granted: %u\n", credit_charge, conn->total_credits); ret = 1; diff --git a/fs/ksmbd/smb2pdu.c b/fs/ksmbd/smb2pdu.c index 860fe3a03ad7..b6b418e77a1f 100644 --- a/fs/ksmbd/smb2pdu.c +++ b/fs/ksmbd/smb2pdu.c @@ -299,9 +299,8 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) struct smb2_hdr *req_hdr = ksmbd_req_buf_next(work); struct smb2_hdr *hdr = ksmbd_resp_buf_next(work); struct ksmbd_conn *conn = work->conn; - unsigned short credits_requested; + unsigned short credits_requested, aux_max; unsigned short credit_charge, credits_granted = 0; - unsigned short aux_max, aux_credits; if (work->send_no_response) return 0; @@ -316,6 +315,13 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) credit_charge = max_t(unsigned short, le16_to_cpu(req_hdr->CreditCharge), 1); + if (credit_charge > conn->total_credits) { + ksmbd_debug(SMB, "Insufficient credits granted, given: %u, granted: %u\n", + credit_charge, conn->total_credits); + return -EINVAL; + } + + conn->total_credits -= credit_charge; credits_requested = max_t(unsigned short, le16_to_cpu(req_hdr->CreditRequest), 1); @@ -325,13 +331,11 @@ int smb2_set_rsp_credits(struct ksmbd_work *work) * TODO: Need to adjuct CreditRequest value according to * current cpu load */ - aux_credits = credits_requested - 1; if (hdr->Command == SMB2_NEGOTIATE) - aux_max = 0; + aux_max = 1; else aux_max = conn->vals->max_credits - credit_charge; - aux_credits = min_t(unsigned short, aux_credits, aux_max); - credits_granted = credit_charge + aux_credits; + credits_granted = min_t(unsigned short, credits_requested, aux_max); if (conn->vals->max_credits - conn->total_credits < credits_granted) credits_granted = conn->vals->max_credits - -- 2.25.1 ^ permalink raw reply related [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-12-30 22:01 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-12-29 14:14 [PATCH 1/4] ksmbd: register ksmbd ib client with ib_register_client() Namjae Jeon 2021-12-29 14:14 ` [PATCH 2/4] ksmbd: set 445 port to smbdirect port by default Namjae Jeon 2021-12-29 14:14 ` [PATCH 3/4] ksmbd: add support for smb2 max credit parameter Namjae Jeon 2021-12-30 22:00 ` Hyunchul Lee 2021-12-29 14:14 ` [PATCH 4/4] ksmbd: move credit charge deduction under processing request Namjae Jeon
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).