summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Metzmacher <metze@samba.org>2025-10-17 17:24:28 +0200
committerSteve French <stfrench@microsoft.com>2026-04-15 21:58:23 -0500
commit0af87a0a31668d4a0dc8d8140fb51da594935eb4 (patch)
tree2683288863df60cf935f0c86c67f5c908f45dfef
parent0184d2b386f836925ff2f9b4e6d4f9a8048cf58f (diff)
downloadlwn-0af87a0a31668d4a0dc8d8140fb51da594935eb4.tar.gz
lwn-0af87a0a31668d4a0dc8d8140fb51da594935eb4.zip
smb: server: inline smb_direct_create_header() into smb_direct_post_send_data()
The point is that ib_dma_map_single() is done first, but the 'Fill in the packet header' will be done after smbdirect_map_sges_from_iter(). This will simplify further changes in order to share common code with the client. 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.c126
1 files changed, 56 insertions, 70 deletions
diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c
index fa4f8f9ea11b..add4b6a27fac 100644
--- a/fs/smb/server/transport_rdma.c
+++ b/fs/smb/server/transport_rdma.c
@@ -764,72 +764,6 @@ static int wait_for_send_credits(struct smbdirect_socket *sc,
1);
}
-static int smb_direct_create_header(struct smbdirect_socket *sc,
- int size, int remaining_data_length,
- int new_credits,
- struct smbdirect_send_io **sendmsg_out)
-{
- struct smbdirect_socket_parameters *sp = &sc->parameters;
- struct smbdirect_send_io *sendmsg;
- struct smbdirect_data_transfer *packet;
- int header_length;
- int ret;
-
- sendmsg = smbdirect_connection_alloc_send_io(sc);
- if (IS_ERR(sendmsg))
- return PTR_ERR(sendmsg);
-
- /* Fill in the packet header */
- packet = (struct smbdirect_data_transfer *)sendmsg->packet;
- packet->credits_requested = cpu_to_le16(sp->send_credit_target);
- packet->credits_granted = cpu_to_le16(new_credits);
-
- packet->flags = 0;
- if (smbdirect_connection_request_keep_alive(sc))
- packet->flags |= cpu_to_le16(SMBDIRECT_FLAG_RESPONSE_REQUESTED);
-
- packet->reserved = 0;
- if (!size)
- packet->data_offset = 0;
- else
- packet->data_offset = cpu_to_le32(24);
- packet->data_length = cpu_to_le32(size);
- packet->remaining_data_length = cpu_to_le32(remaining_data_length);
- packet->padding = 0;
-
- ksmbd_debug(RDMA,
- "credits_requested=%d credits_granted=%d data_offset=%d data_length=%d remaining_data_length=%d\n",
- le16_to_cpu(packet->credits_requested),
- le16_to_cpu(packet->credits_granted),
- le32_to_cpu(packet->data_offset),
- le32_to_cpu(packet->data_length),
- le32_to_cpu(packet->remaining_data_length));
-
- /* Map the packet to DMA */
- header_length = sizeof(struct smbdirect_data_transfer);
- /* If this is a packet without payload, don't send padding */
- if (!size)
- header_length =
- offsetof(struct smbdirect_data_transfer, padding);
-
- sendmsg->sge[0].addr = ib_dma_map_single(sc->ib.dev,
- (void *)packet,
- header_length,
- DMA_TO_DEVICE);
- ret = ib_dma_mapping_error(sc->ib.dev, sendmsg->sge[0].addr);
- if (ret) {
- smbdirect_connection_free_send_io(sendmsg);
- return ret;
- }
-
- sendmsg->num_sge = 1;
- sendmsg->sge[0].length = header_length;
- sendmsg->sge[0].lkey = sc->ib.pd->local_dma_lkey;
-
- *sendmsg_out = sendmsg;
- return 0;
-}
-
static int post_sendmsg(struct smbdirect_socket *sc,
struct smbdirect_send_batch *send_ctx,
struct smbdirect_send_io *msg)
@@ -873,13 +807,23 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
struct iov_iter *iter,
size_t *_remaining_data_length)
{
+ const struct smbdirect_socket_parameters *sp = &sc->parameters;
int ret;
struct smbdirect_send_io *msg;
+ struct smbdirect_data_transfer *packet;
+ size_t header_length;
u32 remaining_data_length = 0;
u32 data_length = 0;
struct smbdirect_send_batch _send_ctx;
u16 new_credits;
+ if (iter) {
+ header_length = sizeof(struct smbdirect_data_transfer);
+ } else {
+ /* If this is a packet without payload, don't send padding */
+ header_length = offsetof(struct smbdirect_data_transfer, padding);
+ }
+
if (!send_ctx) {
smb_direct_send_ctx_init(&_send_ctx, false, 0);
send_ctx = &_send_ctx;
@@ -922,10 +866,24 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
remaining_data_length = *_remaining_data_length;
}
- ret = smb_direct_create_header(sc, data_length, remaining_data_length,
- new_credits, &msg);
+ msg = smbdirect_connection_alloc_send_io(sc);
+ if (IS_ERR(msg)) {
+ ret = PTR_ERR(msg);
+ goto alloc_failed;
+ }
+
+ /* Map the packet to DMA */
+ msg->sge[0].addr = ib_dma_map_single(sc->ib.dev,
+ msg->packet,
+ header_length,
+ DMA_TO_DEVICE);
+ ret = ib_dma_mapping_error(sc->ib.dev, msg->sge[0].addr);
if (ret)
- goto header_failed;
+ goto err;
+
+ msg->sge[0].length = header_length;
+ msg->sge[0].lkey = sc->ib.pd->local_dma_lkey;
+ msg->num_sge = 1;
if (iter) {
struct smbdirect_map_sges extract = {
@@ -947,6 +905,34 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
msg->num_sge = extract.num_sge;
}
+ /* Fill in the packet header */
+ packet = (struct smbdirect_data_transfer *)msg->packet;
+ packet->credits_requested = cpu_to_le16(sp->send_credit_target);
+ new_credits = smbdirect_connection_grant_recv_credits(sc);
+ packet->credits_granted = cpu_to_le16(new_credits);
+
+ packet->flags = 0;
+ if (smbdirect_connection_request_keep_alive(sc))
+ packet->flags |= cpu_to_le16(SMBDIRECT_FLAG_RESPONSE_REQUESTED);
+
+ packet->reserved = 0;
+ if (!data_length)
+ packet->data_offset = 0;
+ else
+ packet->data_offset = cpu_to_le32(24);
+ packet->data_length = cpu_to_le32(data_length);
+ packet->remaining_data_length = cpu_to_le32(remaining_data_length);
+ packet->padding = 0;
+
+ ksmbd_debug(RDMA,
+ "credits_req=%u credits_granted=%u flags=0x%x ofs=%u len=%u remaining=%u\n",
+ le16_to_cpu(packet->credits_requested),
+ le16_to_cpu(packet->credits_granted),
+ le16_to_cpu(packet->flags),
+ le32_to_cpu(packet->data_offset),
+ le32_to_cpu(packet->data_length),
+ le32_to_cpu(packet->remaining_data_length));
+
ret = post_sendmsg(sc, send_ctx, msg);
if (ret)
goto err;
@@ -966,7 +952,7 @@ static int smb_direct_post_send_data(struct smbdirect_socket *sc,
err:
smbdirect_connection_free_send_io(msg);
flush_failed:
-header_failed:
+alloc_failed:
atomic_inc(&sc->send_io.credits.count);
credit_failed:
atomic_inc(&sc->send_io.lcredits.count);