Skip to content

Commit 0e9974f

Browse files
committed
Merge branch 'cxgb4-next'
Hariprasad Shenai says: ==================== cxgb4: RX Queue related cleanup and fixes This patch series adds a common function to allocate RX queues and queue allocation changes to RDMA CIQ The patches series is created against 'net-next' tree. And includes patches on cxgb4 driver. We have included all the maintainers of respective drivers. Kindly review the change and let us know in case of any review comments. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 842a9ae + f36e58e commit 0e9974f

File tree

3 files changed

+80
-54
lines changed

3 files changed

+80
-54
lines changed

drivers/net/ethernet/chelsio/cxgb4/cxgb4.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ enum {
369369
MAX_OFLD_QSETS = 16, /* # of offload Tx/Rx queue sets */
370370
MAX_CTRL_QUEUES = NCHAN, /* # of control Tx queues */
371371
MAX_RDMA_QUEUES = NCHAN, /* # of streaming RDMA Rx queues */
372-
MAX_RDMA_CIQS = NCHAN, /* # of RDMA concentrator IQs */
372+
MAX_RDMA_CIQS = 32, /* # of RDMA concentrator IQs */
373373
MAX_ISCSI_QUEUES = NCHAN, /* # of streaming iSCSI Rx queues */
374374
};
375375

