On 2020/2/19 21:19, Jason Gunthorpe wrote: > On Wed, Feb 19, 2020 at 04:14:36PM +0800, Weihang Li wrote: >> >> >> On 2020/2/19 8:52, Jason Gunthorpe wrote: >>> On Mon, Feb 10, 2020 at 05:08:40PM +0800, Weihang Li wrote: >>>> From: Xi Wang <wangxi11@xxxxxxxxxx> >>>> >>>> Encapsulate the kernel qp doorbell allocation related code into 2 >>>> functions: alloc_qp_db() and free_qp_db(). >>>> >>>> Signed-off-by: Xi Wang <wangxi11@xxxxxxxxxx> >>>> Signed-off-by: Weihang Li <liweihang@xxxxxxxxxx> >>>> drivers/infiniband/hw/hns/hns_roce_qp.c | 214 +++++++++++++++++--------------- >>>> 1 file changed, 113 insertions(+), 101 deletions(-) >>>> >>>> diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c >>>> index ad34187..46785f1 100644 >>>> +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c >>>> @@ -844,6 +844,96 @@ static void free_qp_buf(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp) >>>> free_rq_inline_buf(hr_qp); >>>> } >>>> >>>> +#define user_qp_has_sdb(hr_dev, init_attr, udata, resp, ucmd) \ >>>> + ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_SQ_RECORD_DB) && \ >>>> + udata->outlen >= sizeof(*resp) && \ >>>> + hns_roce_qp_has_sq(init_attr) && udata->inlen >= sizeof(*ucmd)) >>>> + >>>> +#define user_qp_has_rdb(hr_dev, init_attr, udata, resp) \ >>>> + ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && \ >>>> + udata->outlen >= sizeof(*resp) && \ >>>> + hns_roce_qp_has_rq(init_attr)) >>>> + >>>> +#define kernel_qp_has_rdb(hr_dev, init_attr) \ >>>> + ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && \ >>>> + hns_roce_qp_has_rq(init_attr)) >>> >>> static inline functions not defines please >>> >> >> OK, I will change them into inline functions. >> >>> Also, these tests against inline and outlen look very strange. What >>> are they doing? >>> >>> Jason >>> >> >> These judgement about inlen and outlen is for compatibility reasons, >> previous discussions can be found at: >> >> https://patchwork.kernel.org/patch/10172233/ > > Something is wrong, it should be testing the legnth using a > field_offset_off kind of scheme, not sizeof(*resp) > > Jason > Hi Jason, Do you means udata->outlen >= sizeof(*resp) should be changed into: udata->out_len >= offsetof(typeof(*resp), cap_flags) If yes, I will fix other similar codes with this issue in hns drivers. Thanks Weihang