@@ -5381,12 +5381,11 @@ static inline bool is_x_10g_port(const struct link_config *lc)
5381
5381
static int cfg_queues (struct adapter * adap )
5382
5382
{
5383
5383
u32 avail_qsets , avail_eth_qsets , avail_uld_qsets ;
5384
+ u32 i , n10g = 0 , qidx = 0 , n1g = 0 ;
5385
+ u32 ncpus = num_online_cpus ();
5384
5386
u32 niqflint , neq , num_ulds ;
5385
5387
struct sge * s = & adap -> sge ;
5386
- u32 i , n10g = 0 , qidx = 0 ;
5387
- #ifndef CONFIG_CHELSIO_T4_DCB
5388
- int q10g = 0 ;
5389
- #endif
5388
+ u32 q10g = 0 , q1g ;
5390
5389
5391
5390
/* Reduce memory usage in kdump environment, disable all offload. */
5392
5391
if (is_kdump_kernel () || (is_uld (adap ) && t4_uld_mem_alloc (adap ))) {
@@ -5424,44 +5423,50 @@ static int cfg_queues(struct adapter *adap)
5424
5423
n10g += is_x_10g_port (& adap2pinfo (adap , i )-> link_cfg );
5425
5424
5426
5425
avail_eth_qsets = min_t (u32 , avail_qsets , MAX_ETH_QSETS );
5426
+
5427
+ /* We default to 1 queue per non-10G port and up to # of cores queues
5428
+ * per 10G port.
5429
+ */
5430
+ if (n10g )
5431
+ q10g = (avail_eth_qsets - (adap -> params .nports - n10g )) / n10g ;
5432
+
5433
+ n1g = adap -> params .nports - n10g ;
5427
5434
#ifdef CONFIG_CHELSIO_T4_DCB
5428
5435
/* For Data Center Bridging support we need to be able to support up
5429
5436
* to 8 Traffic Priorities; each of which will be assigned to its
5430
5437
* own TX Queue in order to prevent Head-Of-Line Blocking.
5431
5438
*/
5439
+ q1g = 8 ;
5432
5440
if (adap -> params .nports * 8 > avail_eth_qsets ) {
5433
5441
dev_err (adap -> pdev_dev , "DCB avail_eth_qsets=%d < %d!\n" ,
5434
5442
avail_eth_qsets , adap -> params .nports * 8 );
5435
5443
return - ENOMEM ;
5436
5444
}
5437
5445
5438
- for_each_port (adap , i ) {
5439
- struct port_info * pi = adap2pinfo (adap , i );
5446
+ if (adap -> params .nports * ncpus < avail_eth_qsets )
5447
+ q10g = max (8U , ncpus );
5448
+ else
5449
+ q10g = max (8U , q10g );
5440
5450
5441
- pi -> first_qset = qidx ;
5442
- pi -> nqsets = is_kdump_kernel () ? 1 : 8 ;
5443
- qidx += pi -> nqsets ;
5444
- }
5445
- #else /* !CONFIG_CHELSIO_T4_DCB */
5446
- /* We default to 1 queue per non-10G port and up to # of cores queues
5447
- * per 10G port.
5448
- */
5449
- if (n10g )
5450
- q10g = (avail_eth_qsets - (adap -> params .nports - n10g )) / n10g ;
5451
- if (q10g > netif_get_num_default_rss_queues ())
5452
- q10g = netif_get_num_default_rss_queues ();
5451
+ while ((q10g * n10g ) > (avail_eth_qsets - n1g * q1g ))
5452
+ q10g -- ;
5453
5453
5454
- if (is_kdump_kernel ())
5454
+ #else /* !CONFIG_CHELSIO_T4_DCB */
5455
+ q1g = 1 ;
5456
+ q10g = min (q10g , ncpus );
5457
+ #endif /* !CONFIG_CHELSIO_T4_DCB */
5458
+ if (is_kdump_kernel ()) {
5455
5459
q10g = 1 ;
5460
+ q1g = 1 ;
5461
+ }
5456
5462
5457
5463
for_each_port (adap , i ) {
5458
5464
struct port_info * pi = adap2pinfo (adap , i );
5459
5465
5460
5466
pi -> first_qset = qidx ;
5461
- pi -> nqsets = is_x_10g_port (& pi -> link_cfg ) ? q10g : 1 ;
5467
+ pi -> nqsets = is_x_10g_port (& pi -> link_cfg ) ? q10g : q1g ;
5462
5468
qidx += pi -> nqsets ;
5463
5469
}
5464
- #endif /* !CONFIG_CHELSIO_T4_DCB */
5465
5470
5466
5471
s -> ethqsets = qidx ;
5467
5472
s -> max_ethqsets = qidx ; /* MSI-X may lower it later */
@@ -5473,7 +5478,7 @@ static int cfg_queues(struct adapter *adap)
5473
5478
* capped by the number of available cores.
5474
5479
*/
5475
5480
num_ulds = adap -> num_uld + adap -> num_ofld_uld ;
5476
- i = min_t (u32 , MAX_OFLD_QSETS , num_online_cpus () );
5481
+ i = min_t (u32 , MAX_OFLD_QSETS , ncpus );
5477
5482
avail_uld_qsets = roundup (i , adap -> params .nports );
5478
5483
if (avail_qsets < num_ulds * adap -> params .nports ) {
5479
5484
adap -> params .offload = 0 ;
0 commit comments