@@ -599,8 +599,8 @@ struct sge {
599599
u16 rdmaqs; /* # of available RDMA Rx queues */
600600
u16 rdmaciqs; /* # of available RDMA concentrator IQs */
601601
u16 ofld_rxq[MAX_OFLD_QSETS];
602-
u16 rdma_rxq[NCHAN];
603-
u16 rdma_ciq[NCHAN];
602+
u16 rdma_rxq[MAX_RDMA_QUEUES];
603+
u16 rdma_ciq[MAX_RDMA_CIQS];
604604
u16 timer_val[SGE_NTIMERS];
605605
u8 counter_val[SGE_NCOUNTERS];
606606
u32 fl_pg_order; /* large page allocation size */

drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1769,6 +1769,8 @@ do { \
17691769
int n = min(4, adap->sge.rdmaqs - 4 * rdma_idx);
17701770

17711771
S("QType:", "RDMA-CPL");
1772+
S("Interface:",
1773+
rx[i].rspq.netdev ? rx[i].rspq.netdev->name : "N/A");
17721774
R("RspQ ID:", rspq.abs_id);
17731775
R("RspQ size:", rspq.size);
17741776
R("RspQE size:", rspq.iqe_len);
@@ -1788,6 +1790,8 @@ do { \
17881790
int n = min(4, adap->sge.rdmaciqs - 4 * ciq_idx);
17891791

17901792
S("QType:", "RDMA-CIQ");
1793+
S("Interface:",
1794+
rx[i].rspq.netdev ? rx[i].rspq.netdev->name : "N/A");
17911795
R("RspQ ID:", rspq.abs_id);
17921796
R("RspQ size:", rspq.size);
17931797
R("RspQE size:", rspq.iqe_len);

drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c

Lines changed: 73 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -957,6 +957,28 @@ static void enable_rx(struct adapter *adap)
957957
}
958958
}
959959

960+
static int alloc_ofld_rxqs(struct adapter *adap, struct sge_ofld_rxq *q,
961+
unsigned int nq, unsigned int per_chan, int msi_idx,
962+
u16 *ids)
963+
{
964+
int i, err;
965+
966+
for (i = 0; i < nq; i++, q++) {
967+
if (msi_idx > 0)
968+
msi_idx++;
969+
err = t4_sge_alloc_rxq(adap, &q->rspq, false,
970+
adap->port[i / per_chan],
971+
msi_idx, q->fl.size ? &q->fl : NULL,
972+
uldrx_handler);
973+
if (err)
974+
return err;
975+
memset(&q->stats, 0, sizeof(q->stats));
976+
if (ids)
977+
ids[i] = q->rspq.abs_id;
978+
}
979+
return 0;
980+
}
981+
960982
/**
961983
* setup_sge_queues - configure SGE Tx/Rx/response queues
962984
* @adap: the adapter
@@ -1018,51 +1040,27 @@ freeout: t4_free_sge_resources(adap);
10181040

10191041
j = s->ofldqsets / adap->params.nports; /* ofld queues per channel */
10201042
for_each_ofldrxq(s, i) {
1021-
struct sge_ofld_rxq *q = &s->ofldrxq[i];
1022-
struct net_device *dev = adap->port[i / j];
1023-
1024-
if (msi_idx > 0)
1025-
msi_idx++;
1026-
err = t4_sge_alloc_rxq(adap, &q->rspq, false, dev, msi_idx,
1027-
q->fl.size ? &q->fl : NULL,
1028-
uldrx_handler);
1029-
if (err)
1030-
goto freeout;
1031-
memset(&q->stats, 0, sizeof(q->stats));
1032-
s->ofld_rxq[i] = q->rspq.abs_id;
1033-
err = t4_sge_alloc_ofld_txq(adap, &s->ofldtxq[i], dev,
1043+
err = t4_sge_alloc_ofld_txq(adap, &s->ofldtxq[i],
1044+
adap->port[i / j],
10341045
s->fw_evtq.cntxt_id);
10351046
if (err)
10361047
goto freeout;
10371048
}
10381049

1039-
for_each_rdmarxq(s, i) {
1040-
struct sge_ofld_rxq *q = &s->rdmarxq[i];
1050+
#define ALLOC_OFLD_RXQS(firstq, nq, per_chan, ids) do { \
1051+
err = alloc_ofld_rxqs(adap, firstq, nq, per_chan, msi_idx, ids); \
1052+
if (err) \
1053+
goto freeout; \
1054+
if (msi_idx > 0) \
1055+
msi_idx += nq; \
1056+
} while (0)
10411057

1042-
if (msi_idx > 0)
1043-
msi_idx++;
1044-
err = t4_sge_alloc_rxq(adap, &q->rspq, false, adap->port[i],
1045-
msi_idx, q->fl.size ? &q->fl : NULL,
1046-
uldrx_handler);
1047-
if (err)
1048-
goto freeout;
1049-
memset(&q->stats, 0, sizeof(q->stats));
1050-
s->rdma_rxq[i] = q->rspq.abs_id;
1051-
}
1058+
ALLOC_OFLD_RXQS(s->ofldrxq, s->ofldqsets, j, s->ofld_rxq);
1059+
ALLOC_OFLD_RXQS(s->rdmarxq, s->rdmaqs, 1, s->rdma_rxq);
1060+
j = s->rdmaciqs / adap->params.nports; /* rdmaq queues per channel */
1061+
ALLOC_OFLD_RXQS(s->rdmaciq, s->rdmaciqs, j, s->rdma_ciq);
10521062

1053-
for_each_rdmaciq(s, i) {
1054-
struct sge_ofld_rxq *q = &s->rdmaciq[i];
1055-
1056-
if (msi_idx > 0)
1057-
msi_idx++;
1058-
err = t4_sge_alloc_rxq(adap, &q->rspq, false, adap->port[i],
1059-
msi_idx, q->fl.size ? &q->fl : NULL,
1060-
uldrx_handler);
1061-
if (err)
1062-
goto freeout;
1063-
memset(&q->stats, 0, sizeof(q->stats));
1064-
s->rdma_ciq[i] = q->rspq.abs_id;
1065-
}
1063+
#undef ALLOC_OFLD_RXQS
10661064

10671065
for_each_port(adap, i) {
10681066
/*
@@ -5705,7 +5703,16 @@ static void cfg_queues(struct adapter *adap)
57055703
s->ofldqsets = adap->params.nports;
57065704
/* For RDMA one Rx queue per channel suffices */
57075705
s->rdmaqs = adap->params.nports;
5708-
s->rdmaciqs = adap->params.nports;
5706+
/* Try and allow at least 1 CIQ per cpu rounding down
5707+
* to the number of ports, with a minimum of 1 per port.
5708+
* A 2 port card in a 6 cpu system: 6 CIQs, 3 / port.
5709+
* A 4 port card in a 6 cpu system: 4 CIQs, 1 / port.
5710+
* A 4 port card in a 2 cpu system: 4 CIQs, 1 / port.
5711+
*/
5712+
s->rdmaciqs = min_t(int, MAX_RDMA_CIQS, num_online_cpus());
5713+
s->rdmaciqs = (s->rdmaciqs / adap->params.nports) *
5714+
adap->params.nports;
5715+
s->rdmaciqs = max_t(int, s->rdmaciqs, adap->params.nports);
57095716
}
57105717

57115718
for (i = 0; i < ARRAY_SIZE(s->ethrxq); i++) {
@@ -5791,12 +5798,17 @@ static void reduce_ethqs(struct adapter *adap, int n)
57915798
static int enable_msix(struct adapter *adap)
57925799
{
57935800
int ofld_need = 0;
5794-
int i, want, need;
5801+
int i, want, need, allocated;
57955802
struct sge *s = &adap->sge;
57965803
unsigned int nchan = adap->params.nports;
5797-
struct msix_entry entries[MAX_INGQ + 1];
5804+
struct msix_entry *entries;
57985805

5799-
for (i = 0; i < ARRAY_SIZE(entries); ++i)
5806+
entries = kmalloc(sizeof(*entries) * (MAX_INGQ + 1),
5807+
GFP_KERNEL);
5808+
if (!entries)
5809+
return -ENOMEM;
5810+
5811+
for (i = 0; i < MAX_INGQ + 1; ++i)
58005812
entries[i].entry = i;
58015813

58025814
want = s->max_ethqsets + EXTRA_VECS;
@@ -5813,29 +5825,39 @@ static int enable_msix(struct adapter *adap)
58135825
#else
58145826
need = adap->params.nports + EXTRA_VECS + ofld_need;
58155827
#endif
5816-
want = pci_enable_msix_range(adap->pdev, entries, need, want);
5817-
if (want < 0)
5818-
return want;
5828+
allocated = pci_enable_msix_range(adap->pdev, entries, need, want);
5829+
if (allocated < 0) {
5830+
dev_info(adap->pdev_dev, "not enough MSI-X vectors left,"
5831+
" not using MSI-X\n");
5832+
kfree(entries);
5833+
return allocated;
5834+
}
58195835

5820-
/*
5821-
* Distribute available vectors to the various queue groups.
5836+
/* Distribute available vectors to the various queue groups.
58225837
* Every group gets its minimum requirement and NIC gets top
58235838
* priority for leftovers.
58245839
*/
5825-
i = want - EXTRA_VECS - ofld_need;
5840+
i = allocated - EXTRA_VECS - ofld_need;
58265841
if (i < s->max_ethqsets) {
58275842
s->max_ethqsets = i;
58285843
if (i < s->ethqsets)
58295844
reduce_ethqs(adap, i);
58305845
}
58315846
if (is_offload(adap)) {
5832-
i = want - EXTRA_VECS - s->max_ethqsets;
5833-
i -= ofld_need - nchan;
5847+
if (allocated < want) {
5848+
s->rdmaqs = nchan;
5849+
s->rdmaciqs = nchan;
5850+
}
5851+
5852+
/* leftovers go to OFLD */
5853+
i = allocated - EXTRA_VECS - s->max_ethqsets -
5854+
s->rdmaqs - s->rdmaciqs;
58345855
s->ofldqsets = (i / nchan) * nchan; /* round down */
58355856
}
5836-
for (i = 0; i < want; ++i)
5857+
for (i = 0; i < allocated; ++i)
58375858
adap->msix_info[i].vec = entries[i].vector;
58385859

5860+
kfree(entries);
58395861
return 0;
58405862
}
58415863

0 commit comments

Comments
 (0)