4949
5050static int mlx4_en_moderation_update (struct mlx4_en_priv * priv )
5151{
52- int i ;
52+ int i , t ;
5353 int err = 0 ;
5454
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+ }
6265 }
6366 }
6467
@@ -192,6 +195,10 @@ static const char main_strings[][ETH_GSTRING_LEN] = {
192195 "tx_prio_7_packets" , "tx_prio_7_bytes" ,
193196 "tx_novlan_packets" , "tx_novlan_bytes" ,
194197
198+ /* xdp statistics */
199+ "rx_xdp_drop" ,
200+ "rx_xdp_tx" ,
201+ "rx_xdp_tx_full" ,
195202};
196203
197204static 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)
336343 switch (sset ) {
337344 case ETH_SS_STATS :
338345 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 ) );
341348 case ETH_SS_TEST :
342349 return MLX4_EN_NUM_SELF_TEST - !(priv -> mdev -> dev -> caps .flags
343350 & MLX4_DEV_CAP_FLAG_UC_LOOPBACK ) * 2 ;
@@ -397,14 +404,21 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
397404 if (bitmap_iterator_test (& it ))
398405 data [index ++ ] = ((unsigned long * )& priv -> pkstats )[i ];
399406
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 ;
403414 }
404415 for (i = 0 ; i < priv -> rx_ring_num ; i ++ ) {
405416 data [index ++ ] = priv -> rx_ring [i ]-> packets ;
406417 data [index ++ ] = priv -> rx_ring [i ]-> bytes ;
407418 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 ;
408422 }
409423 spin_unlock_bh (& priv -> stats_lock );
410424
@@ -467,7 +481,13 @@ static void mlx4_en_get_strings(struct net_device *dev,
467481 strcpy (data + (index ++ ) * ETH_GSTRING_LEN ,
468482 main_strings [strings ]);
469483
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 ++ ) {
471491 sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
472492 "tx%d_packets" , i );
473493 sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
@@ -480,6 +500,12 @@ static void mlx4_en_get_strings(struct net_device *dev,
480500 "rx%d_bytes" , i );
481501 sprintf (data + (index ++ ) * ETH_GSTRING_LEN ,
482502 "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 );
483509 }
484510 break ;
485511 case ETH_SS_PRIV_FLAGS :
@@ -1060,7 +1086,7 @@ static int mlx4_en_set_ringparam(struct net_device *dev,
10601086
10611087 if (rx_size == (priv -> port_up ? priv -> rx_ring [0 ]-> actual_size :
10621088 priv -> rx_ring [0 ]-> size ) &&
1063- tx_size == priv -> tx_ring [0 ]-> size )
1089+ tx_size == priv -> tx_ring [TX ][ 0 ]-> size )
10641090 return 0 ;
10651091
10661092 tmp = kzalloc (sizeof (* tmp ), GFP_KERNEL );
@@ -1105,7 +1131,7 @@ static void mlx4_en_get_ringparam(struct net_device *dev,
11051131 param -> tx_max_pending = MLX4_EN_MAX_TX_SIZE ;
11061132 param -> rx_pending = priv -> port_up ?
11071133 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 ;
11091135}
11101136
11111137static 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,
17101736 channel -> max_tx = MLX4_EN_MAX_TX_RING_P_UP ;
17111737
17121738 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 ;
17141740}
17151741
17161742static int mlx4_en_set_channels (struct net_device * dev ,
@@ -1721,6 +1747,7 @@ static int mlx4_en_set_channels(struct net_device *dev,
17211747 struct mlx4_en_port_profile new_prof ;
17221748 struct mlx4_en_priv * tmp ;
17231749 int port_up = 0 ;
1750+ int xdp_count ;
17241751 int err = 0 ;
17251752
17261753 if (channel -> other_count || channel -> combined_count ||
@@ -1729,20 +1756,25 @@ static int mlx4_en_set_channels(struct net_device *dev,
17291756 !channel -> tx_count || !channel -> rx_count )
17301757 return - EINVAL ;
17311758
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-
17381759 tmp = kzalloc (sizeof (* tmp ), GFP_KERNEL );
17391760 if (!tmp )
17401761 return - ENOMEM ;
17411762
17421763 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+
17431774 memcpy (& new_prof , priv -> prof , sizeof (struct mlx4_en_port_profile ));
17441775 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 ;
17461778 new_prof .rx_ring_num = channel -> rx_count ;
17471779
17481780 err = mlx4_en_try_alloc_resources (priv , tmp , & new_prof );
@@ -1756,14 +1788,13 @@ static int mlx4_en_set_channels(struct net_device *dev,
17561788
17571789 mlx4_en_safe_replace_resources (priv , tmp );
17581790
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 ]);
17611792 netif_set_real_num_rx_queues (dev , priv -> rx_ring_num );
17621793
17631794 if (dev -> num_tc )
17641795 mlx4_en_setup_tc (dev , MLX4_EN_NUM_UP );
17651796
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 ] );
17671798 en_warn (priv , "Using %d RX rings\n" , priv -> rx_ring_num );
17681799
17691800 if (port_up ) {
@@ -1774,8 +1805,8 @@ static int mlx4_en_set_channels(struct net_device *dev,
17741805
17751806 err = mlx4_en_moderation_update (priv );
17761807out :
1777- kfree (tmp );
17781808 mutex_unlock (& mdev -> state_lock );
1809+ kfree (tmp );
17791810 return err ;
17801811}
17811812
@@ -1823,11 +1854,15 @@ static int mlx4_en_set_priv_flags(struct net_device *dev, u32 flags)
18231854 int ret = 0 ;
18241855
18251856 if (bf_enabled_new != bf_enabled_old ) {
1857+ int t ;
1858+
18261859 if (bf_enabled_new ) {
18271860 bool bf_supported = true;
18281861
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 ;
18311866
18321867 if (!bf_supported ) {
18331868 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)
18391874 priv -> pflags &= ~MLX4_EN_PRIV_FLAGS_BLUEFLAME ;
18401875 }
18411876
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 ;
18441881
18451882 en_info (priv , "BlueFlame %s\n" ,
18461883 bf_enabled_new ? "Enabled" : "Disabled" );
0 commit comments