On Tue, Jan 08, 2019 at 03:24:54PM +0800, Lijun Ou wrote: > When flush cqe, it needs to get the pointer of rq and sq from > db address space of user and update it into qp context by > modified qp. if rq is not exist, it will not get the value > from db addresss space of user. > > Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx> > --- > V1->V2: > 1. regenerate this patch in order to resolve the conflict > --- > drivers/infiniband/hw/hns/hns_roce_qp.c | 16 ++++++++-------- > 1 file changed, 8 insertions(+), 8 deletions(-) > > diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c > index 54031c5..0d06bd8 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_qp.c > +++ b/drivers/infiniband/hw/hns/hns_roce_qp.c > @@ -675,6 +675,10 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev, > dev_err(dev, "rq record doorbell map failed!\n"); > goto err_sq_dbmap; > } > + > + /* indicate kernel supports rq record db */ > + resp.cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; > + hr_qp->rdb_en = 1; > } > } else { > if (init_attr->create_flags & > @@ -783,16 +787,10 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev, > else > hr_qp->doorbell_qpn = cpu_to_le64(hr_qp->qpn); > > - if (udata && (udata->outlen >= sizeof(resp)) && > - (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)) { > - > - /* indicate kernel supports rq record db */ > - resp.cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; > + if (udata && (udata->outlen >= sizeof(resp))) { I wonder if this check is correct, don't you suppose to do? "ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp)));" and remove "(udata->outlen >= sizeof(resp))" Thanks > ret = ib_copy_to_udata(udata, &resp, sizeof(resp)); > if (ret) > goto err_qp; > - > - hr_qp->rdb_en = 1; > } > hr_qp->event = hns_roce_ib_qp_event; > > @@ -969,7 +967,9 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, > (attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) { > if (hr_qp->sdb_en == 1) { > hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr); > - hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); > + > + if (hr_qp->rdb_en == 1) > + hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); > } else { > dev_warn(dev, "flush cqe is not supported in userspace!\n"); > goto out; > -- > 1.9.1 >
Attachment:
signature.asc
Description: PGP signature