Re: [PATCH v2 1/2] Introduce maximum WQE size to check limits

From: Rao Shoaib
Date: Tue Nov 19 2019 - 18:57:50 EST



On 11/19/19 3:13 PM, Jason Gunthorpe wrote:
On Tue, Nov 19, 2019 at 02:38:23PM -0800, Rao Shoaib wrote:
On 11/19/19 12:31 PM, Jason Gunthorpe wrote:
On Mon, Nov 18, 2019 at 11:54:38AM -0800, rao Shoaib wrote:
From: Rao Shoaib <rao.shoaib@xxxxxxxxxx>

Introduce maximum WQE size to impose limits on max SGE's and inline data

Signed-off-by: Rao Shoaib <rao.shoaib@xxxxxxxxxx>
drivers/infiniband/sw/rxe/rxe_param.h | 3 ++-
drivers/infiniband/sw/rxe/rxe_qp.c | 7 +++++--
2 files changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_param.h b/drivers/infiniband/sw/rxe/rxe_param.h
index 1b596fb..31fb5c7 100644
+++ b/drivers/infiniband/sw/rxe/rxe_param.h
@@ -68,7 +68,6 @@ enum rxe_device_param {
RXE_HW_VER = 0,
RXE_MAX_QP = 0x10000,
RXE_MAX_QP_WR = 0x4000,
- RXE_MAX_INLINE_DATA = 400,
RXE_DEVICE_CAP_FLAGS = IB_DEVICE_BAD_PKEY_CNTR
| IB_DEVICE_BAD_QKEY_CNTR
| IB_DEVICE_AUTO_PATH_MIG
@@ -79,7 +78,9 @@ enum rxe_device_param {
| IB_DEVICE_RC_RNR_NAK_GEN
| IB_DEVICE_SRQ_RESIZE
| IB_DEVICE_MEM_MGT_EXTENSIONS,
+ RXE_MAX_WQE_SIZE = 0x2d0, /* For RXE_MAX_SGE */
This shouldn't just be a random constant, I think you are trying to
say:

RXE_MAX_WQE_SIZE = sizeof(struct rxe_send_wqe) + sizeof(struct ib_sge)*RXE_MAX_SGE
I thought you wanted this value to be independent of RXE_MAX_SGE, else why
are defining it.
Then define

RXE_MAX_SGE = (RXE_MAX_WQE_SIZE - sizeof(rxe_send_wqe))/sizeof(rxe_sge)

And drive everything off RXE_MAX_WQE_SIZE, which sounds good

Just say that

RXE_MAX_SGE = 32,
+ RXE_MAX_INLINE_DATA = RXE_MAX_WQE_SIZE,
This is mixed up now, it should be

RXE_MAX_INLINE_DATA = RXE_MAX_WQE_SIZE - sizeof(rxe_send_wqe)
I agree to what you are suggesting, it will make the current patch better.
However, In my previous patch I had

RXE_MAX_INLINE_DATA = RXE_MAX_SGE * sizeof(struct ib_sge)

IMHO that conveys the intent much better. I do not see the reason for
defining RXE_MAX_WQE_SIZE, ib_device_attr does not even have an entry for it
and hence the value is not used anywhere by rxe or by any other relevant
driver.
Because WQE_SIZE is what you are actually concerned with here, using
MAX_SGE as a proxy for the max WQE is confusing

Jason

My intent is that we calculate and use the maximum buffer size using the maximum of, number of SGE's and inline data requested, not controlling the size of WQE buffer. If I was trying to limit WQE size I would agree with you. Defining MAX_WQE_SIZE based on MAX_SGE and recalculating MAX_SGE does not make sense to me. MAX_SGE and inline_data are independent variables and define the size of wqe size not the other wise around. I did make inline_dependent on MAX_SGE.

Your and my preferences can be different but you are the maintainer and what you say goes. We have had a good discussion and I am going with your previous suggestion.

Kind Regards,

Shoaib