Skip to content

Commit c7316ec

Browse files
metze-sambasmfrench
authored andcommitted
smb: client: make use of smbdirect_socket.recv_io.{posted,credits}
This will make it possible to introduce common helper functions in future. 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 Acked-by: Namjae Jeon <linkinjeon@kernel.org> Signed-off-by: Stefan Metzmacher <metze@samba.org> Signed-off-by: Steve French <stfrench@microsoft.com>
1 parent 5fb9b45 commit c7316ec

File tree

3 files changed

+33
-40
lines changed

3 files changed

+33
-40
lines changed

fs/smb/client/cifs_debug.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,8 +494,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
494494
seq_printf(m, "\nCurrent Credits send_credits: %u "
495495
"receive_credits: %u receive_credit_target: %u",
496496
atomic_read(&sc->send_io.credits.count),
497-
atomic_read(&server->smbd_conn->receive_credits),
498-
server->smbd_conn->receive_credit_target);
497+
atomic_read(&sc->recv_io.credits.count),
498+
sc->recv_io.credits.target);
499499
seq_printf(m, "\nPending send_pending: %u ",
500500
atomic_read(&sc->send_io.pending.count));
501501
seq_printf(m, "\nMR responder_resources: %u "

fs/smb/client/smbdirect.c

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
168168
* disable[_delayed]_work_sync()
169169
*/
170170
disable_work(&sc->disconnect_work);
171-
disable_work(&info->post_send_credits_work);
171+
disable_work(&sc->recv_io.posted.refill_work);
172172
disable_work(&info->mr_recovery_work);
173173
disable_delayed_work(&info->idle_timer_work);
174174

@@ -482,18 +482,15 @@ static bool process_negotiation_response(
482482
log_rdma_event(ERR, "error: credits_requested==0\n");
483483
return false;
484484
}
485-
info->receive_credit_target = le16_to_cpu(packet->credits_requested);
486-
info->receive_credit_target = min_t(u16, info->receive_credit_target, sp->recv_credit_max);
485+
sc->recv_io.credits.target = le16_to_cpu(packet->credits_requested);
486+
sc->recv_io.credits.target = min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max);
487487

488488
if (packet->credits_granted == 0) {
489489
log_rdma_event(ERR, "error: credits_granted==0\n");
490490
return false;
491491
}
492492
atomic_set(&sc->send_io.credits.count, le16_to_cpu(packet->credits_granted));
493493

