aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenry Orosco <henry.orosco@intel.com>2016-11-09 22:24:48 -0500
committerDoug Ledford <dledford@redhat.com>2016-12-05 16:09:34 -0500
commite69c5093617afdbd2ab02c289d0adaac044dff66 (patch)
tree5974b6043be5c0c72d905596bae14a97ee81f72e
parent68583ca2a183c6368f4c333fa989685fba7cf325 (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.c8
-rw-r--r--drivers/infiniband/hw/i40iw/i40iw_verbs.c5
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;