]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: make use of struct smbdirect_send_io
authorStefan Metzmacher <metze@samba.org>
Wed, 6 Aug 2025 17:35:51 +0000 (19:35 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 6 Aug 2025 20:18:58 +0000 (15:18 -0500)
The server will also use this soon, so that we can
split out common helper functions in future.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
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>
fs/smb/client/smbdirect.c
fs/smb/client/smbdirect.h

index 5d1fa83583f607da4201a1ce2aff263dd49c8083..c367efef8c7a7ecb9e08df19981d920b35229f8c 100644 (file)
@@ -255,7 +255,7 @@ smbd_qp_async_error_upcall(struct ib_event *event, void *context)
        }
 }
 
-static inline void *smbd_request_payload(struct smbd_request *request)
+static inline void *smbdirect_send_io_payload(struct smbdirect_send_io *request)
 {
        return (void *)request->packet;
 }
@@ -269,12 +269,13 @@ static inline void *smbdirect_recv_io_payload(struct smbdirect_recv_io *response
 static void send_done(struct ib_cq *cq, struct ib_wc *wc)
 {
        int i;
-       struct smbd_request *request =
-               container_of(wc->wr_cqe, struct smbd_request, cqe);
-       struct smbd_connection *info = request->info;
-       struct smbdirect_socket *sc = &info->socket;
+       struct smbdirect_send_io *request =
+               container_of(wc->wr_cqe, struct smbdirect_send_io, cqe);
+       struct smbdirect_socket *sc = request->socket;
+       struct smbd_connection *info =
+               container_of(sc, struct smbd_connection, socket);
 
-       log_rdma_send(INFO, "smbd_request 0x%p completed wc->status=%d\n",
+       log_rdma_send(INFO, "smbdirect_send_io 0x%p completed wc->status=%d\n",
                request, wc->status);
 
        for (i = 0; i < request->num_sge; i++)
@@ -291,12 +292,12 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
                return;
        }
 
-       if (atomic_dec_and_test(&request->info->send_pending))
-               wake_up(&request->info->wait_send_pending);
+       if (atomic_dec_and_test(&info->send_pending))
+               wake_up(&info->wait_send_pending);
 
-       wake_up(&request->info->wait_post_send);
+       wake_up(&info->wait_post_send);
 
-       mempool_free(request, request->info->request_mempool);
+       mempool_free(request, info->request_mempool);
 }
 
 static void dump_smbdirect_negotiate_resp(struct smbdirect_negotiate_resp *resp)
@@ -688,16 +689,16 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
        struct smbdirect_socket_parameters *sp = &sc->parameters;
        struct ib_send_wr send_wr;
        int rc = -ENOMEM;
-       struct smbd_request *request;
+       struct smbdirect_send_io *request;
        struct smbdirect_negotiate_req *packet;
 
        request = mempool_alloc(info->request_mempool, GFP_KERNEL);
        if (!request)
                return rc;
 
-       request->info = info;
+       request->socket = sc;
 
-       packet = smbd_request_payload(request);
+       packet = smbdirect_send_io_payload(request);
        packet->min_version = cpu_to_le16(SMBDIRECT_V1);
        packet->max_version = cpu_to_le16(SMBDIRECT_V1);
        packet->reserved = 0;
@@ -794,7 +795,7 @@ static int manage_keep_alive_before_sending(struct smbd_connection *info)
 
 /* Post the send request */
 static int smbd_post_send(struct smbd_connection *info,
-               struct smbd_request *request)
+               struct smbdirect_send_io *request)
 {
        struct smbdirect_socket *sc = &info->socket;
        struct smbdirect_socket_parameters *sp = &sc->parameters;
@@ -843,7 +844,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
        int i, rc;
        int header_length;
        int data_length;
-       struct smbd_request *request;
+       struct smbdirect_send_io *request;
        struct smbdirect_data_transfer *packet;
        int new_credits = 0;
 
@@ -888,14 +889,14 @@ wait_send_queue:
                goto err_alloc;
        }
 
