smb: client: make use of smbdirect_socket.{send,recv}_io.mem.{cache,pool}

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>
This commit is contained in:
Stefan Metzmacher 2025-08-06 19:35:53 +02:00 committed by Steve French
parent 5ef8278e37
commit bef82d5848
2 changed files with 34 additions and 40 deletions

View 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 @@ static int smbd_post_send_iter(struct smbd_connection *info,
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 @@ static int smbd_post_send_iter(struct smbd_connection *info,
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 @@ static int allocate_receive_buffers(struct smbd_connection *info, int num_buf)
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 @@ int smbd_reconnect(struct TCP_Server_Info *server)
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;
}

View 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;