未验证 提交 aa829760 编写于 作者: O openeuler-ci-bot 提交者: Gitee

!1182 Fix CQ and QP cache affinity

Merge Pull Request from: @stinft 
 
https://gitee.com/openeuler/kernel/issues/I7DCX0 
 
Link:https://gitee.com/openeuler/kernel/pulls/1182 

Reviewed-by: Chengchang Tang <tangchengchang@huawei.com> 
Signed-off-by: Jialin Zhang <zhangjialin11@huawei.com> 
...@@ -101,6 +101,7 @@ ...@@ -101,6 +101,7 @@
#define HNS_ROCE_CQ_BANK_NUM 4 #define HNS_ROCE_CQ_BANK_NUM 4
#define CQ_BANKID_SHIFT 2 #define CQ_BANKID_SHIFT 2
#define CQ_BANKID_MASK GENMASK(1, 0)
enum { enum {
SERV_TYPE_RC, SERV_TYPE_RC,
......
...@@ -171,14 +171,29 @@ static void hns_roce_ib_qp_event(struct hns_roce_qp *hr_qp, ...@@ -171,14 +171,29 @@ static void hns_roce_ib_qp_event(struct hns_roce_qp *hr_qp,
} }
} }
static u8 get_least_load_bankid_for_qp(struct hns_roce_bank *bank) static u8 get_affinity_cq_bank(u8 qp_bank)
{ {
u32 least_load = bank[0].inuse; return (qp_bank >> 1) & CQ_BANKID_MASK;
}
static u8 get_least_load_bankid_for_qp(struct ib_qp_init_attr *init_attr,
struct hns_roce_bank *bank)
{
#define INVALID_LOAD_QPNUM 0xFFFFFFFF
struct ib_cq *scq = init_attr->send_cq;
u32 least_load = INVALID_LOAD_QPNUM;
unsigned long cqn = 0;
u8 bankid = 0; u8 bankid = 0;
u32 bankcnt; u32 bankcnt;
u8 i; u8 i;
for (i = 1; i < HNS_ROCE_QP_BANK_NUM; i++) { if (scq)
cqn = to_hr_cq(scq)->cqn;
for (i = 0; i < HNS_ROCE_QP_BANK_NUM; i++) {
if (scq && (get_affinity_cq_bank(i) != (cqn & CQ_BANKID_MASK)))
continue;
bankcnt = bank[i].inuse; bankcnt = bank[i].inuse;
if (bankcnt < least_load) { if (bankcnt < least_load) {
least_load = bankcnt; least_load = bankcnt;
...@@ -210,7 +225,9 @@ static int alloc_qpn_with_bankid(struct hns_roce_bank *bank, u8 bankid, ...@@ -210,7 +225,9 @@ static int alloc_qpn_with_bankid(struct hns_roce_bank *bank, u8 bankid,
return 0; return 0;
} }
static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp)
static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp,
struct ib_qp_init_attr *init_attr)
{ {
struct hns_roce_qp_table *qp_table = &hr_dev->qp_table; struct hns_roce_qp_table *qp_table = &hr_dev->qp_table;
unsigned long num = 0; unsigned long num = 0;
...@@ -222,7 +239,7 @@ static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp) ...@@ -222,7 +239,7 @@ static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp)
hr_qp->doorbell_qpn = 1; hr_qp->doorbell_qpn = 1;
} else { } else {
mutex_lock(&qp_table->bank_mutex); mutex_lock(&qp_table->bank_mutex);
bankid = get_least_load_bankid_for_qp(qp_table->bank); bankid = get_least_load_bankid_for_qp(init_attr, qp_table->bank);
ret = alloc_qpn_with_bankid(&qp_table->bank[bankid], bankid, ret = alloc_qpn_with_bankid(&qp_table->bank[bankid], bankid,
&num); &num);
...@@ -1218,7 +1235,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev, ...@@ -1218,7 +1235,7 @@ static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev,
} }
} }
ret = alloc_qpn(hr_dev, hr_qp); ret = alloc_qpn(hr_dev, hr_qp, init_attr);
if (ret) { if (ret) {
ibdev_err(ibdev, "failed to alloc QPN, ret = %d.\n", ret); ibdev_err(ibdev, "failed to alloc QPN, ret = %d.\n", ret);
goto err_qpn; goto err_qpn;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册