Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Lang Cheng and committed by
Jason Gunthorpe
90ae0b57 30661322

+15 -16
+3 -4
drivers/infiniband/hw/hns/hns_roce_device.h
··· 131 131 }; 132 132 133 133 enum { 134 - HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0, 135 - HNS_ROCE_SUPPORT_SQ_RECORD_DB = 1 << 1, 134 + HNS_ROCE_QP_CAP_RQ_RECORD_DB = BIT(0), 135 + HNS_ROCE_QP_CAP_SQ_RECORD_DB = BIT(1), 136 136 }; 137 137 138 138 enum { ··· 623 623 struct hns_roce_wq rq; 624 624 struct hns_roce_db rdb; 625 625 struct hns_roce_db sdb; 626 - u8 rdb_en; 627 - u8 sdb_en; 626 + unsigned long en_flags; 628 627 u32 doorbell_qpn; 629 628 u32 sq_signal_bits; 630 629 struct hns_roce_wq sq;
+1 -1
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
··· 3619 3619 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M, 3620 3620 V2_QPC_BYTE_24_VLAN_ID_S, 0xfff); 3621 3621 3622 - if (hr_qp->rdb_en) 3622 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB) 3623 3623 roce_set_bit(context->byte_68_rq_db, 3624 3624 V2_QPC_BYTE_68_RQ_RECORD_EN_S, 1); 3625 3625
+11 -11
drivers/infiniband/hw/hns/hns_roce_qp.c
··· 750 750 "Failed to map user SQ doorbell\n"); 751 751 goto err_out; 752 752 } 753 - hr_qp->sdb_en = 1; 754 - resp->cap_flags |= HNS_ROCE_SUPPORT_SQ_RECORD_DB; 753 + hr_qp->en_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB; 754 + resp->cap_flags |= HNS_ROCE_QP_CAP_SQ_RECORD_DB; 755 755 } 756 756 757 757 if (user_qp_has_rdb(hr_dev, init_attr, udata, resp)) { ··· 762 762 "Failed to map user RQ doorbell\n"); 763 763 goto err_sdb; 764 764 } 765 - hr_qp->rdb_en = 1; 766 - resp->cap_flags |= HNS_ROCE_SUPPORT_RQ_RECORD_DB; 765 + hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB; 766 + resp->cap_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB; 767 767 } 768 768 } else { 769 769 /* QP doorbell register address */ ··· 780 780 goto err_out; 781 781 } 782 782 *hr_qp->rdb.db_record = 0; 783 - hr_qp->rdb_en = 1; 783 + hr_qp->en_flags |= HNS_ROCE_QP_CAP_RQ_RECORD_DB; 784 784 } 785 785 } 786 786 787 787 return 0; 788 788 err_sdb: 789 - if (udata && hr_qp->sdb_en) 789 + if (udata && hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB) 790 790 hns_roce_db_unmap_user(uctx, &hr_qp->sdb); 791 791 err_out: 792 792 return ret; ··· 799 799 udata, struct hns_roce_ucontext, ibucontext); 800 800 801 801 if (udata) { 802 - if (hr_qp->rdb_en) 802 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB) 803 803 hns_roce_db_unmap_user(uctx, &hr_qp->rdb); 804 - if (hr_qp->sdb_en) 804 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB) 805 805 hns_roce_db_unmap_user(uctx, &hr_qp->sdb); 806 806 } else { 807 - if (hr_qp->rdb_en) 807 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB) 808 808 hns_roce_free_db(hr_dev, &hr_qp->rdb); 809 809 } 810 810 } ··· 1178 1178 1179 1179 if (ibqp->uobject && 1180 1180 (attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) { 1181 - if (hr_qp->sdb_en == 1) { 1181 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_SQ_RECORD_DB) { 1182 1182 hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr); 1183 1183 1184 - if (hr_qp->rdb_en == 1) 1184 + if (hr_qp->en_flags & HNS_ROCE_QP_CAP_RQ_RECORD_DB) 1185 1185 hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); 1186 1186 } else { 1187 1187 ibdev_warn(&hr_dev->ib_dev,