Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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 <hwippel@linux.ibm.com>
Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Hans Wippel and committed by
David S. Miller
69cb7dc0 d6830519

+31 -35
+1 -1
net/smc/af_smc.c
··· 1421 1421 /* output queue size (not send + not acked) */ 1422 1422 if (smc->sk.sk_state == SMC_LISTEN) 1423 1423 return -EINVAL; 1424 - answ = smc->conn.sndbuf_size - 1424 + answ = smc->conn.sndbuf_desc->len - 1425 1425 atomic_read(&smc->conn.sndbuf_space); 1426 1426 break; 1427 1427 case SIOCOUTQNSD:
-2
net/smc/smc.h
··· 126 126 int rtoken_idx; /* idx to peer RMB rkey/addr */ 127 127 128 128 struct smc_buf_desc *sndbuf_desc; /* send buffer descriptor */ 129 - int sndbuf_size; /* sndbuf size <== sock wmem */ 130 129 struct smc_buf_desc *rmb_desc; /* RMBE descriptor */ 131 - int rmbe_size; /* RMBE size <== sock rmem */ 132 130 int rmbe_size_short;/* compressed notation */ 133 131 int rmbe_update_limit; 134 132 /* lower limit for consumer
+4 -4
net/smc/smc_cdc.c
··· 44 44 smc = container_of(cdcpend->conn, struct smc_sock, conn); 45 45 bh_lock_sock(&smc->sk); 46 46 if (!wc_status) { 47 - diff = smc_curs_diff(cdcpend->conn->sndbuf_size, 47 + diff = smc_curs_diff(cdcpend->conn->sndbuf_desc->len, 48 48 &cdcpend->conn->tx_curs_fin, 49 49 &cdcpend->cursor); 50 50 /* sndbuf_space is decreased in smc_sendmsg */ 51 51 smp_mb__before_atomic(); 52 52 atomic_add(diff, &cdcpend->conn->sndbuf_space); 53 - /* guarantee 0 <= sndbuf_space <= sndbuf_size */ 53 + /* guarantee 0 <= sndbuf_space <= sndbuf_desc->len */ 54 54 smp_mb__after_atomic(); 55 55 smc_curs_write(&cdcpend->conn->tx_curs_fin, 56 56 smc_curs_read(&cdcpend->cursor, cdcpend->conn), ··· 198 198 smp_mb__after_atomic(); 199 199 } 200 200 201 - diff_prod = smc_curs_diff(conn->rmbe_size, &prod_old, 201 + diff_prod = smc_curs_diff(conn->rmb_desc->len, &prod_old, 202 202 &conn->local_rx_ctrl.prod); 203 203 if (diff_prod) { 204 204 /* bytes_to_rcv is decreased in smc_recvmsg */ 205 205 smp_mb__before_atomic(); 206 206 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 */ 208 208 smp_mb__after_atomic(); 209 209 smc->sk.sk_data_ready(&smc->sk); 210 210 } else if ((conn->local_rx_ctrl.prod_flags.write_blocked) ||
+2 -6
net/smc/smc_core.c
··· 236 236 237 237 static void smc_buf_unuse(struct smc_connection *conn) 238 238 { 239 - if (conn->sndbuf_desc) { 239 + if (conn->sndbuf_desc) 240 240 conn->sndbuf_desc->used = 0; 241 - conn->sndbuf_size = 0; 242 - } 243 241 if (conn->rmb_desc) { 244 242 if (!conn->rmb_desc->regerr) { 245 243 conn->rmb_desc->reused = 1; 246 244 conn->rmb_desc->used = 0; 247 - conn->rmbe_size = 0; 248 245 } else { 249 246 /* buf registration failed, reuse not possible */ 250 247 struct smc_link_group *lgr = conn->lgr; ··· 613 616 } 614 617 } 615 618 619 + buf_desc->len = bufsize; 616 620 return buf_desc; 617 621 } 618 622 ··· 673 675 674 676 if (is_rmb) { 675 677 conn->rmb_desc = buf_desc; 676 - conn->rmbe_size = bufsize; 677 678 conn->rmbe_size_short = bufsize_short; 678 679 smc->sk.sk_rcvbuf = bufsize * 2; 679 680 atomic_set(&conn->bytes_to_rcv, 0); 680 681 conn->rmbe_update_limit = smc_rmb_wnd_update_limit(bufsize); 681 682 } else { 682 683 conn->sndbuf_desc = buf_desc; 683 - conn->sndbuf_size = bufsize; 684 684 smc->sk.sk_sndbuf = bufsize * 2; 685 685 atomic_set(&conn->sndbuf_space, bufsize); 686 686 }
+1
net/smc/smc_core.h
··· 124 124 struct list_head list; 125 125 void *cpu_addr; /* virtual address of buffer */ 126 126 struct page *pages; 127 + int len; /* length of buffer */ 127 128 struct sg_table sgt[SMC_LINKS_PER_LGR_MAX];/* virtual buffer */ 128 129 struct ib_mr *mr_rx[SMC_LINKS_PER_LGR_MAX]; 129 130 /* for rmb only: memory region
+3 -2
net/smc/smc_diag.c
··· 101 101 struct smc_connection *conn = &smc->conn; 102 102 struct smc_diag_conninfo cinfo = { 103 103 .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, 106 107 .peer_rmbe_size = conn->peer_rmbe_size, 107 108 108 109 .rx_prod.wrap = conn->local_rx_ctrl.prod.wrap,
+5 -5
net/smc/smc_rx.c
··· 51 51 static void smc_rx_update_consumer(struct smc_connection *conn, 52 52 union smc_host_cursor cons, size_t len) 53 53 { 54 - smc_curs_add(conn->rmbe_size, &cons, len); 54 + smc_curs_add(conn->rmb_desc->len, &cons, len); 55 55 smc_curs_write(&conn->local_tx_ctrl.cons, smc_curs_read(&cons, conn), 56 56 conn); 57 57 /* send consumer cursor update if required */ ··· 288 288 conn); 289 289 /* subsequent splice() calls pick up where previous left */ 290 290 if (splbytes) 291 - smc_curs_add(conn->rmbe_size, &cons, splbytes); 291 + smc_curs_add(conn->rmb_desc->len, &cons, splbytes); 292 292 /* determine chunks where to read from rcvbuf */ 293 293 /* 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); 296 296 chunk_len_sum = chunk_len; 297 297 chunk_off = cons.count; 298 298 smc_rmb_sync_sg_for_cpu(conn); ··· 331 331 /* increased in recv tasklet smc_cdc_msg_rcv() */ 332 332 smp_mb__before_atomic(); 333 333 atomic_sub(copylen, &conn->bytes_to_rcv); 334 - /* guarantee 0 <= bytes_to_rcv <= rmbe_size */ 334 + /* guarantee 0 <= bytes_to_rcv <= rmb_desc->len */ 335 335 smp_mb__after_atomic(); 336 336 if (msg) 337 337 smc_rx_update_consumer(conn, cons, copylen);
+14 -14
net/smc/smc_tx.c
··· 180 180 tx_cnt_prep = prep.count; 181 181 /* determine chunks where to write into sndbuf */ 182 182 /* 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); 185 185 chunk_len_sum = chunk_len; 186 186 chunk_off = tx_cnt_prep; 187 187 smc_sndbuf_sync_sg_for_cpu(conn); ··· 206 206 } 207 207 smc_sndbuf_sync_sg_for_device(conn); 208 208 /* update cursors */ 209 - smc_curs_add(conn->sndbuf_size, &prep, copylen); 209 + smc_curs_add(conn->sndbuf_desc->len, &prep, copylen); 210 210 smc_curs_write(&conn->tx_curs_prep, 211 211 smc_curs_read(&prep, conn), 212 212 conn); 213 213 /* increased in send tasklet smc_cdc_tx_handler() */ 214 214 smp_mb__before_atomic(); 215 215 atomic_sub(copylen, &conn->sndbuf_space); 216 - /* guarantee 0 <= sndbuf_space <= sndbuf_size */ 216 + /* guarantee 0 <= sndbuf_space <= sndbuf_desc->len */ 217 217 smp_mb__after_atomic(); 218 218 /* since we just produced more new data into sndbuf, 219 219 * trigger sndbuf consumer: RDMA write into peer RMBE and CDC 220 220 */ 221 221 if ((msg->msg_flags & MSG_MORE || smc_tx_is_corked(smc)) && 222 222 (atomic_read(&conn->sndbuf_space) > 223 - (conn->sndbuf_size >> 1))) 223 + (conn->sndbuf_desc->len >> 1))) 224 224 /* for a corked socket defer the RDMA writes if there 225 225 * is still sufficient sndbuf_space available 226 226 */ ··· 286 286 atomic_sub(len, &conn->peer_rmbe_space); 287 287 /* guarantee 0 <= peer_rmbe_space <= peer_rmbe_size */ 288 288 smp_mb__after_atomic(); 289 - smc_curs_add(conn->sndbuf_size, sent, len); 289 + smc_curs_add(conn->sndbuf_desc->len, sent, len); 290 290 } 291 291 292 292 /* sndbuf consumer: prepare all necessary (src&dst) chunks of data transmit; ··· 309 309 smc_curs_write(&sent, smc_curs_read(&conn->tx_curs_sent, conn), conn); 310 310 smc_curs_write(&prep, smc_curs_read(&conn->tx_curs_prep, conn), conn); 311 311 /* 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); 313 313 if (to_send <= 0) 314 314 return 0; 315 315 ··· 351 351 dst_len_sum = dst_len; 352 352 src_off = sent.count; 353 353 /* 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) { 355 355 /* unwrapped src case: single chunk of entire dst_len */ 356 356 src_len = dst_len; 357 357 } else { 358 358 /* 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; 360 360 } 361 361 src_len_sum = src_len; 362 362 dma_addr = sg_dma_address(conn->sndbuf_desc->sgt[SMC_SINGLE_LINK].sgl); ··· 368 368 sges[srcchunk].lkey = link->roce_pd->local_dma_lkey; 369 369 num_sges++; 370 370 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; 373 373 /* modulo in send ring */ 374 374 if (src_len_sum == dst_len) 375 375 break; /* either on 1st or 2nd iteration */ ··· 387 387 dst_len = len - dst_len; /* remainder */ 388 388 dst_len_sum += dst_len; 389 389 src_len = min_t(int, 390 - dst_len, conn->sndbuf_size - sent.count); 390 + dst_len, conn->sndbuf_desc->len - sent.count); 391 391 src_len_sum = src_len; 392 392 } 393 393 ··· 484 484 smc_curs_write(&cfed, 485 485 smc_curs_read(&conn->rx_curs_confirmed, conn), 486 486 conn); 487 - to_confirm = smc_curs_diff(conn->rmbe_size, &cfed, &cons); 487 + to_confirm = smc_curs_diff(conn->rmb_desc->len, &cfed, &cons); 488 488 489 489 if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req || 490 490 ((to_confirm > conn->rmbe_update_limit) && 491 - ((to_confirm > (conn->rmbe_size / 2)) || 491 + ((to_confirm > (conn->rmb_desc->len / 2)) || 492 492 conn->local_rx_ctrl.prod_flags.write_blocked))) { 493 493 if ((smc_cdc_get_slot_and_msg_send(conn) < 0) && 494 494 conn->alert_token_local) { /* connection healthy */
+1 -1
net/smc/smc_tx.h
··· 24 24 25 25 smc_curs_write(&sent, smc_curs_read(&conn->tx_curs_sent, conn), conn); 26 26 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); 28 28 } 29 29 30 30 void smc_tx_work(struct work_struct *work);