]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
smb: client: make use of smbdirect_socket.{send,recv}_io.mem.{cache,pool}
authorStefan Metzmacher <metze@samba.org>
Wed, 6 Aug 2025 17:35:53 +0000 (19:35 +0200)
committerSteve French <stfrench@microsoft.com>
Wed, 6 Aug 2025 20:18:58 +0000 (15:18 -0500)
This will allow common helper functions to be created later.

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 c367efef8c7a7ecb9e08df19981d920b35229f8c..6c2af00be44cf3b69f85c1e936b89c70e309a7fa 100644 (file)
@@ -287,7 +287,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
        if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_SEND) {
                log_rdma_send(ERR, "wc->status=%d wc->opcode=%d\n",
                        wc->status, wc->opcode);
-               mempool_free(request, info->request_mempool);
+               mempool_free(request, sc->send_io.mem.pool);
                smbd_disconnect_rdma_connection(info);
                return;
        }
@@ -297,7 +297,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
 
        wake_up(&info->wait_post_send);
 
-       mempool_free(request, info->request_mempool);
+       mempool_free(request, sc->send_io.mem.pool);
 }
 
 static void dump_smbdirect_negotiate_resp(struct smbdirect_negotiate_resp *resp)
@@ -692,7 +692,7 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
        struct smbdirect_send_io *request;
        struct smbdirect_negotiate_req *packet;
 
-       request = mempool_alloc(info->request_mempool, GFP_KERNEL);
+       request = mempool_alloc(sc->send_io.mem.pool, GFP_KERNEL);
        if (!request)
                return rc;
 
@@ -751,7 +751,7 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
        smbd_disconnect_rdma_connection(info);
 
 dma_mapping_failed:
-       mempool_free(request, info->request_mempool);
+       mempool_free(request, sc->send_io.mem.pool);
        return rc;
 }
 
@@ -883,7 +883,7 @@ wait_send_queue:
                goto wait_send_queue;
        }
 
-       request = mempool_alloc(info->request_mempool, GFP_KERNEL);
+       request = mempool_alloc(sc->send_io.mem.pool, GFP_KERNEL);
        if (!request) {
                rc = -ENOMEM;
                goto err_alloc;
@@ -977,7 +977,7 @@ err_dma:
                                            request->sge[i].addr,
                                            request->sge[i].length,
                                            DMA_TO_DEVICE);
-       mempool_free(request, info->request_mempool);
+       mempool_free(request, sc->send_io.mem.pool);
 
        /* roll back receive credits and credits to be offered */
        spin_lock(&info->lock_new_credits_offered);
@@ -1235,7 +1235,7 @@ static int allocate_receive_buffers(struct smbd_connection *info, int num_buf)
        init_waitqueue_head(&info->wait_receive_queues);
 
        for (i = 0; i < num_buf; i++) {
-               response = mempool_alloc(info->response_mempool, GFP_KERNEL);
+               response = mempool_alloc(sc->recv_io.mem.pool, GFP_KERNEL);
                if (!response)
                        goto allocate_failed;
 
@@ -1255,17 +1255,18 @@ allocate_failed:
                list_del(&response->list);
                info->count_receive_queue--;
 
-               mempool_free(response, info->response_mempool);
+               mempool_free(response, sc->recv_io.mem.pool);
        }
        return -ENOMEM;
 }
 
 static void destroy_receive_buffers(struct smbd_connection *info)
 {
+       struct smbdirect_socket *sc = &info->socket;
        struct smbdirect_recv_io *response;
 
        while ((response = get_receive_buffer(info)))
-               mempool_free(response, info->response_mempool);
+               mempool_free(response, sc->recv_io.mem.pool);
 }
 
 /* Implement idle connection timer [MS-SMBD] 3.1.6.2 */
@@ -1377,11 +1378,11 @@ void smbd_destroy(struct TCP_Server_Info *server)
        rdma_destroy_id(sc->rdma.cm_id);
 
        /* free mempools */
-       mempool_destroy(info->request_mempool);
-       kmem_cache_destroy(info->request_cache);
+       mempool_destroy(sc->send_io.mem.pool);
+       kmem_cache_destroy(sc->send_io.mem.cache);
 
-       mempool_destroy(info->response_mempool);
-       kmem_cache_destroy(info->response_cache);
+       mempool_destroy(sc->recv_io.mem.pool);
+       kmem_cache_destroy(sc->recv_io.mem.cache);
 
        sc->status = SMBDIRECT_SOCKET_DESTROYED;
 
