summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2025-09-15 05:39:13 +0300
committerSteve French <stfrench@microsoft.com>2026-04-16 05:58:23 +0300
commit8688d7a8c712dc507bf4ae6ee07c1eed536e35a5 (patch)
treed9fedcfdc2b2e0d32f7e3275b760d59d9e771142
parent07aec3a151b732cfa06bd00821a1ed99b8f87c89 (diff)
downloadlinux-8688d7a8c712dc507bf4ae6ee07c1eed536e35a5.tar.xz
smb: server: make use of smbdirect_map_sges_from_iter()
It will make it easier to move stuff into common code when both client and server use smbdirect_map_sges_from_iter(). Cc: Namjae Jeon <linkinjeon@kernel.org> Cc: Steve French <smfrench@gmail.com> Cc: Tom Talpey <tom@talpey.com> Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher <metze@samba.org> Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Steve French <stfrench@microsoft.com>
-rw-r--r--fs/smb/server/transport_rdma.c57
1 files changed, 19 insertions, 38 deletions
diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c
index a258e87b6df0..5074b8ff332f 100644
--- a/fs/smb/server/transport_rdma.c
+++ b/fs/smb/server/transport_rdma.c
@@ -1188,16 +1188,6 @@ static int get_sg_list(void *buf, int size, struct scatterlist *sg_list, int nen
return i;
}
-static int get_mapped_sg_list(struct ib_device *device, void *buf, int size,
- struct scatterlist *sg_list, int nentries,
- enum dma_data_direction dir, int *npages)
-{
- *npages = get_sg_list(buf, size, sg_list, nentries);
- if (*npages < 0)
- return -EINVAL;
- return ib_dma_map_sg(device, sg_list, *npages, dir);
-}
-
static int post_sendmsg(struct smbdirect_socket *sc,
struct smbdirect_send_batch *send_ctx,
struct smbdirect_send_io *msg)
@@ -1241,10 +1231,9 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
struct kvec *iov, int niov,
int remaining_data_length)
{
- int i, j, ret;
+ int i, ret;
struct smbdirect_send_io *msg;
int data_length;
- struct scatterlist sg[SMBDIRECT_SEND_IO_MAX_SGE - 1];
struct smbdirect_send_batch _send_ctx;
int new_credits;
@@ -1291,35 +1280,27 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
if (ret)
goto header_failed;
- for (i = 0; i < niov; i++) {
- struct ib_sge *sge;
- int sg_cnt;
- int npages;
-
- sg_init_table(sg, SMBDIRECT_SEND_IO_MAX_SGE - 1);
- sg_cnt = get_mapped_sg_list(sc->ib.dev,
- iov[i].iov_base, iov[i].iov_len,
- sg, SMBDIRECT_SEND_IO_MAX_SGE - 1,
- DMA_TO_DEVICE, &npages);
- if (sg_cnt <= 0) {
- pr_err("failed to map buffer\n");
- ret = -ENOMEM;
+ if (data_length) {
+ struct smbdirect_map_sges extract = {
+ .num_sge = msg->num_sge,
+ .max_sge = ARRAY_SIZE(msg->sge),
+ .sge = msg->sge,
+ .device = sc->ib.dev,
+ .local_dma_lkey = sc->ib.pd->local_dma_lkey,
+ .direction = DMA_TO_DEVICE,
+ };
+ struct iov_iter iter;
+
+ iov_iter_kvec(&iter, ITER_SOURCE, iov, niov, data_length);
+
+ ret = smbdirect_map_sges_from_iter(&iter, data_length, &extract);
+ if (ret < 0)
goto err;
- } else if (sg_cnt + msg->num_sge > SMBDIRECT_SEND_IO_MAX_SGE) {
- pr_err("buffer not fitted into sges\n");
- ret = -E2BIG;
- ib_dma_unmap_sg(sc->ib.dev, sg, npages,
- DMA_TO_DEVICE);
+ if (WARN_ON_ONCE(ret != data_length)) {
+ ret = -EIO;
goto err;
}
-
- for (j = 0; j < sg_cnt; j++) {
- sge = &msg->sge[msg->num_sge];
- sge->addr = sg_dma_address(&sg[j]);
- sge->length = sg_dma_len(&sg[j]);
- sge->lkey = sc->ib.pd->local_dma_lkey;
- msg->num_sge++;
- }
+ msg->num_sge = extract.num_sge;
}
ret = post_sendmsg(sc, send_ctx, msg);