diff options
author | Henry Orosco <henry.orosco@intel.com> | 2016-11-09 22:24:48 -0500 |
---|---|---|
committer | Doug Ledford <dledford@redhat.com> | 2016-12-05 16:09:34 -0500 |
commit | e69c5093617afdbd2ab02c289d0adaac044dff66 (patch) | |
tree | 5974b6043be5c0c72d905596bae14a97ee81f72e | |
parent | 68583ca2a183c6368f4c333fa989685fba7cf325 (diff) |
i40iw: Use vector when creating CQs
Assign each CEQ vector to a different CPU when possible, then
when creating a CQ, use the vector for the CEQ id. This
allows completion work to be distributed over multiple cores.
Signed-off-by: Mustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: Henry Orosco <henry.orosco@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_main.c | 8 | ||||
-rw-r--r-- | drivers/infiniband/hw/i40iw/i40iw_verbs.c | 5 |
2 files changed, 10 insertions, 3 deletions
diff --git a/drivers/infiniband/hw/i40iw/i40iw_main.c b/drivers/infiniband/hw/i40iw/i40iw_main.c index e6abdafd1b6f..ed24831344b1 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_main.c +++ b/drivers/infiniband/hw/i40iw/i40iw_main.c | |||
@@ -270,6 +270,7 @@ static void i40iw_disable_irq(struct i40iw_sc_dev *dev, | |||
270 | i40iw_wr32(dev->hw, I40E_PFINT_DYN_CTLN(msix_vec->idx - 1), 0); | 270 | i40iw_wr32(dev->hw, I40E_PFINT_DYN_CTLN(msix_vec->idx - 1), 0); |
271 | else | 271 | else |
272 | i40iw_wr32(dev->hw, I40E_VFINT_DYN_CTLN1(msix_vec->idx - 1), 0); | 272 | i40iw_wr32(dev->hw, I40E_VFINT_DYN_CTLN1(msix_vec->idx - 1), 0); |
273 | irq_set_affinity_hint(msix_vec->irq, NULL); | ||
273 | free_irq(msix_vec->irq, dev_id); | 274 | free_irq(msix_vec->irq, dev_id); |
274 | } | 275 | } |
275 | 276 | ||
@@ -688,6 +689,7 @@ static enum i40iw_status_code i40iw_configure_ceq_vector(struct i40iw_device *iw | |||
688 | struct i40iw_msix_vector *msix_vec) | 689 | struct i40iw_msix_vector *msix_vec) |
689 | { | 690 | { |
690 | enum i40iw_status_code status; | 691 | enum i40iw_status_code status; |
692 | cpumask_t mask; | ||
691 | 693 | ||
692 | if (iwdev->msix_shared && !ceq_id) { | 694 | if (iwdev->msix_shared && !ceq_id) { |
693 | tasklet_init(&iwdev->dpc_tasklet, i40iw_dpc, (unsigned long)iwdev); | 695 | tasklet_init(&iwdev->dpc_tasklet, i40iw_dpc, (unsigned long)iwdev); |
@@ -697,12 +699,15 @@ static enum i40iw_status_code i40iw_configure_ceq_vector(struct i40iw_device *iw | |||
697 | status = request_irq(msix_vec->irq, i40iw_ceq_handler, 0, "CEQ", iwceq); | 699 | status = request_irq(msix_vec->irq, i40iw_ceq_handler, 0, "CEQ", iwceq); |
698 | } | 700 | } |
699 | 701 | ||
702 | cpumask_clear(&mask); | ||
703 | cpumask_set_cpu(msix_vec->cpu_affinity, &mask); | ||
704 | irq_set_affinity_hint(msix_vec->irq, &mask); | ||
705 | |||
700 | if (status) { | 706 | if (status) { |
701 | i40iw_pr_err("ceq irq config fail\n"); | 707 | i40iw_pr_err("ceq irq config fail\n"); |
702 | return I40IW_ERR_CONFIG; | 708 | return I40IW_ERR_CONFIG; |
703 | } | 709 | } |
704 | msix_vec->ceq_id = ceq_id; | 710 | msix_vec->ceq_id = ceq_id; |
705 | msix_vec->cpu_affinity = 0; | ||
706 | 711 | ||
707 | return 0; | 712 | return 0; |
708 | } | 713 | } |
@@ -1396,6 +1401,7 @@ static enum i40iw_status_code i40iw_save_msix_info(struct i40iw_device *iwdev, | |||
1396 | for (i = 0, ceq_idx = 0; i < iwdev->msix_count; i++, iw_qvinfo++) { | 1401 | for (i = 0, ceq_idx = 0; i < iwdev->msix_count; i++, iw_qvinfo++) { |
1397 | iwdev->iw_msixtbl[i].idx = ldev->msix_entries[i].entry; | 1402 | iwdev->iw_msixtbl[i].idx = ldev->msix_entries[i].entry; |
1398 | iwdev->iw_msixtbl[i].irq = ldev->msix_entries[i].vector; | 1403 | iwdev->iw_msixtbl[i].irq = ldev->msix_entries[i].vector; |
1404 | iwdev->iw_msixtbl[i].cpu_affinity = ceq_idx; | ||
1399 | if (i == 0) { | 1405 | if (i == 0) { |
1400 | iw_qvinfo->aeq_idx = 0; | 1406 | iw_qvinfo->aeq_idx = 0; |
1401 | if (iwdev->msix_shared) | 1407 | if (iwdev->msix_shared) |
diff --git a/drivers/infiniband/hw/i40iw/i40iw_verbs.c b/drivers/infiniband/hw/i40iw/i40iw_verbs.c index 56e1c2c6ec34..aacaa0fcfb77 100644 --- a/drivers/infiniband/hw/i40iw/i40iw_verbs.c +++ b/drivers/infiniband/hw/i40iw/i40iw_verbs.c | |||
@@ -1135,7 +1135,8 @@ static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev, | |||
1135 | ukinfo->cq_id = cq_num; | 1135 | ukinfo->cq_id = cq_num; |
1136 | iwcq->ibcq.cqe = info.cq_uk_init_info.cq_size; | 1136 | iwcq->ibcq.cqe = info.cq_uk_init_info.cq_size; |
1137 | info.ceqe_mask = 0; | 1137 | info.ceqe_mask = 0; |
1138 | info.ceq_id = 0; | 1138 | if (attr->comp_vector < iwdev->ceqs_count) |
1139 | info.ceq_id = attr->comp_vector; | ||
1139 | info.ceq_id_valid = true; | 1140 | info.ceq_id_valid = true; |
1140 | info.ceqe_mask = 1; | 1141 | info.ceqe_mask = 1; |
1141 | info.type = I40IW_CQ_TYPE_IWARP; | 1142 | info.type = I40IW_CQ_TYPE_IWARP; |
@@ -2619,7 +2620,7 @@ static struct i40iw_ib_device *i40iw_init_rdma_device(struct i40iw_device *iwdev | |||
2619 | (1ull << IB_USER_VERBS_CMD_POST_RECV) | | 2620 | (1ull << IB_USER_VERBS_CMD_POST_RECV) | |
2620 | (1ull << IB_USER_VERBS_CMD_POST_SEND); | 2621 | (1ull << IB_USER_VERBS_CMD_POST_SEND); |
2621 | iwibdev->ibdev.phys_port_cnt = 1; | 2622 | iwibdev->ibdev.phys_port_cnt = 1; |
2622 | iwibdev->ibdev.num_comp_vectors = 1; | 2623 | iwibdev->ibdev.num_comp_vectors = iwdev->ceqs_count; |
2623 | iwibdev->ibdev.dma_device = &pcidev->dev; | 2624 | iwibdev->ibdev.dma_device = &pcidev->dev; |
2624 | iwibdev->ibdev.dev.parent = &pcidev->dev; | 2625 | iwibdev->ibdev.dev.parent = &pcidev->dev; |
2625 | iwibdev->ibdev.query_port = i40iw_query_port; | 2626 | iwibdev->ibdev.query_port = i40iw_query_port; |