49
49
50
50
static int mlx4_en_moderation_update (struct mlx4_en_priv * priv )
51
51
{
52
- int i ;
52
+ int i , t ;
53
53
int err = 0 ;
54
54
55
- for (i = 0 ; i < priv -> tx_ring_num ; i ++ ) {
56
- priv -> tx_cq [i ]-> moder_cnt = priv -> tx_frames ;
57
- priv -> tx_cq [i ]-> moder_time = priv -> tx_usecs ;
58
- if (priv -> port_up ) {
59
- err = mlx4_en_set_cq_moder (priv , priv -> tx_cq [i ]);
60
- if (err )
61
- return err ;
55
+ for (t = 0 ; t < MLX4_EN_NUM_TX_TYPES ; t ++ ) {
56
+ for (i = 0 ; i < priv -> tx_ring_num [t ]; i ++ ) {
57
+ priv -> tx_cq [t ][i ]-> moder_cnt = priv -> tx_frames ;
58
+ priv -> tx_cq [t ][i ]-> moder_time = priv -> tx_usecs ;
59
+ if (priv -> port_up ) {
60
+ err = mlx4_en_set_cq_moder (priv ,
61
+ priv -> tx_cq [t ][i ]);
62
+ if (err )
63
+ return err ;
64
+ }
62
65
}
63
66
}
64
67
@@ -192,6 +195,10 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
192
195
"tx_prio_7_packets" , "tx_prio_7_bytes" ,
193
196
"tx_novlan_packets" , "tx_novlan_bytes" ,
194
197
198
+ /* xdp statistics */
199
+ "rx_xdp_drop" ,
200
+ "rx_xdp_tx" ,
201
+ "rx_xdp_tx_full" ,
195
202
};
196
203
197
204
static const char mlx4_en_test_names [][ETH_GSTRING_LEN ]= {
@@ -336,8 +343,8 @@ static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
336
343
switch (sset ) {
337
344
case ETH_SS_STATS :
338
345
return bitmap_iterator_count (& it ) +
339
- (priv -> tx_ring_num * 2 ) +
340
- (priv -> rx_ring_num * 3 );
346
+ (priv -> tx_ring_num [ TX ] * 2 ) +
347
+ (priv -> rx_ring_num * ( 3 + NUM_XDP_STATS ) );
341
348
case ETH_SS_TEST :
342
349
return MLX4_EN_NUM_SELF_TEST - !(priv -> mdev -> dev -> caps .flags
343
350
& MLX4_DEV_CAP_FLAG_UC_LOOPBACK ) * 2 ;
@@ -397,14 +404,21 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
397
404
if (bitmap_iterator_test (& it ))
398
405
data [index ++ ] = ((unsigned long * )& priv -> pkstats )[i ];
399
406
400
- for (i = 0 ; i < priv -> tx_ring_num ; i ++ ) {
401
- data [index ++ ] = priv -> tx_ring [i ]-> packets ;
402
- data [index ++ ] = priv -> tx_ring [i ]-> bytes ;
407
+ for (i = 0 ; i < NUM_XDP_STATS ; i ++ , bitmap_iterator_inc (& it ))
408
+ if (bitmap_iterator_test (& it ))
409
+ data [index ++ ] = ((unsigned long * )& priv -> xdp_stats )[i ];
410
+
411
+ for (i = 0 ; i < priv -> tx_ring_num [TX ]; i ++ ) {
412
+ data [index ++ ] = priv -> tx_ring [TX ][i ]-> packets ;
413
+ data [index ++ ] = priv -> tx_ring [TX ][i ]-> bytes ;
403
414
}
404
415
for (i = 0 ; i < priv -> rx_ring_num ; i ++ ) {
405
416
data [index ++ ] = priv -> rx_ring [i ]-> packets ;
406
417
data [index ++ ] = priv -> rx_ring [i ]-> bytes ;
407
418
data [index ++ ] = priv -> rx_ring [i ]-> dropped ;
419
+ data [index ++ ] = priv -> rx_ring [i ]-> xdp_drop ;
420
+ data [index ++ ] = priv -> rx_ring [i ]-> xdp_tx ;
421
+ data [index ++ ] = priv -> rx_ring [i ]-> xdp_tx_full ;
408
422
}
409
423
spin_unlock_bh (& priv -> stats_lock );
410
424
@@ -467,7 +481,13 @@ static void mlx4_en_get_strings(struct net_device *dev,
467
481
strcpy (data + (index ++ ) * ETH_GSTRING_LEN ,
468
482
main_strings [strings ]);
469
483
470
- for (i = 0 ; i < priv -> tx_ring_num ; i ++ ) {
484
+ for (i = 0 ; i < NUM_XDP_STATS ; i ++ , strings ++ ,
485
+ bitmap_iterator_inc (& it ))
486
+ if (bitmap_iterator_test (& it ))
487
+ strcpy (data + (index ++ ) * ETH_GSTRING_LEN ,
488
+ main_strings [strings ]);
489
+
490
+ for (i = 0 ; i < priv -> tx_ring_num [TX ]; i ++ ) {
471
491
sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
472
492
"tx%d_packets" , i );
473
493
sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
@@ -480,6 +500,12 @@ static void mlx4_en_get_strings(struct net_device *dev,
480
500
"rx%d_bytes" , i );
481
501
sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
482
502
"rx%d_dropped" , i );
503
+ sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
504
+ "rx%d_xdp_drop" , i );
505
+ sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
506
+ "rx%d_xdp_tx" , i );
507
+ sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
508
+ "rx%d_xdp_tx_full" , i );
483
509
}
484
510
break ;
485
511
case ETH_SS_PRIV_FLAGS :
@@ -1060,7 +1086,7 @@ static int mlx4_en_set_ringparam(struct net_device *dev,
1060
1086
1061
1087
if (rx_size == (priv -> port_up ? priv -> rx_ring [0 ]-> actual_size :
1062
1088
priv -> rx_ring [0 ]-> size ) &&
1063
- tx_size == priv -> tx_ring [0 ]-> size )
1089
+ tx_size == priv -> tx_ring [TX ][ 0 ]-> size )
1064
1090
return 0 ;
1065
1091
1066
1092
tmp = kzalloc (sizeof (* tmp ), GFP_KERNEL );
@@ -1105,7 +1131,7 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
1105
1131
param -> tx_max_pending = MLX4_EN_MAX_TX_SIZE ;
1106
1132
param -> rx_pending = priv -> port_up ?
1107
1133
priv -> rx_ring [0 ]-> actual_size : priv -> rx_ring [0 ]-> size ;
1108
- param -> tx_pending = priv -> tx_ring [0 ]-> size ;
1134
+ param -> tx_pending = priv -> tx_ring [TX ][ 0 ]-> size ;
1109
1135
}
1110
1136
1111
1137
static u32 mlx4_en_get_rxfh_indir_size (struct net_device * dev )
@@ -1710,7 +1736,7 @@ static void mlx4_en_get_channels(struct net_device *dev,
1710
1736
channel -> max_tx = MLX4_EN_MAX_TX_RING_P_UP ;
1711
1737
1712
1738
channel -> rx_count = priv -> rx_ring_num ;
1713
- channel -> tx_count = priv -> tx_ring_num / MLX4_EN_NUM_UP ;
1739
+ channel -> tx_count = priv -> tx_ring_num [ TX ] / MLX4_EN_NUM_UP ;
1714
1740
}
1715
1741
1716
1742
static int mlx4_en_set_channels (struct net_device * dev ,
@@ -1721,6 +1747,7 @@ static int mlx4_en_set_channels(struct net_device *dev,
1721
1747
struct mlx4_en_port_profile new_prof ;
1722
1748
struct mlx4_en_priv * tmp ;
1723
1749
int port_up = 0 ;
1750
+ int xdp_count ;
1724
1751
int err = 0 ;
1725
1752
1726
1753
if (channel -> other_count || channel -> combined_count ||
@@ -1729,20 +1756,25 @@ static int mlx4_en_set_channels(struct net_device *dev,
1729
1756
!channel -> tx_count || !channel -> rx_count )
1730
1757
return - EINVAL ;
1731
1758
1732
- if (channel -> tx_count * MLX4_EN_NUM_UP <= priv -> xdp_ring_num ) {
1733
- en_err (priv , "Minimum %d tx channels required with XDP on\n" ,
1734
- priv -> xdp_ring_num / MLX4_EN_NUM_UP + 1 );
1735
- return - EINVAL ;
1736
- }
1737
-
1738
1759
tmp = kzalloc (sizeof (* tmp ), GFP_KERNEL );
1739
1760
if (!tmp )
1740
1761
return - ENOMEM ;
1741
1762
1742
1763
mutex_lock (& mdev -> state_lock );
1764
+ xdp_count = priv -> tx_ring_num [TX_XDP ] ? channel -> rx_count : 0 ;
1765
+ if (channel -> tx_count * MLX4_EN_NUM_UP + xdp_count > MAX_TX_RINGS ) {
1766
+ err = - EINVAL ;
1767
+ en_err (priv ,
1768
+ "Total number of TX and XDP rings (%d) exceeds the maximum supported (%d)\n" ,
1769
+ channel -> tx_count * MLX4_EN_NUM_UP + xdp_count ,
1770
+ MAX_TX_RINGS );
1771
+ goto out ;
1772
+ }
1773
+
1743
1774
memcpy (& new_prof , priv -> prof , sizeof (struct mlx4_en_port_profile ));
1744
1775
new_prof .num_tx_rings_p_up = channel -> tx_count ;
1745
- new_prof .tx_ring_num = channel -> tx_count * MLX4_EN_NUM_UP ;
1776
+ new_prof .tx_ring_num [TX ] = channel -> tx_count * MLX4_EN_NUM_UP ;
1777
+ new_prof .tx_ring_num [TX_XDP ] = xdp_count ;
1746
1778
new_prof .rx_ring_num = channel -> rx_count ;
1747
1779
1748
1780
err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof );
@@ -1756,14 +1788,13 @@ static int mlx4_en_set_channels(struct net_device *dev,
1756
1788
1757
1789
mlx4_en_safe_replace_resources (priv , tmp );
1758
1790
1759
- netif_set_real_num_tx_queues (dev , priv -> tx_ring_num -
1760
- priv -> xdp_ring_num );
1791
+ netif_set_real_num_tx_queues (dev , priv -> tx_ring_num [TX ]);
1761
1792
netif_set_real_num_rx_queues (dev , priv -> rx_ring_num );
1762
1793
1763
1794
if (dev -> num_tc )
1764
1795
mlx4_en_setup_tc (dev , MLX4_EN_NUM_UP );
1765
1796
1766
- en_warn (priv , "Using %d TX rings\n" , priv -> tx_ring_num );
1797
+ en_warn (priv , "Using %d TX rings\n" , priv -> tx_ring_num [ TX ] );
1767
1798
en_warn (priv , "Using %d RX rings\n" , priv -> rx_ring_num );
1768
1799
1769
1800
if (port_up ) {
@@ -1774,8 +1805,8 @@ static int mlx4_en_set_channels(struct net_device *dev,
1774
1805
1775
1806
err = mlx4_en_moderation_update (priv );
1776
1807
out :
1777
- kfree (tmp );
1778
1808
mutex_unlock (& mdev -> state_lock );
1809
+ kfree (tmp );
1779
1810
return err ;
1780
1811
}
1781
1812
@@ -1823,11 +1854,15 @@ static int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
1823
1854
int ret = 0 ;
1824
1855
1825
1856
if (bf_enabled_new != bf_enabled_old ) {
1857
+ int t ;
1858
+
1826
1859
if (bf_enabled_new ) {
1827
1860
bool bf_supported = true;
1828
1861
1829
- for (i = 0 ; i < priv -> tx_ring_num ; i ++ )
1830
- bf_supported &= priv -> tx_ring [i ]-> bf_alloced ;
1862
+ for (t = 0 ; t < MLX4_EN_NUM_TX_TYPES ; t ++ )
1863
+ for (i = 0 ; i < priv -> tx_ring_num [t ]; i ++ )
1864
+ bf_supported &=
1865
+ priv -> tx_ring [t ][i ]-> bf_alloced ;
1831
1866
1832
1867
if (!bf_supported ) {
1833
1868
en_err (priv , "BlueFlame is not supported\n" );
@@ -1839,8 +1874,10 @@ static int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
1839
1874
priv -> pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME ;
1840
1875
}
1841
1876
1842
- for (i = 0 ; i < priv -> tx_ring_num ; i ++ )
1843
- priv -> tx_ring [i ]-> bf_enabled = bf_enabled_new ;
1877
+ for (t = 0 ; t < MLX4_EN_NUM_TX_TYPES ; t ++ )
1878
+ for (i = 0 ; i < priv -> tx_ring_num [t ]; i ++ )
1879
+ priv -> tx_ring [t ][i ]-> bf_enabled =
1880
+ bf_enabled_new ;
1844
1881
1845
1882
en_info (priv , "BlueFlame %s\n" ,
1846
1883
bf_enabled_new ? "Enabled" : "Disabled" );
0 commit comments