Skip to content

Commit e6727f3

Browse files
Ursula Braundavem330
authored andcommitted
smc: send data (through RDMA)
copy data to kernel send buffer, and trigger RDMA write Signed-off-by: Ursula Braun <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5f08318 commit e6727f3

File tree

6 files changed

+491
-4
lines changed

6 files changed

+491
-4
lines changed

net/smc/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
obj-$(CONFIG_SMC) += smc.o
22
smc-y := af_smc.o smc_pnet.o smc_ib.o smc_clc.o smc_core.o smc_wr.o smc_llc.o
3-
smc-y += smc_cdc.o
3+
smc-y += smc_cdc.o smc_tx.o

net/smc/af_smc.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include "smc_core.h"
3838
#include "smc_ib.h"
3939
#include "smc_pnet.h"
40+
#include "smc_tx.h"
4041

4142
static DEFINE_MUTEX(smc_create_lgr_pending); /* serialize link group
4243
* creation
@@ -410,6 +411,8 @@ static int smc_connect_rdma(struct smc_sock *smc)
410411
}
411412

412413
mutex_unlock(&smc_create_lgr_pending);
414+
smc_tx_init(smc);
415+
413416
out_connected:
414417
smc_copy_sock_settings_to_clc(smc);
415418
smc->sk.sk_state = SMC_ACTIVE;
@@ -751,6 +754,8 @@ static void smc_listen_work(struct work_struct *work)
751754
goto decline_rdma;
752755
}
753756

757+
smc_tx_init(new_smc);
758+
754759
out_connected:
755760
sk_refcnt_debug_inc(newsmcsk);
756761
newsmcsk->sk_state = SMC_ACTIVE;
@@ -924,7 +929,7 @@ static int smc_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
924929
if (smc->use_fallback)
925930
rc = smc->clcsock->ops->sendmsg(smc->clcsock, msg, len);
926931
else
927-
rc = sock_no_sendmsg(sock, msg, len);
932+
rc = smc_tx_sendmsg(smc, msg, len);
928933
out:
929934
release_sock(sk);
930935
return rc;
@@ -1005,6 +1010,12 @@ static unsigned int smc_poll(struct file *file, struct socket *sock,
10051010
mask |= smc_accept_poll(sk);
10061011
if (sk->sk_err)
10071012
mask |= POLLERR;
1013+
if (atomic_read(&smc->conn.sndbuf_space)) {
1014+
mask |= POLLOUT | POLLWRNORM;
1015+
} else {
1016+
sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
1017+
set_bit(SOCK_NOSPACE, &sk->sk_socket->flags);
1018+
}
10081019
/* for now - to be enhanced in follow-on patch */
10091020
}
10101021

net/smc/smc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ struct smc_connection {
133133
atomic_t sndbuf_space; /* remaining space in sndbuf */
134134
u16 tx_cdc_seq; /* sequence # for CDC send */
135135
spinlock_t send_lock; /* protect wr_sends */
136+
struct work_struct tx_work; /* retry of smc_cdc_msg_send */
136137

137138
struct smc_host_cdc_msg local_rx_ctrl; /* filled during event_handl.
138139
* .prod cf. TCP rcv_nxt

net/smc/smc_cdc.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "smc.h"
1515
#include "smc_wr.h"
1616
#include "smc_cdc.h"
17+
#include "smc_tx.h"
1718

1819
/********************************** send *************************************/
1920

@@ -52,7 +53,7 @@ static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd,
5253
smc_curs_read(&cdcpend->cursor, cdcpend->conn),
5354
cdcpend->conn);
5455
}
55-
/* subsequent patch: wake if send buffer space available */
56+
smc_tx_sndbuf_nonfull(smc);
5657
bh_unlock_sock(&smc->sk);
5758
}
5859

@@ -204,7 +205,9 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
204205
/* subsequent patch: terminate connection */
205206

206207
/* piggy backed tx info */
207-
/* subsequent patch: wake receivers if receive buffer space available */
208+
/* trigger sndbuf consumer: RDMA write into peer RMBE and CDC */
209+
if (diff_cons && smc_tx_prepared_sends(conn))
210+
smc_tx_sndbuf_nonempty(conn);
208211

209212
/* subsequent patch: trigger socket release if connection closed */
210213

0 commit comments

Comments
 (0)