@@ -1429,12 +1430,14 @@ create_conn:
 
 static void destroy_caches_and_workqueue(struct smbd_connection *info)
 {
+       struct smbdirect_socket *sc = &info->socket;
+
        destroy_receive_buffers(info);
        destroy_workqueue(info->workqueue);
-       mempool_destroy(info->response_mempool);
-       kmem_cache_destroy(info->response_cache);
-       mempool_destroy(info->request_mempool);
-       kmem_cache_destroy(info->request_cache);
+       mempool_destroy(sc->recv_io.mem.pool);
+       kmem_cache_destroy(sc->recv_io.mem.cache);
+       mempool_destroy(sc->send_io.mem.pool);
+       kmem_cache_destroy(sc->send_io.mem.cache);
 }
 
 #define MAX_NAME_LEN   80
@@ -1449,19 +1452,19 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info)
                return -ENOMEM;
 
        scnprintf(name, MAX_NAME_LEN, "smbdirect_send_io_%p", info);
-       info->request_cache =
+       sc->send_io.mem.cache =
                kmem_cache_create(
                        name,
                        sizeof(struct smbdirect_send_io) +
                                sizeof(struct smbdirect_data_transfer),
                        0, SLAB_HWCACHE_ALIGN, NULL);
-       if (!info->request_cache)
+       if (!sc->send_io.mem.cache)
                return -ENOMEM;
 
-       info->request_mempool =
+       sc->send_io.mem.pool =
                mempool_create(sp->send_credit_target, mempool_alloc_slab,
-                       mempool_free_slab, info->request_cache);
-       if (!info->request_mempool)
+                       mempool_free_slab, sc->send_io.mem.cache);
+       if (!sc->send_io.mem.pool)
                goto out1;
 
        scnprintf(name, MAX_NAME_LEN, "smbdirect_recv_io_%p", info);
@@ -1472,17 +1475,17 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info)
                                   sizeof(struct smbdirect_data_transfer)),
                .usersize       = sp->max_recv_size - sizeof(struct smbdirect_data_transfer),
        };
-       info->response_cache =
+       sc->recv_io.mem.cache =
                kmem_cache_create(name,
                                  sizeof(struct smbdirect_recv_io) + sp->max_recv_size,
                                  &response_args, SLAB_HWCACHE_ALIGN);
-       if (!info->response_cache)
+       if (!sc->recv_io.mem.cache)
                goto out2;
 
-       info->response_mempool =
+       sc->recv_io.mem.pool =
                mempool_create(sp->recv_credit_max, mempool_alloc_slab,
-                      mempool_free_slab, info->response_cache);
-       if (!info->response_mempool)
+                      mempool_free_slab, sc->recv_io.mem.cache);
+       if (!sc->recv_io.mem.pool)
                goto out3;
 
        scnprintf(name, MAX_NAME_LEN, "smbd_%p", info);
@@ -1501,13 +1504,13 @@ static int allocate_caches_and_workqueue(struct smbd_connection *info)
 out5:
        destroy_workqueue(info->workqueue);
 out4:
-       mempool_destroy(info->response_mempool);
+       mempool_destroy(sc->recv_io.mem.pool);
 out3:
-       kmem_cache_destroy(info->response_cache);
+       kmem_cache_destroy(sc->recv_io.mem.cache);
 out2:
-       mempool_destroy(info->request_mempool);
+       mempool_destroy(sc->send_io.mem.pool);
 out1:
-       kmem_cache_destroy(info->request_cache);
+       kmem_cache_destroy(sc->send_io.mem.cache);
        return -ENOMEM;
 }
 
index a8380bccf623a42353466aee5c886bb17c1ad8f6..0d4d45428c85b8d3a31b21ad92dfa323545e30aa 100644 (file)
@@ -105,15 +105,6 @@ struct smbd_connection {
        struct workqueue_struct *workqueue;
        struct delayed_work idle_timer_work;
 
-       /* Memory pool for preallocating buffers */
-       /* request pool for RDMA send */
-       struct kmem_cache *request_cache;
-       mempool_t *request_mempool;
-
-       /* response pool for RDMA receive */
-       struct kmem_cache *response_cache;
-       mempool_t *response_mempool;
-
        /* for debug purposes */
        unsigned int count_get_receive_buffer;
        unsigned int count_put_receive_buffer;