Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue

Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2022-11-04 (ixgbe, ixgbevf, igb)

This series contains updates to ixgbe, ixgbevf, and igb drivers.

Daniel Willenson adjusts descriptor buffer limits to be based on what
hardware supports instead of using a generic, least common value for
ixgbe.

Ani removes local variable for ixgbe, instead returning conditional result
directly.

Yang Li removes unneeded semicolon for ixgbe.

Jan adds error messaging when VLAN errors are encountered for ixgbevf.

Kees Cook prevents a potential use after free condition and explicitly
rounds up q_vector allocations so that allocations can be correctly
compared to ksize() for igb.

* '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue:
igb: Proactively round up to kmalloc bucket size
igb: Do not free q_vector unless new one was allocated
ixgbevf: Add error messages on vlan error
ixgbe: Remove unneeded semicolon
ixgbe: Remove local variable
ixgbe: change MAX_RXD/MAX_TXD based on adapter type
====================

Reviewed-by: Leon Romanovsky <leonro@nvidia.com>
Link: https://lore.kernel.org/r/20221104205414.2354973-1-anthony.l.nguyen@intel.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+70 -22
+7 -3
drivers/net/ethernet/intel/igb/igb_main.c
··· 1195 1195 return -ENOMEM; 1196 1196 1197 1197 ring_count = txr_count + rxr_count; 1198 - size = struct_size(q_vector, ring, ring_count); 1198 + size = kmalloc_size_roundup(struct_size(q_vector, ring, ring_count)); 1199 1199 1200 1200 /* allocate q_vector and rings */ 1201 1201 q_vector = adapter->q_vector[v_idx]; 1202 1202 if (!q_vector) { 1203 1203 q_vector = kzalloc(size, GFP_KERNEL); 1204 1204 } else if (size > ksize(q_vector)) { 1205 - kfree_rcu(q_vector, rcu); 1206 - q_vector = kzalloc(size, GFP_KERNEL); 1205 + struct igb_q_vector *new_q_vector; 1206 + 1207 + new_q_vector = kzalloc(size, GFP_KERNEL); 1208 + if (new_q_vector) 1209 + kfree_rcu(q_vector, rcu); 1210 + q_vector = new_q_vector; 1207 1211 } else { 1208 1212 memset(q_vector, 0, size); 1209 1213 }
+8 -2
drivers/net/ethernet/intel/ixgbe/ixgbe.h
··· 39 39 /* TX/RX descriptor defines */ 40 40 #define IXGBE_DEFAULT_TXD 512 41 41 #define IXGBE_DEFAULT_TX_WORK 256 42 - #define IXGBE_MAX_TXD 4096 42 + #define IXGBE_MAX_TXD_82598 4096 43 + #define IXGBE_MAX_TXD_82599 8192 44 + #define IXGBE_MAX_TXD_X540 8192 45 + #define IXGBE_MAX_TXD_X550 32768 43 46 #define IXGBE_MIN_TXD 64 44 47 45 48 #if (PAGE_SIZE < 8192) ··· 50 47 #else 51 48 #define IXGBE_DEFAULT_RXD 128 52 49 #endif 53 - #define IXGBE_MAX_RXD 4096 50 + #define IXGBE_MAX_RXD_82598 4096 51 + #define IXGBE_MAX_RXD_82599 8192 52 + #define IXGBE_MAX_RXD_X540 8192 53 + #define IXGBE_MAX_RXD_X550 32768 54 54 #define IXGBE_MIN_RXD 64 55 55 56 56 /* flow control */
+42 -11
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
··· 1117 1117 drvinfo->n_priv_flags = IXGBE_PRIV_FLAGS_STR_LEN; 1118 1118 } 1119 1119 1120 + static u32 ixgbe_get_max_rxd(struct ixgbe_adapter *adapter) 1121 + { 1122 + switch (adapter->hw.mac.type) { 1123 + case ixgbe_mac_82598EB: 1124 + return IXGBE_MAX_RXD_82598; 1125 + case ixgbe_mac_82599EB: 1126 + return IXGBE_MAX_RXD_82599; 1127 + case ixgbe_mac_X540: 1128 + return IXGBE_MAX_RXD_X540; 1129 + case ixgbe_mac_X550: 1130 + case ixgbe_mac_X550EM_x: 1131 + case ixgbe_mac_x550em_a: 1132 + return IXGBE_MAX_RXD_X550; 1133 + default: 1134 + return IXGBE_MAX_RXD_82598; 1135 + } 1136 + } 1137 + 1138 + static u32 ixgbe_get_max_txd(struct ixgbe_adapter *adapter) 1139 + { 1140 + switch (adapter->hw.mac.type) { 1141 + case ixgbe_mac_82598EB: 1142 + return IXGBE_MAX_TXD_82598; 1143 + case ixgbe_mac_82599EB: 1144 + return IXGBE_MAX_TXD_82599; 1145 + case ixgbe_mac_X540: 1146 + return IXGBE_MAX_TXD_X540; 1147 + case ixgbe_mac_X550: 1148 + case ixgbe_mac_X550EM_x: 1149 + case ixgbe_mac_x550em_a: 1150 + return IXGBE_MAX_TXD_X550; 1151 + default: 1152 + return IXGBE_MAX_TXD_82598; 1153 + } 1154 + } 1155 + 1120 1156 static void ixgbe_get_ringparam(struct net_device *netdev, 1121 1157 struct ethtool_ringparam *ring, 1122 1158 struct kernel_ethtool_ringparam *kernel_ring, ··· 1162 1126 struct ixgbe_ring *tx_ring = adapter->tx_ring[0]; 1163 1127 struct ixgbe_ring *rx_ring = adapter->rx_ring[0]; 1164 1128 1165 - ring->rx_max_pending = IXGBE_MAX_RXD; 1166 - ring->tx_max_pending = IXGBE_MAX_TXD; 1129 + ring->rx_max_pending = ixgbe_get_max_rxd(adapter); 1130 + ring->tx_max_pending = ixgbe_get_max_txd(adapter); 1167 1131 ring->rx_pending = rx_ring->count; 1168 1132 ring->tx_pending = tx_ring->count; 1169 1133 } ··· 1182 1146 return -EINVAL; 1183 1147 1184 1148 new_tx_count = clamp_t(u32, ring->tx_pending, 1185 - IXGBE_MIN_TXD, IXGBE_MAX_TXD); 1149 + IXGBE_MIN_TXD, ixgbe_get_max_txd(adapter)); 1186 1150 new_tx_count = ALIGN(new_tx_count, IXGBE_REQ_TX_DESCRIPTOR_MULTIPLE); 1187 1151 1188 1152 new_rx_count = clamp_t(u32, ring->rx_pending, 1189 - IXGBE_MIN_RXD, IXGBE_MAX_RXD); 1153 + IXGBE_MIN_RXD, ixgbe_get_max_rxd(adapter)); 1190 1154 new_rx_count = ALIGN(new_rx_count, IXGBE_REQ_RX_DESCRIPTOR_MULTIPLE); 1191 1155 1192 1156 if ((new_tx_count == adapter->tx_ring_count) && ··· 1996 1960 unsigned int frame_size) 1997 1961 { 1998 1962 unsigned char *data; 1999 - bool match = true; 2000 1963 2001 1964 frame_size >>= 1; 2002 1965 2003 1966 data = page_address(rx_buffer->page) + rx_buffer->page_offset; 2004 1967 2005 - if (data[3] != 0xFF || 2006 - data[frame_size + 10] != 0xBE || 2007 - data[frame_size + 12] != 0xAF) 2008 - match = false; 2009 - 2010 - return match; 1968 + return data[3] == 0xFF && data[frame_size + 10] == 0xBE && 1969 + data[frame_size + 12] == 0xAF; 2011 1970 } 2012 1971 2013 1972 static u16 ixgbe_clean_test_rings(struct ixgbe_ring *rx_ring,
+1 -1
drivers/net/ethernet/intel/ixgbe/ixgbe_ptp.c
··· 1302 1302 default: 1303 1303 /* Other devices aren't supported */ 1304 1304 return; 1305 - }; 1305 + } 1306 1306 1307 1307 IXGBE_WRITE_FLUSH(hw); 1308 1308 }
+12 -5
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
··· 2044 2044 2045 2045 spin_unlock_bh(&adapter->mbx_lock); 2046 2046 2047 - /* translate error return types so error makes sense */ 2048 - if (err == IXGBE_ERR_MBX) 2049 - return -EIO; 2047 + if (err) { 2048 + netdev_err(netdev, "VF could not set VLAN %d\n", vid); 2050 2049 2051 - if (err == IXGBE_ERR_INVALID_ARGUMENT) 2052 - return -EACCES; 2050 + /* translate error return types so error makes sense */ 2051 + if (err == IXGBE_ERR_MBX) 2052 + return -EIO; 2053 + 2054 + if (err == IXGBE_ERR_INVALID_ARGUMENT) 2055 + return -EACCES; 2056 + } 2053 2057 2054 2058 set_bit(vid, adapter->active_vlans); 2055 2059 ··· 2073 2069 err = hw->mac.ops.set_vfta(hw, vid, 0, false); 2074 2070 2075 2071 spin_unlock_bh(&adapter->mbx_lock); 2072 + 2073 + if (err) 2074 + netdev_err(netdev, "Could not remove VLAN %d\n", vid); 2076 2075 2077 2076 clear_bit(vid, adapter->active_vlans); 2078 2077