net/smc: calculate write offset in RMB only once per connection
authorHans Wippel <hwippel@linux.ibm.com>
Fri, 18 May 2018 07:34:13 +0000 (09:34 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 18 May 2018 17:15:01 +0000 (13:15 -0400)
Currently, the write offset within the RMB is calculated on each write
operation although it is fixed for each connection. With this patch, the
offset is calculated once and stored in a connection specific variable.

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>
net/smc/af_smc.c
net/smc/smc.h
net/smc/smc_tx.c

index bd67430f37309a0d036f7931e69321a9627f0d96..9871604ebb53cd555c02f8fb6467555de34cbf7a 100644 (file)
@@ -377,10 +377,13 @@ static int smc_clnt_conf_first_link(struct smc_sock *smc)
 static void smc_conn_save_peer_info(struct smc_sock *smc,
                                    struct smc_clc_msg_accept_confirm *clc)
 {
+       int bufsize = smc_uncompress_bufsize(clc->rmbe_size);
+
        smc->conn.peer_rmbe_idx = clc->rmbe_idx;
        smc->conn.local_tx_ctrl.token = ntohl(clc->rmbe_alert_token);
-       smc->conn.peer_rmbe_size = smc_uncompress_bufsize(clc->rmbe_size);
+       smc->conn.peer_rmbe_size = bufsize;
        atomic_set(&smc->conn.peer_rmbe_space, smc->conn.peer_rmbe_size);
+       smc->conn.tx_off = bufsize * (smc->conn.peer_rmbe_idx - 1);
 }
 
 static void smc_link_save_peer_info(struct smc_link *link,
index fb8dec8bc17f32364097912cf50601c4131c2166..9bc37645e7d52dfdbfaeb4ca3678b75f7e74a5ed 100644 (file)
@@ -151,6 +151,7 @@ struct smc_connection {
        u16                     tx_cdc_seq;     /* sequence # for CDC send */
        spinlock_t              send_lock;      /* protect wr_sends */
        struct delayed_work     tx_work;        /* retry of smc_cdc_msg_send */
+       u32                     tx_off;         /* base offset in peer rmb */
 
        struct smc_host_cdc_msg local_rx_ctrl;  /* filled during event_handl.
                                                 * .prod cf. TCP rcv_nxt
index 58a56c992b2618cf9e43b903789ad402d40772be..1f4a38b857f0a725014fa75bc842d509453a7c87 100644 (file)
@@ -261,7 +261,7 @@ static int smc_tx_rdma_write(struct smc_connection *conn, int peer_rmbe_offset,
        rdma_wr.remote_addr =
                lgr->rtokens[conn->rtoken_idx][SMC_SINGLE_LINK].dma_addr +
                /* RMBE within RMB */
-               ((conn->peer_rmbe_idx - 1) * conn->peer_rmbe_size) +
+               conn->tx_off +
                /* offset within RMBE */
                peer_rmbe_offset;
        rdma_wr.rkey = lgr->rtokens[conn->rtoken_idx][SMC_SINGLE_LINK].rkey;