mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
net/smc: rdma write inline if qp has sufficient inline space
Rdma write with inline flag when sending small packages, whose length is shorter than the qp's max_inline_data, can help reducing latency. In my test environment, which are 2 VMs running on the same physical host and whose NICs(ConnectX-4Lx) are working on SR-IOV mode, qperf shows 0.5us-0.7us improvement in latency. Test command: server: smc_run taskset -c 1 qperf client: smc_run taskset -c 1 qperf <server ip> -oo \ msg_size:1:2K:*2 -t 30 -vu tcp_lat The results shown below: msgsize before after 1B 11.2 us 10.6 us (-0.6 us) 2B 11.2 us 10.7 us (-0.5 us) 4B 11.3 us 10.7 us (-0.6 us) 8B 11.2 us 10.6 us (-0.6 us) 16B 11.3 us 10.7 us (-0.6 us) 32B 11.3 us 10.6 us (-0.7 us) 64B 11.2 us 11.2 us (0 us) 128B 11.2 us 11.2 us (0 us) 256B 11.2 us 11.2 us (0 us) 512B 11.4 us 11.3 us (-0.1 us) 1KB 11.4 us 11.5 us (0.1 us) 2KB 11.5 us 11.5 us (0 us) Signed-off-by: Guangguan Wang <guangguan.wang@linux.alibaba.com> Reviewed-by: Tony Lu <tonylu@linux.alibaba.com> Tested-by: kernel test robot <lkp@intel.com> Acked-by: Karsten Graul <kgraul@linux.ibm.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
b632eb0697
commit
793a7df630
@ -391,12 +391,20 @@ static int smcr_tx_rdma_writes(struct smc_connection *conn, size_t len,
|
||||
int rc;
|
||||
|
||||
for (dstchunk = 0; dstchunk < 2; dstchunk++) {
|
||||
struct ib_sge *sge =
|
||||
wr_rdma_buf->wr_tx_rdma[dstchunk].wr.sg_list;
|
||||
struct ib_rdma_wr *wr = &wr_rdma_buf->wr_tx_rdma[dstchunk];
|
||||
struct ib_sge *sge = wr->wr.sg_list;
|
||||
u64 base_addr = dma_addr;
|
||||
|
||||
if (dst_len < link->qp_attr.cap.max_inline_data) {
|
||||
base_addr = (uintptr_t)conn->sndbuf_desc->cpu_addr;
|
||||
wr->wr.send_flags |= IB_SEND_INLINE;
|
||||
} else {
|
||||
wr->wr.send_flags &= ~IB_SEND_INLINE;
|
||||
}
|
||||
|
||||
num_sges = 0;
|
||||
for (srcchunk = 0; srcchunk < 2; srcchunk++) {
|
||||
sge[srcchunk].addr = dma_addr + src_off;
|
||||
sge[srcchunk].addr = base_addr + src_off;
|
||||
sge[srcchunk].length = src_len;
|
||||
num_sges++;
|
||||
|
||||
@ -410,8 +418,7 @@ static int smcr_tx_rdma_writes(struct smc_connection *conn, size_t len,
|
||||
src_len = dst_len - src_len; /* remainder */
|
||||
src_len_sum += src_len;
|
||||
}
|
||||
rc = smc_tx_rdma_write(conn, dst_off, num_sges,
|
||||
&wr_rdma_buf->wr_tx_rdma[dstchunk]);
|
||||
rc = smc_tx_rdma_write(conn, dst_off, num_sges, wr);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (dst_len_sum == len)
|
||||
|
Loading…
Reference in New Issue
Block a user