Skip to content

Commit 69cb7dc

Browse files
Hans Wippeldavem330
authored andcommitted
net/smc: add common buffer size in send and receive buffer descriptors
In addition to the buffer references, SMC currently stores the sizes of the receive and send buffers in each connection as separate variables. This patch introduces a buffer length variable in the common buffer descriptor and uses this length instead. Signed-off-by: Hans Wippel <[email protected]> Signed-off-by: Ursula Braun <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d683051 commit 69cb7dc

File tree

9 files changed

+31
-35
lines changed

9 files changed

+31
-35
lines changed

net/smc/af_smc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1421,7 +1421,7 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
14211421
/* output queue size (not send + not acked) */
14221422
if (smc->sk.sk_state == SMC_LISTEN)
14231423
return -EINVAL;
1424-
answ = smc->conn.sndbuf_size -
1424+
answ = smc->conn.sndbuf_desc->len -
14251425
atomic_read(&smc->conn.sndbuf_space);
14261426
break;
14271427
case SIOCOUTQNSD:

net/smc/smc.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,7 @@ struct smc_connection {
126126
int rtoken_idx; /* idx to peer RMB rkey/addr */
127127

128128
struct smc_buf_desc *sndbuf_desc; /* send buffer descriptor */
129-
int sndbuf_size; /* sndbuf size <== sock wmem */
130129
struct smc_buf_desc *rmb_desc; /* RMBE descriptor */
131-
int rmbe_size; /* RMBE size <== sock rmem */
132130
int rmbe_size_short;/* compressed notation */
133131
int rmbe_update_limit;
134132
/* lower limit for consumer

net/smc/smc_cdc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ static void smc_cdc_tx_handler(struct smc_wr_tx_pend_priv *pnd_snd,
4444
smc = container_of(cdcpend->conn, struct smc_sock, conn);
4545
bh_lock_sock(&smc->sk);
4646
if (!wc_status) {
47-
diff = smc_curs_diff(cdcpend->conn->sndbuf_size,
47+
diff = smc_curs_diff(cdcpend->conn->sndbuf_desc->len,
4848
&cdcpend->conn->tx_curs_fin,
4949
&cdcpend->cursor);
5050
/* sndbuf_space is decreased in smc_sendmsg */
5151
smp_mb__before_atomic();
5252
atomic_add(diff, &cdcpend->conn->sndbuf_space);
53-
/* guarantee 0 <= sndbuf_space <= sndbuf_size */
53+
/* guarantee 0 <= sndbuf_space <= sndbuf_desc->len */
5454
smp_mb__after_atomic();
5555
smc_curs_write(&cdcpend->conn->tx_curs_fin,
5656
smc_curs_read(&cdcpend->cursor, cdcpend->conn),
@@ -198,13 +198,13 @@ static void smc_cdc_msg_recv_action(struct smc_sock *smc,
198198
smp_mb__after_atomic();
199199
}
200200

201-
diff_prod = smc_curs_diff(conn->rmbe_size, &prod_old,
201+
diff_prod = smc_curs_diff(conn->rmb_desc->len, &prod_old,
202202
&conn->local_rx_ctrl.prod);
203203
if (diff_prod) {
204204
/* bytes_to_rcv is decreased in smc_recvmsg */
205205
smp_mb__before_atomic();
206206
atomic_add(diff_prod, &conn->bytes_to_rcv);
207-
/* guarantee 0 <= bytes_to_rcv <= rmbe_size */
207+
/* guarantee 0 <= bytes_to_rcv <= rmb_desc->len */
208208
smp_mb__after_atomic();
209209
smc->sk.sk_data_ready(&smc->sk);
210210
} else if ((conn->local_rx_ctrl.prod_flags.write_blocked) ||

net/smc/smc_core.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,12 @@ static int smc_lgr_create(struct smc_sock *smc,
236236

237237
static void smc_buf_unuse(struct smc_connection *conn)
238238
{
239-
if (conn->sndbuf_desc) {
239+
if (conn->sndbuf_desc)
240240
conn->sndbuf_desc->used = 0;
241-
conn->sndbuf_size = 0;
242-
}
243241
if (conn->rmb_desc) {
244242
if (!conn->rmb_desc->regerr) {
245243
conn->rmb_desc->reused = 1;
246244
conn->rmb_desc->used = 0;
247-
conn->rmbe_size = 0;
248245
} else {
249246
/* buf registration failed, reuse not possible */
250247
struct smc_link_group *lgr = conn->lgr;
@@ -616,6 +613,7 @@ static struct smc_buf_desc *smc_new_buf_create(struct smc_link_group *lgr,
616613
}
617614
}
618615

616+
buf_desc->len = bufsize;
619617
return buf_desc;
620618
}
621619

@@ -675,14 +673,12 @@ static int __smc_buf_create(struct smc_sock *smc, bool is_rmb)
675673

676674
if (is_rmb) {
677675
conn->rmb_desc = buf_desc;
678-
conn->rmbe_size = bufsize;
679676
conn->rmbe_size_short = bufsize_short;
680677
smc->sk.sk_rcvbuf = bufsize * 2;
681678
atomic_set(&conn->bytes_to_rcv, 0);
682679
conn->rmbe_update_limit = smc_rmb_wnd_update_limit(bufsize);
683680
} else {
684681
conn->sndbuf_desc = buf_desc;
685-
conn->sndbuf_size = bufsize;
686682
smc->sk.sk_sndbuf = bufsize * 2;
687683
atomic_set(&conn->sndbuf_space, bufsize);
688684
}

net/smc/smc_core.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ struct smc_buf_desc {
124124
struct list_head list;
125125
void *cpu_addr; /* virtual address of buffer */
126126
struct page *pages;
127+
int len; /* length of buffer */
127128
struct sg_table sgt[SMC_LINKS_PER_LGR_MAX];/* virtual buffer */
128129
struct ib_mr *mr_rx[SMC_LINKS_PER_LGR_MAX];
129130
/* for rmb only: memory region

net/smc/smc_diag.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ static int __smc_diag_dump(struct sock *sk, struct sk_buff *skb,
101101
struct smc_connection *conn = &smc->conn;
102102
struct smc_diag_conninfo cinfo = {
103103
.token = conn->alert_token_local,
104-
.sndbuf_size = conn->sndbuf_size,
105-
.rmbe_size = conn->rmbe_size,
104+
.sndbuf_size = conn->sndbuf_desc ?
105+
conn->sndbuf_desc->len : 0,
106+
.rmbe_size = conn->rmb_desc ? conn->rmb_desc->len : 0,
106107
.peer_rmbe_size = conn->peer_rmbe_size,
107108

108109
.rx_prod.wrap = conn->local_rx_ctrl.prod.wrap,

net/smc/smc_rx.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ static void smc_rx_wake_up(struct sock *sk)
5151
static void smc_rx_update_consumer(struct smc_connection *conn,
5252
union smc_host_cursor cons, size_t len)
5353
{
54-
smc_curs_add(conn->rmbe_size, &cons, len);
54+
smc_curs_add(conn->rmb_desc->len, &cons, len);
5555
smc_curs_write(&conn->local_tx_ctrl.cons, smc_curs_read(&cons, conn),
5656
conn);
5757
/* send consumer cursor update if required */
@@ -288,11 +288,11 @@ int smc_rx_recvmsg(struct smc_sock *smc, struct msghdr *msg,
288288
conn);
289289
/* subsequent splice() calls pick up where previous left */
290290
if (splbytes)
291-
smc_curs_add(conn->rmbe_size, &cons, splbytes);
291+
smc_curs_add(conn->rmb_desc->len, &cons, splbytes);
292292
/* determine chunks where to read from rcvbuf */
293293
/* either unwrapped case, or 1st chunk of wrapped case */
294-
chunk_len = min_t(size_t,
295-
copylen, conn->rmbe_size - cons.count);
294+
chunk_len = min_t(size_t, copylen, conn->rmb_desc->len -
295+
cons.count);
296296
chunk_len_sum = chunk_len;
297297
chunk_off = cons.count;
298298
smc_rmb_sync_sg_for_cpu(conn);
@@ -331,7 +331,7 @@ int smc_rx_recvmsg(struct smc_sock *smc, struct msghdr *msg,
331331
/* increased in recv tasklet smc_cdc_msg_rcv() */
332332
smp_mb__before_atomic();
333333
atomic_sub(copylen, &conn->bytes_to_rcv);
334-
/* guarantee 0 <= bytes_to_rcv <= rmbe_size */
334+
/* guarantee 0 <= bytes_to_rcv <= rmb_desc->len */
335335
smp_mb__after_atomic();
336336
if (msg)
337337
smc_rx_update_consumer(conn, cons, copylen);

net/smc/smc_tx.c

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -180,8 +180,8 @@ int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len)
180180
tx_cnt_prep = prep.count;
181181
/* determine chunks where to write into sndbuf */
182182
/* either unwrapped case, or 1st chunk of wrapped case */
183-
chunk_len = min_t(size_t,
184-
copylen, conn->sndbuf_size - tx_cnt_prep);
183+
chunk_len = min_t(size_t, copylen, conn->sndbuf_desc->len -
184+
tx_cnt_prep);
185185
chunk_len_sum = chunk_len;
186186
chunk_off = tx_cnt_prep;
187187
smc_sndbuf_sync_sg_for_cpu(conn);
@@ -206,21 +206,21 @@ int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len)
206206
}
207207
smc_sndbuf_sync_sg_for_device(conn);
208208
/* update cursors */
209-
smc_curs_add(conn->sndbuf_size, &prep, copylen);
209+
smc_curs_add(conn->sndbuf_desc->len, &prep, copylen);
210210
smc_curs_write(&conn->tx_curs_prep,
211211
smc_curs_read(&prep, conn),
212212
conn);
213213
/* increased in send tasklet smc_cdc_tx_handler() */
214214
smp_mb__before_atomic();
215215
atomic_sub(copylen, &conn->sndbuf_space);
216-
/* guarantee 0 <= sndbuf_space <= sndbuf_size */
216+
/* guarantee 0 <= sndbuf_space <= sndbuf_desc->len */
217217
smp_mb__after_atomic();
218218
/* since we just produced more new data into sndbuf,
219219
* trigger sndbuf consumer: RDMA write into peer RMBE and CDC
220220
*/
221221
if ((msg->msg_flags & MSG_MORE || smc_tx_is_corked(smc)) &&
222222
(atomic_read(&conn->sndbuf_space) >
223-
(conn->sndbuf_size >> 1)))
223+
(conn->sndbuf_desc->len >> 1)))
224224
/* for a corked socket defer the RDMA writes if there
225225
* is still sufficient sndbuf_space available
226226
*/
@@ -286,7 +286,7 @@ static inline void smc_tx_advance_cursors(struct smc_connection *conn,
286286
atomic_sub(len, &conn->peer_rmbe_space);
287287
/* guarantee 0 <= peer_rmbe_space <= peer_rmbe_size */
288288
smp_mb__after_atomic();
289-
smc_curs_add(conn->sndbuf_size, sent, len);
289+
smc_curs_add(conn->sndbuf_desc->len, sent, len);
290290
}
291291

292292
/* sndbuf consumer: prepare all necessary (src&dst) chunks of data transmit;
@@ -309,7 +309,7 @@ static int smc_tx_rdma_writes(struct smc_connection *conn)
309309
smc_curs_write(&sent, smc_curs_read(&conn->tx_curs_sent, conn), conn);
310310
smc_curs_write(&prep, smc_curs_read(&conn->tx_curs_prep, conn), conn);
311311
/* cf. wmem_alloc - (snd_max - snd_una) */
312-
to_send = smc_curs_diff(conn->sndbuf_size, &sent, &prep);
312+
to_send = smc_curs_diff(conn->sndbuf_desc->len, &sent, &prep);
313313
if (to_send <= 0)
314314
return 0;
315315

@@ -351,12 +351,12 @@ static int smc_tx_rdma_writes(struct smc_connection *conn)
351351
dst_len_sum = dst_len;
352352
src_off = sent.count;
353353
/* dst_len determines the maximum src_len */
354-
if (sent.count + dst_len <= conn->sndbuf_size) {
354+
if (sent.count + dst_len <= conn->sndbuf_desc->len) {
355355
/* unwrapped src case: single chunk of entire dst_len */
356356
src_len = dst_len;
357357
} else {
358358
/* wrapped src case: 2 chunks of sum dst_len; start with 1st: */
359-
src_len = conn->sndbuf_size - sent.count;
359+
src_len = conn->sndbuf_desc->len - sent.count;
360360
}
361361
src_len_sum = src_len;
362362
dma_addr = sg_dma_address(conn->sndbuf_desc->sgt[SMC_SINGLE_LINK].sgl);
@@ -368,8 +368,8 @@ static int smc_tx_rdma_writes(struct smc_connection *conn)
368368
sges[srcchunk].lkey = link->roce_pd->local_dma_lkey;
369369
num_sges++;
370370
src_off += src_len;
371-
if (src_off >= conn->sndbuf_size)
372-
src_off -= conn->sndbuf_size;
371+
if (src_off >= conn->sndbuf_desc->len)
372+
src_off -= conn->sndbuf_desc->len;
373373
/* modulo in send ring */
374374
if (src_len_sum == dst_len)
375375
break; /* either on 1st or 2nd iteration */
@@ -387,7 +387,7 @@ static int smc_tx_rdma_writes(struct smc_connection *conn)
387387
dst_len = len - dst_len; /* remainder */
388388
dst_len_sum += dst_len;
389389
src_len = min_t(int,
390-
dst_len, conn->sndbuf_size - sent.count);
390+
dst_len, conn->sndbuf_desc->len - sent.count);
391391
src_len_sum = src_len;
392392
}
393393

@@ -484,11 +484,11 @@ void smc_tx_consumer_update(struct smc_connection *conn)
484484
smc_curs_write(&cfed,
485485
smc_curs_read(&conn->rx_curs_confirmed, conn),
486486
conn);
487-
to_confirm = smc_curs_diff(conn->rmbe_size, &cfed, &cons);
487+
to_confirm = smc_curs_diff(conn->rmb_desc->len, &cfed, &cons);
488488

489489
if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req ||
490490
((to_confirm > conn->rmbe_update_limit) &&
491-
((to_confirm > (conn->rmbe_size / 2)) ||
491+
((to_confirm > (conn->rmb_desc->len / 2)) ||
492492
conn->local_rx_ctrl.prod_flags.write_blocked))) {
493493
if ((smc_cdc_get_slot_and_msg_send(conn) < 0) &&
494494
conn->alert_token_local) { /* connection healthy */

net/smc/smc_tx.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ static inline int smc_tx_prepared_sends(struct smc_connection *conn)
2424

2525
smc_curs_write(&sent, smc_curs_read(&conn->tx_curs_sent, conn), conn);
2626
smc_curs_write(&prep, smc_curs_read(&conn->tx_curs_prep, conn), conn);
27-
return smc_curs_diff(conn->sndbuf_size, &sent, &prep);
27+
return smc_curs_diff(conn->sndbuf_desc->len, &sent, &prep);
2828
}
2929

3030
void smc_tx_work(struct work_struct *work);

0 commit comments

Comments
 (0)