RDMA/hns: Combine enable flags of qp

It's easier to understand and maintain enable flags of qp using a single
field in type of unsigned long than defining a field for every flags in
the structure hns_roce_qp, and we can add new flags for features more
conveniently in the future.

Link: https://lore.kernel.org/r/1588674607-25337-4-git-send-email-liweihang@huawei.com
Signed-off-by: Lang Cheng <chenglang@huawei.com>
Signed-off-by: Weihang Li <liweihang@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
This commit is contained in:
Lang Cheng 2020-05-05 18:30:07 +08:00 committed by Jason Gunthorpe
parent 30661322b8
commit 90ae0b57e4
3 changed files with 15 additions and 16 deletions

View File

@ -131,8 +131,8 @@ enum {
}; };
enum { enum {
HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0, HNS_ROCE_QP_CAP_RQ_RECORD_DB = BIT(0),
HNS_ROCE_SUPPORT_SQ_RECORD_DB = 1 << 1, HNS_ROCE_QP_CAP_SQ_RECORD_DB = BIT(1),
}; };
enum { enum {
@ -623,8 +623,7 @@ struct hns_roce_qp {
struct hns_roce_wq rq; struct hns_roce_wq rq;
struct hns_roce_db rdb; struct hns_roce_db rdb;
struct hns_roce_db sdb; struct hns_roce_db sdb;
u8 rdb_en; unsigned long en_flags;
u8 sdb_en;
u32 doorbell_qpn; u32 doorbell_qpn;
u32 sq_signal_bits; u32 sq_signal_bits;
struct hns_roce_wq sq; struct hns_roce_wq sq;

View File

@ -3619,7 +3619,7 @@ static void modify_qp_reset_to_init(struct ib_qp *ibqp,
roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M, roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M,
V2_QPC_BYTE_24_VLAN_ID_S, 0xfff); V2_QPC_BYTE_24_VLAN_ID_S, 0xfff);
if (hr_qp->rdb_en) if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
roce_set_bit(context->byte_68_rq_db, roce_set_bit(context->byte_68_rq_db,
V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1); V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1);

View File

@ -750,8 +750,8 @@ static int alloc_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
"Failed to map user SQ doorbell\n"); "Failed to map user SQ doorbell\n");
goto err_out; goto err_out;
} }
hr_qp->sdb_en = 1; hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
resp->cap_flags |= HNS_ROCE_SUPPORT_SQ_RECORD_DB; resp->cap_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB;
} }
if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) { if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) {
@ -762,8 +762,8 @@ static int alloc_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
"Failed to map user RQ doorbell\n"); "Failed to map user RQ doorbell\n");
goto err_sdb; goto err_sdb;
} }
hr_qp->rdb_en = 1; hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
resp->cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; resp->cap_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
} }
} else { } else {
/* QP doorbell register address */ /* QP doorbell register address */
@ -780,13 +780,13 @@ static int alloc_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
goto err_out; goto err_out;
} }
*hr_qp->rdb.db_record = 0; *hr_qp->rdb.db_record = 0;
hr_qp->rdb_en = 1; hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB;
} }
} }
return 0; return 0;
err_sdb: err_sdb:
if (udata && hr_qp->sdb_en) if (udata && hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
hns_roce_db_unmap_user(uctx, &hr_qp->sdb); hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
err_out: err_out:
return ret; return ret;
@ -799,12 +799,12 @@ static void free_qp_db(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
udata, struct hns_roce_ucontext, ibucontext); udata, struct hns_roce_ucontext, ibucontext);
if (udata) { if (udata) {
if (hr_qp->rdb_en) if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
hns_roce_db_unmap_user(uctx, &hr_qp->rdb); hns_roce_db_unmap_user(uctx, &hr_qp->rdb);
if (hr_qp->sdb_en) if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB)
hns_roce_db_unmap_user(uctx, &hr_qp->sdb); hns_roce_db_unmap_user(uctx, &hr_qp->sdb);
} else { } else {
if (hr_qp->rdb_en) if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
hns_roce_free_db(hr_dev, &hr_qp->rdb); hns_roce_free_db(hr_dev, &hr_qp->rdb);
} }
} }
@ -1178,10 +1178,10 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
if (ibqp->uobject && if (ibqp->uobject &&
(attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) { (attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) {
if (hr_qp->sdb_en == 1) { if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB) {
hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr); hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr);
if (hr_qp->rdb_en == 1) if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB)
hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr);
} else { } else {
ibdev_warn(&hr_dev->ib_dev, ibdev_warn(&hr_dev->ib_dev,