]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
RDMA/efa: Expose maximum TX doorbell batch
authorGal Pressman <galpress@amazon.com>
Wed, 22 Jul 2020 14:03:09 +0000 (17:03 +0300)
committerJason Gunthorpe <jgg@nvidia.com>
Wed, 29 Jul 2020 12:23:39 +0000 (09:23 -0300)
The device reports the maximum number of bytes to be written before
ringing the doorbell (zero means unlimited).

This patch queries the max batch size and reports it back to the userspace
library.

Link: https://lore.kernel.org/r/20200722140312.3651-2-galpress@amazon.com
Reviewed-by: Daniel Kranzdorf <dkkranzd@amazon.com>
Reviewed-by: Firas JahJah <firasj@amazon.com>
Signed-off-by: Gal Pressman <galpress@amazon.com>
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
drivers/infiniband/hw/efa/efa_com_cmd.c
drivers/infiniband/hw/efa/efa_com_cmd.h
drivers/infiniband/hw/efa/efa_verbs.c
include/uapi/rdma/efa-abi.h

index bef2bd2910542934a6d1caef678da488b6c2808f..03e7388af06edc7e046f1df87c37a02bfa3e513e 100644 (file)
@@ -632,6 +632,17 @@ struct efa_admin_feature_queue_attr_desc {
 
        /* Maximum number of SGEs for a single RDMA read WQE */
        u16 max_wr_rdma_sges;
+
+       /*
+        * Maximum number of bytes that can be written to SQ between two
+        * consecutive doorbells (in units of 64B). Driver must ensure that only
+        * complete WQEs are written to queue before issuing a doorbell.
+        * Examples: max_tx_batch=16 and WQE size = 64B, means up to 16 WQEs can
+        * be written to SQ between two consecutive doorbells. max_tx_batch=11
+        * and WQE size = 128B, means up to 5 WQEs can be written to SQ between
+        * two consecutive doorbells. Zero means unlimited.
+        */
+       u16 max_tx_batch;
 };
 
 struct efa_admin_feature_aenq_desc {
index fabd8df2e78f83b0f3d29f7a21bdb33b5440a07a..53cfde5c43d898ce029ad2ed1ebfd049a2f52885 100644 (file)
@@ -480,6 +480,7 @@ int efa_com_get_device_attr(struct efa_com_dev *edev,
        result->max_llq_size = resp.u.queue_attr.max_llq_size;
        result->sub_cqs_per_cq = resp.u.queue_attr.sub_cqs_per_cq;
        result->max_wr_rdma_sge = resp.u.queue_attr.max_wr_rdma_sges;
+       result->max_tx_batch = resp.u.queue_attr.max_tx_batch;
 
        err = efa_com_get_feature(edev, &resp, EFA_ADMIN_NETWORK_ATTR);
        if (err) {
index 41ce4a476ee62f1ce1cbd0bd83fd6f47e81f5548..8df2a26d57d464bf011efd1d6e7bd8028d597678 100644 (file)
@@ -127,6 +127,7 @@ struct efa_com_get_device_attr_result {
        u16 max_sq_sge;
        u16 max_rq_sge;
        u16 max_wr_rdma_sge;
+       u16 max_tx_batch;
        u8 db_bar;
 };
 
index 08313f7c73bc06f76a10c0ec7f419766f76bcd81..f49d14cebe4a478397438e9006a6a34962eef9db 100644 (file)
@@ -1525,6 +1525,7 @@ int efa_alloc_ucontext(struct ib_ucontext *ibucontext, struct ib_udata *udata)
        resp.sub_cqs_per_cq = dev->dev_attr.sub_cqs_per_cq;
        resp.inline_buf_size = dev->dev_attr.inline_buf_size;
        resp.max_llq_size = dev->dev_attr.max_llq_size;
+       resp.max_tx_batch = dev->dev_attr.max_tx_batch;
 
        if (udata && udata->outlen) {
                err = ib_copy_to_udata(udata, &resp,
index 53b6e2036a9bea74c5102f2e9403f95d75fcd9dd..10781763da37e0031c165eeabf26c0b15645ad05 100644 (file)
@@ -1,6 +1,6 @@
 /* SPDX-License-Identifier: ((GPL-2.0 WITH Linux-syscall-note) OR BSD-2-Clause) */
 /*
- * Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All rights reserved.
+ * Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All rights reserved.
  */
 
 #ifndef EFA_ABI_USER_H
@@ -31,6 +31,8 @@ struct efa_ibv_alloc_ucontext_resp {
        __u16 sub_cqs_per_cq;
        __u16 inline_buf_size;
        __u32 max_llq_size; /* bytes */
+       __u16 max_tx_batch; /* units of 64 bytes */
+       __u8 reserved_90[6];
 };
 
 struct efa_ibv_alloc_pd_resp {