494-
atomic_set(&info->receive_credits, 0);
495-
atomic_set(&info->receive_posted, 0);
496-
497494
if (le32_to_cpu(packet->preferred_send_size) > sp->max_recv_size) {
498495
log_rdma_event(ERR, "error: preferred_send_size=%d\n",
499496
le32_to_cpu(packet->preferred_send_size));
@@ -536,17 +533,17 @@ static void smbd_post_send_credits(struct work_struct *work)
536533
{
537534
int rc;
538535
struct smbdirect_recv_io *response;
536+
struct smbdirect_socket *sc =
537+
container_of(work, struct smbdirect_socket, recv_io.posted.refill_work);
539538
struct smbd_connection *info =
540-
container_of(work, struct smbd_connection,
541-
post_send_credits_work);
542-
struct smbdirect_socket *sc = &info->socket;
539+
container_of(sc, struct smbd_connection, socket);
543540

544541
if (sc->status != SMBDIRECT_SOCKET_CONNECTED) {
545542
return;
546543
}
547544

548-
if (info->receive_credit_target >
549-
atomic_read(&info->receive_credits)) {
545+
if (sc->recv_io.credits.target >
546+
atomic_read(&sc->recv_io.credits.count)) {
550547
while (true) {
551548
response = get_receive_buffer(info);
552549
if (!response)
@@ -561,14 +558,14 @@ static void smbd_post_send_credits(struct work_struct *work)
561558
break;
562559
}
563560

564-
atomic_inc(&info->receive_posted);
561+
atomic_inc(&sc->recv_io.posted.count);
565562
}
566563
}
567564

568565
/* Promptly send an immediate packet as defined in [MS-SMBD] 3.1.1.1 */
569566
info->send_immediate = true;
570-
if (atomic_read(&info->receive_credits) <
571-
info->receive_credit_target - 1) {
567+
if (atomic_read(&sc->recv_io.credits.count) <
568+
sc->recv_io.credits.target - 1) {
572569
if (info->keep_alive_requested == KEEP_ALIVE_PENDING ||
573570
info->send_immediate) {
574571
log_keep_alive(INFO, "send an empty message\n");
@@ -661,15 +658,15 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
661658
sc->recv_io.reassembly.full_packet_received = true;
662659
}
663660

664-
atomic_dec(&info->receive_posted);
665-
atomic_dec(&info->receive_credits);
666-
old_recv_credit_target = info->receive_credit_target;
667-
info->receive_credit_target =
661+
atomic_dec(&sc->recv_io.posted.count);
662+
atomic_dec(&sc->recv_io.credits.count);
663+
old_recv_credit_target = sc->recv_io.credits.target;
664+
sc->recv_io.credits.target =
668665
le16_to_cpu(data_transfer->credits_requested);
669-
info->receive_credit_target =
670-
min_t(u16, info->receive_credit_target, sp->recv_credit_max);
671-
info->receive_credit_target =
672-
max_t(u16, info->receive_credit_target, 1);
666+
sc->recv_io.credits.target =
667+
min_t(u16, sc->recv_io.credits.target, sp->recv_credit_max);
668+
sc->recv_io.credits.target =
669+
max_t(u16, sc->recv_io.credits.target, 1);
673670
if (le16_to_cpu(data_transfer->credits_granted)) {
674671
atomic_add(le16_to_cpu(data_transfer->credits_granted),
675672
&sc->send_io.credits.count);
@@ -698,8 +695,8 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
698695
* reassembly queue and wake up the reading thread
699696
*/
700697
if (data_length) {
701-
if (info->receive_credit_target > old_recv_credit_target)
702-
queue_work(info->workqueue, &info->post_send_credits_work);
698+
if (sc->recv_io.credits.target > old_recv_credit_target)
699+
queue_work(info->workqueue, &sc->recv_io.posted.refill_work);
703700

704701
enqueue_reassembly(info, response, data_length);
705702
wake_up(&sc->recv_io.reassembly.wait_queue);
@@ -960,16 +957,17 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
960957
*/
961958
static int manage_credits_prior_sending(struct smbd_connection *info)
962959
{
960+
struct smbdirect_socket *sc = &info->socket;
963961
int new_credits;
964962

965-
if (atomic_read(&info->receive_credits) >= info->receive_credit_target)
963+
if (atomic_read(&sc->recv_io.credits.count) >= sc->recv_io.credits.target)
966964
return 0;
967965

968-
new_credits = atomic_read(&info->receive_posted);
966+
new_credits = atomic_read(&sc->recv_io.posted.count);
969967
if (new_credits == 0)
970968
return 0;
971969

972-
new_credits -= atomic_read(&info->receive_credits);
970+
new_credits -= atomic_read(&sc->recv_io.credits.count);
973971
if (new_credits <= 0)
974972
return 0;
975973

@@ -1123,7 +1121,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
11231121
packet->credits_requested = cpu_to_le16(sp->send_credit_target);
11241122

11251123
new_credits = manage_credits_prior_sending(info);
1126-
atomic_add(new_credits, &info->receive_credits);
1124+
atomic_add(new_credits, &sc->recv_io.credits.count);
11271125
packet->credits_granted = cpu_to_le16(new_credits);
11281126

11291127
info->send_immediate = false;
@@ -1181,7 +1179,7 @@ static int smbd_post_send_iter(struct smbd_connection *info,
11811179
mempool_free(request, sc->send_io.mem.pool);
11821180

11831181
/* roll back the granted receive credits */
1184-
atomic_sub(new_credits, &info->receive_credits);
1182+
atomic_sub(new_credits, &sc->recv_io.credits.count);
11851183

11861184
err_alloc:
11871185
if (atomic_dec_and_test(&sc->send_io.pending.count))
@@ -1414,7 +1412,7 @@ static void put_receive_buffer(
14141412
info->count_put_receive_buffer++;
14151413
spin_unlock_irqrestore(&sc->recv_io.free.lock, flags);
14161414

1417-
queue_work(info->workqueue, &info->post_send_credits_work);
1415+
queue_work(info->workqueue, &sc->recv_io.posted.refill_work);
14181416
}
14191417

14201418
/* Preallocate all receive buffer on transport establishment */
@@ -1512,8 +1510,8 @@ void smbd_destroy(struct TCP_Server_Info *server)
15121510
sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
15131511
}
15141512

1515-
log_rdma_event(INFO, "cancelling post_send_credits_work\n");
1516-
disable_work_sync(&info->post_send_credits_work);
1513+
log_rdma_event(INFO, "cancelling recv_io.posted.refill_work\n");
1514+
disable_work_sync(&sc->recv_io.posted.refill_work);
15171515

15181516
log_rdma_event(INFO, "destroying qp\n");
15191517
ib_drain_qp(sc->ib.qp);
@@ -1865,7 +1863,7 @@ static struct smbd_connection *_smbd_get_connection(
18651863
queue_delayed_work(info->workqueue, &info->idle_timer_work,
18661864
msecs_to_jiffies(sp->keepalive_interval_msec));
18671865

1868-
INIT_WORK(&info->post_send_credits_work, smbd_post_send_credits);
1866+
INIT_WORK(&sc->recv_io.posted.refill_work, smbd_post_send_credits);
18691867

18701868
rc = smbd_negotiate(info);
18711869
if (rc) {

fs/smb/client/smbdirect.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,9 @@ enum keep_alive_status {
4545
struct smbd_connection {
4646
struct smbdirect_socket socket;
4747

48-
struct work_struct post_send_credits_work;
49-
atomic_t receive_posted;
50-
5148
/* dynamic connection parameters defined in [MS-SMBD] 3.1.1.1 */
5249
enum keep_alive_status keep_alive_requested;
5350
int protocol;
54-
atomic_t receive_credits;
55-
u16 receive_credit_target;
5651

5752
/* Memory registrations */
5853
/* Maximum number of RDMA read/write outstanding on this connection */

0 commit comments

Comments
 (0)