[PATCH v2 097/127] smb: server: make use of smbdirect_connection_{get, put}_recv_io()
Stefan Metzmacher
metze at samba.org
Wed Oct 29 13:21:15 UTC 2025
These are basically copies of {get,put}_receive_buffer() in the client.
They are very similar to {get_free,put}_recvmsg() the only logical
difference is the updating of the sc->statistics.*.
Cc: Namjae Jeon <linkinjeon at kernel.org>
Cc: Steve French <smfrench at gmail.com>
Cc: Tom Talpey <tom at talpey.com>
Cc: linux-cifs at vger.kernel.org
Cc: samba-technical at lists.samba.org
Signed-off-by: Stefan Metzmacher <metze at samba.org>
Signed-off-by: Steve French <stfrench at microsoft.com>
---
fs/smb/server/transport_rdma.c | 67 ++++++++--------------------------
1 file changed, 15 insertions(+), 52 deletions(-)
diff --git a/fs/smb/server/transport_rdma.c b/fs/smb/server/transport_rdma.c
index 89db1cc921d2..cc64be846daf 100644
--- a/fs/smb/server/transport_rdma.c
+++ b/fs/smb/server/transport_rdma.c
@@ -215,43 +215,6 @@ static inline void
return (void *)recvmsg->packet;
}
-static struct
-smbdirect_recv_io *get_free_recvmsg(struct smbdirect_socket *sc)
-{
- struct smbdirect_recv_io *recvmsg = NULL;
- unsigned long flags;
-
- spin_lock_irqsave(&sc->recv_io.free.lock, flags);
- if (!list_empty(&sc->recv_io.free.list)) {
- recvmsg = list_first_entry(&sc->recv_io.free.list,
- struct smbdirect_recv_io,
- list);
- list_del(&recvmsg->list);
- }
- spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
- return recvmsg;
-}
-
-static void put_recvmsg(struct smbdirect_socket *sc,
- struct smbdirect_recv_io *recvmsg)
-{
- unsigned long flags;
-
- if (likely(recvmsg->sge.length != 0)) {
- ib_dma_unmap_single(sc->ib.dev,
- recvmsg->sge.addr,
- recvmsg->sge.length,
- DMA_FROM_DEVICE);
- recvmsg->sge.length = 0;
- }
-
- spin_lock_irqsave(&sc->recv_io.free.lock, flags);
- list_add(&recvmsg->list, &sc->recv_io.free.list);
- spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
-
- queue_work(sc->workqueue, &sc->recv_io.posted.refill_work);
-}
-
static void enqueue_reassembly(struct smbdirect_socket *sc,
struct smbdirect_recv_io *recvmsg,
int data_length)
@@ -424,7 +387,7 @@ static void free_transport(struct smb_direct_transport *t)
if (recvmsg) {
list_del(&recvmsg->list);
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
} else {
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
}
@@ -543,7 +506,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
sp = &sc->parameters;
if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_RECV) {
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
if (wc->status != IB_WC_WR_FLUSH_ERR) {
pr_err("Recv error. status='%s (%d)' opcode=%d\n",
ib_wc_status_msg(wc->status), wc->status,
@@ -571,7 +534,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
switch (sc->recv_io.expected) {
case SMBDIRECT_EXPECT_NEGOTIATE_REQ:
if (wc->byte_len < sizeof(struct smbdirect_negotiate_req)) {
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
smbdirect_connection_schedule_disconnect(sc, -ECONNABORTED);
return;
}
@@ -589,7 +552,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
if (wc->byte_len <
offsetof(struct smbdirect_data_transfer, padding)) {
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
smbdirect_connection_schedule_disconnect(sc, -ECONNABORTED);
return;
}
@@ -599,7 +562,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
data_offset = le32_to_cpu(data_transfer->data_offset);
if (wc->byte_len < data_offset ||
wc->byte_len < (u64)data_offset + data_length) {
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
smbdirect_connection_schedule_disconnect(sc, -ECONNABORTED);
return;
}
@@ -607,7 +570,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
data_length > sp->max_fragmented_recv_size ||
(u64)remaining_data_length + (u64)data_length >
(u64)sp->max_fragmented_recv_size) {
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
smbdirect_connection_schedule_disconnect(sc, -ECONNABORTED);
return;
}
@@ -649,7 +612,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
enqueue_reassembly(sc, recvmsg, (int)data_length);
wake_up(&sc->recv_io.reassembly.wait_queue);
} else
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
return;
}
@@ -662,7 +625,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
* This is an internal error!
*/
WARN_ON_ONCE(sc->recv_io.expected != SMBDIRECT_EXPECT_DATA_TRANSFER);
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
smbdirect_connection_schedule_disconnect(sc, -ECONNABORTED);
}
@@ -788,7 +751,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
}
queue_removed++;
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
offset = 0;
} else {
offset += to_copy;
@@ -832,7 +795,7 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
if (atomic_read(&sc->recv_io.credits.count) < sc->recv_io.credits.target) {
while (true) {
- recvmsg = get_free_recvmsg(sc);
+ recvmsg = smbdirect_connection_get_recv_io(sc);
if (!recvmsg)
break;
@@ -841,7 +804,7 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
ret = smb_direct_post_recv(sc, recvmsg);
if (ret) {
pr_err("Can't post recv: %d\n", ret);
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
break;
}
credits++;
@@ -1830,7 +1793,7 @@ static int smb_direct_prepare_negotiation(struct smbdirect_socket *sc)
sc->recv_io.expected = SMBDIRECT_EXPECT_NEGOTIATE_REQ;
- recvmsg = get_free_recvmsg(sc);
+ recvmsg = smbdirect_connection_get_recv_io(sc);
if (!recvmsg)
return -ENOMEM;
@@ -1848,7 +1811,7 @@ static int smb_direct_prepare_negotiation(struct smbdirect_socket *sc)
return 0;
out_err:
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
return ret;
}
@@ -1888,7 +1851,7 @@ static void smb_direct_destroy_pools(struct smbdirect_socket *sc)
{
struct smbdirect_recv_io *recvmsg;
- while ((recvmsg = get_free_recvmsg(sc)))
+ while ((recvmsg = smbdirect_connection_get_recv_io(sc)))
mempool_free(recvmsg, sc->recv_io.mem.pool);
mempool_destroy(sc->recv_io.mem.pool);
@@ -2211,7 +2174,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
sc->recv_io.reassembly.queue_length--;
list_del(&recvmsg->list);
spin_unlock_irqrestore(&sc->recv_io.reassembly.lock, flags);
- put_recvmsg(sc, recvmsg);
+ smbdirect_connection_put_recv_io(recvmsg);
if (ret == -ECONNABORTED)
return ret;
--
2.43.0
More information about the samba-technical
mailing list