-       request->info = info;
+       request->socket = sc;
        memset(request->sge, 0, sizeof(request->sge));
 
        /* Fill in the data payload to find out how much data we can add */
        if (iter) {
                struct smb_extract_to_rdma extract = {
                        .nr_sge         = 1,
-                       .max_sge        = SMBDIRECT_MAX_SEND_SGE,
+                       .max_sge        = SMBDIRECT_SEND_IO_MAX_SGE,
                        .sge            = request->sge,
                        .device         = sc->ib.dev,
                        .local_dma_lkey = sc->ib.pd->local_dma_lkey,
@@ -917,7 +918,7 @@ wait_send_queue:
        }
 
        /* Fill in the packet header */
-       packet = smbd_request_payload(request);
+       packet = smbdirect_send_io_payload(request);
        packet->credits_requested = cpu_to_le16(sp->send_credit_target);
 
        new_credits = manage_credits_prior_sending(info);
@@ -1447,11 +1448,11 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info)
        if (WARN_ON_ONCE(sp->max_recv_size < sizeof(struct smbdirect_data_transfer)))
                return -ENOMEM;
 
-       scnprintf(name, MAX_NAME_LEN, "smbd_request_%p", info);
+       scnprintf(name, MAX_NAME_LEN, "smbdirect_send_io_%p", info);
        info->request_cache =
                kmem_cache_create(
                        name,
-                       sizeof(struct smbd_request) +
+                       sizeof(struct smbdirect_send_io) +
                                sizeof(struct smbdirect_data_transfer),
                        0, SLAB_HWCACHE_ALIGN, NULL);
        if (!info->request_cache)
@@ -1562,7 +1563,7 @@ static struct smbd_connection *_smbd_get_connection(
        sp->max_recv_size = smbd_max_receive_size;
        sp->keepalive_interval_msec = smbd_keep_alive_interval * 1000;
 
-       if (sc->ib.dev->attrs.max_send_sge < SMBDIRECT_MAX_SEND_SGE ||
+       if (sc->ib.dev->attrs.max_send_sge < SMBDIRECT_SEND_IO_MAX_SGE ||
            sc->ib.dev->attrs.max_recv_sge < SMBDIRECT_RECV_IO_MAX_SGE) {
                log_rdma_event(ERR,
                        "device %.*s max_send_sge/max_recv_sge = %d/%d too small\n",
@@ -1594,7 +1595,7 @@ static struct smbd_connection *_smbd_get_connection(
        qp_attr.qp_context = info;
        qp_attr.cap.max_send_wr = sp->send_credit_target;
        qp_attr.cap.max_recv_wr = sp->recv_credit_max;
-       qp_attr.cap.max_send_sge = SMBDIRECT_MAX_SEND_SGE;
+       qp_attr.cap.max_send_sge = SMBDIRECT_SEND_IO_MAX_SGE;
        qp_attr.cap.max_recv_sge = SMBDIRECT_RECV_IO_MAX_SGE;
        qp_attr.cap.max_inline_data = 0;
        qp_attr.sq_sig_type = IB_SIGNAL_REQ_WR;
index 81b55c0de55214c218f61dbe853cf4eb5f79c5dd..a8380bccf623a42353466aee5c886bb17c1ad8f6 100644 (file)
@@ -123,22 +123,6 @@ struct smbd_connection {
        unsigned int count_send_empty;
 };
 
-/* Maximum number of SGEs used by smbdirect.c in any send work request */
-#define SMBDIRECT_MAX_SEND_SGE 6
-
-/* The context for a SMBD request */
-struct smbd_request {
-       struct smbd_connection *info;
-       struct ib_cqe cqe;
-
-       /* the SGE entries for this work request */
-       struct ib_sge sge[SMBDIRECT_MAX_SEND_SGE];
-       int num_sge;
-
-       /* SMBD packet header follows this structure */
-       u8 packet[];
-};
-
 /* Create a SMBDirect session */
 struct smbd_connection *smbd_get_connection(
        struct TCP_Server_Info *server, struct sockaddr *dstaddr);