smb: client: make use of smbdirect_socket_parameters.{initiator_depth,responder_resources}

This will make it easier to specify these from the outside of the core
code first and then negotiate the value with the peer.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
Stefan Metzmacher 2025-08-19 23:18:21 +02:00 committed by Steve French
parent 1f2ff73a23
commit dd53b45fc8
3 changed files with 16 additions and 17 deletions

View File

@ -500,7 +500,7 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
atomic_read(&sc->send_io.pending.count));
seq_printf(m, "\nMR responder_resources: %u "
"max_frmr_depth: %u mr_type: 0x%x",
server->smbd_conn->responder_resources,
sp->responder_resources,
server->smbd_conn->max_frmr_depth,
server->smbd_conn->mr_type);
seq_printf(m, "\nMR mr_ready_count: %u mr_used_count: %u",

View File

@ -222,6 +222,7 @@ static int smbd_conn_upcall(
{
struct smbd_connection *info = id->context;
struct smbdirect_socket *sc = &info->socket;
struct smbdirect_socket_parameters *sp = &sc->parameters;
const char *event_name = rdma_event_msg(event->event);
u8 peer_initiator_depth;
u8 peer_responder_resources;
@ -329,12 +330,12 @@ static int smbd_conn_upcall(
* non 0 values.
*/
if (peer_initiator_depth != 0)
info->initiator_depth =
min_t(u8, info->initiator_depth,
sp->initiator_depth =
min_t(u8, sp->initiator_depth,
peer_initiator_depth);
if (peer_responder_resources != 0)
info->responder_resources =
min_t(u8, info->responder_resources,
sp->responder_resources =
min_t(u8, sp->responder_resources,
peer_responder_resources);
WARN_ON_ONCE(sc->status != SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING);
@ -1718,15 +1719,14 @@ static struct smbd_connection *_smbd_get_connection(
smbdirect_socket_init(sc);
sp = &sc->parameters;
info->initiator_depth = 1;
info->responder_resources = SMBD_CM_RESPONDER_RESOURCES;
INIT_WORK(&sc->disconnect_work, smbd_disconnect_rdma_work);
sp->resolve_addr_timeout_msec = RDMA_RESOLVE_TIMEOUT;
sp->resolve_route_timeout_msec = RDMA_RESOLVE_TIMEOUT;
sp->rdma_connect_timeout_msec = RDMA_RESOLVE_TIMEOUT;
sp->negotiate_timeout_msec = SMBD_NEGOTIATE_TIMEOUT * 1000;
sp->initiator_depth = 1;
sp->responder_resources = SMBD_CM_RESPONDER_RESOURCES;
sp->recv_credit_max = smbd_receive_credit_max;
sp->send_credit_target = smbd_send_credit_target;
sp->max_send_size = smbd_max_send_size;
@ -1807,15 +1807,15 @@ static struct smbd_connection *_smbd_get_connection(
}
sc->ib.qp = sc->rdma.cm_id->qp;
info->responder_resources =
min_t(u8, info->responder_resources,
sp->responder_resources =
min_t(u8, sp->responder_resources,
sc->ib.dev->attrs.max_qp_rd_atom);
log_rdma_mr(INFO, "responder_resources=%d\n",
info->responder_resources);
sp->responder_resources);
memset(&conn_param, 0, sizeof(conn_param));
conn_param.initiator_depth = info->initiator_depth;
conn_param.responder_resources = info->responder_resources;
conn_param.initiator_depth = sp->initiator_depth;
conn_param.responder_resources = sp->responder_resources;
/* Need to send IRD/ORD in private data for iWARP */
sc->ib.dev->ops.get_port_immutable(
@ -2270,6 +2270,7 @@ static void destroy_mr_list(struct smbd_connection *info)
static int allocate_mr_list(struct smbd_connection *info)
{
struct smbdirect_socket *sc = &info->socket;
struct smbdirect_socket_parameters *sp = &sc->parameters;
int i;
struct smbd_mr *smbdirect_mr, *tmp;
@ -2281,13 +2282,13 @@ static int allocate_mr_list(struct smbd_connection *info)
init_waitqueue_head(&info->wait_for_mr_cleanup);
INIT_WORK(&info->mr_recovery_work, smbd_mr_recovery_work);
if (info->responder_resources == 0) {
if (sp->responder_resources == 0) {
log_rdma_mr(ERR, "responder_resources negotiated as 0\n");
return -EINVAL;
}
/* Allocate more MRs (2x) than hardware responder_resources */
for (i = 0; i < info->responder_resources * 2; i++) {
for (i = 0; i < sp->responder_resources * 2; i++) {
smbdirect_mr = kzalloc(sizeof(*smbdirect_mr), GFP_KERNEL);
if (!smbdirect_mr)
goto cleanup_entries;

View File

@ -52,8 +52,6 @@ struct smbd_connection {
/* Memory registrations */
/* Maximum number of RDMA read/write outstanding on this connection */
bool legacy_iwarp;
u8 initiator_depth;
u8 responder_resources;
/* Maximum number of pages in a single RDMA write/read on this connection */
int max_frmr_depth;
/*