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

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

Jeff Kirsher says:

====================
100GbE Intel Wired LAN Driver Updates 2018-05-09

This series contains updates to fm10k only.

Jake provides all the changes in the series, starting with adding
support for accelerated MACVLAN devices. Reduced code duplication by
implementing a macro to be used when setting up the type specific
macros. Avoided potential bugs with stats by using a macro to calculate
the array size when passing to ensure that the size is correct.

v2: changed macro reference '#' with __stringify() as suggested by
Joe Perches to patch 2 of the series. Also made sure the updated
series of patches is actually pushed to my kernel.org tree
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+111 -67
+57 -59
drivers/net/ethernet/intel/fm10k/fm10k_ethtool.c
··· 6 6 #include "fm10k.h" 7 7 8 8 struct fm10k_stats { 9 + /* The stat_string is expected to be a format string formatted using 10 + * vsnprintf by fm10k_add_stat_strings. Every member of a stats array 11 + * should use the same format specifiers as they will be formatted 12 + * using the same variadic arguments. 13 + */ 9 14 char stat_string[ETH_GSTRING_LEN]; 10 15 int sizeof_stat; 11 16 int stat_offset; 12 17 }; 13 18 14 - #define FM10K_NETDEV_STAT(_net_stat) { \ 15 - .stat_string = #_net_stat, \ 16 - .sizeof_stat = FIELD_SIZEOF(struct net_device_stats, _net_stat), \ 17 - .stat_offset = offsetof(struct net_device_stats, _net_stat) \ 19 + #define FM10K_STAT_FIELDS(_type, _name, _stat) { \ 20 + .stat_string = _name, \ 21 + .sizeof_stat = FIELD_SIZEOF(_type, _stat), \ 22 + .stat_offset = offsetof(_type, _stat) \ 18 23 } 24 + 25 + /* netdevice statistics */ 26 + #define FM10K_NETDEV_STAT(_net_stat) \ 27 + FM10K_STAT_FIELDS(struct net_device_stats, __stringify(_net_stat), \ 28 + _net_stat) 19 29 20 30 static const struct fm10k_stats fm10k_gstrings_net_stats[] = { 21 31 FM10K_NETDEV_STAT(tx_packets), ··· 44 34 45 35 #define FM10K_NETDEV_STATS_LEN ARRAY_SIZE(fm10k_gstrings_net_stats) 46 36 47 - #define FM10K_STAT(_name, _stat) { \ 48 - .stat_string = _name, \ 49 - .sizeof_stat = FIELD_SIZEOF(struct fm10k_intfc, _stat), \ 50 - .stat_offset = offsetof(struct fm10k_intfc, _stat) \ 51 - } 37 + /* General interface statistics */ 38 + #define FM10K_STAT(_name, _stat) \ 39 + FM10K_STAT_FIELDS(struct fm10k_intfc, _name, _stat) 52 40 53 41 static const struct fm10k_stats fm10k_gstrings_global_stats[] = { 54 42 FM10K_STAT("tx_restart_queue", restart_queue), ··· 83 75 FM10K_STAT("nodesc_drop", stats.nodesc_drop.count), 84 76 }; 85 77 86 - #define FM10K_MBX_STAT(_name, _stat) { \ 87 - .stat_string = _name, \ 88 - .sizeof_stat = FIELD_SIZEOF(struct fm10k_mbx_info, _stat), \ 89 - .stat_offset = offsetof(struct fm10k_mbx_info, _stat) \ 90 - } 78 + /* mailbox statistics */ 79 + #define FM10K_MBX_STAT(_name, _stat) \ 80 + FM10K_STAT_FIELDS(struct fm10k_mbx_info, _name, _stat) 91 81 92 82 static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = { 93 83 FM10K_MBX_STAT("mbx_tx_busy", tx_busy), ··· 99 93 FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed), 100 94 }; 101 95 102 - #define FM10K_QUEUE_STAT(_name, _stat) { \ 103 - .stat_string = _name, \ 104 - .sizeof_stat = FIELD_SIZEOF(struct fm10k_ring, _stat), \ 105 - .stat_offset = offsetof(struct fm10k_ring, _stat) \ 106 - } 96 + /* per-queue ring statistics */ 97 + #define FM10K_QUEUE_STAT(_name, _stat) \ 98 + FM10K_STAT_FIELDS(struct fm10k_ring, _name, _stat) 107 99 108 100 static const struct fm10k_stats fm10k_gstrings_queue_stats[] = { 109 - FM10K_QUEUE_STAT("packets", stats.packets), 110 - FM10K_QUEUE_STAT("bytes", stats.bytes), 101 + FM10K_QUEUE_STAT("%s_queue_%u_packets", stats.packets), 102 + FM10K_QUEUE_STAT("%s_queue_%u_bytes", stats.bytes), 111 103 }; 112 104 113 105 #define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats) ··· 135 131 static const char fm10k_prv_flags[FM10K_PRV_FLAG_LEN][ETH_GSTRING_LEN] = { 136 132 }; 137 133 138 - static void fm10k_add_stat_strings(u8 **p, const char *prefix, 139 - const struct fm10k_stats stats[], 140 - const unsigned int size) 134 + static void __fm10k_add_stat_strings(u8 **p, const struct fm10k_stats stats[], 135 + const unsigned int size, ...) 141 136 { 142 137 unsigned int i; 143 138 144 139 for (i = 0; i < size; i++) { 145 - snprintf(*p, ETH_GSTRING_LEN, "%s%s", 146 - prefix, stats[i].stat_string); 140 + va_list args; 141 + 142 + va_start(args, size); 143 + vsnprintf(*p, ETH_GSTRING_LEN, stats[i].stat_string, args); 147 144 *p += ETH_GSTRING_LEN; 145 + va_end(args); 148 146 } 149 147 } 148 + 149 + #define fm10k_add_stat_strings(p, stats, ...) \ 150 + __fm10k_add_stat_strings(p, stats, ARRAY_SIZE(stats), ## __VA_ARGS__) 150 151 151 152 static void fm10k_get_stat_strings(struct net_device *dev, u8 *data) 152 153 { 153 154 struct fm10k_intfc *interface = netdev_priv(dev); 154 155 unsigned int i; 155 156 156 - fm10k_add_stat_strings(&data, "", fm10k_gstrings_net_stats, 157 - FM10K_NETDEV_STATS_LEN); 157 + fm10k_add_stat_strings(&data, fm10k_gstrings_net_stats); 158 158 159 - fm10k_add_stat_strings(&data, "", fm10k_gstrings_global_stats, 160 - FM10K_GLOBAL_STATS_LEN); 159 + fm10k_add_stat_strings(&data, fm10k_gstrings_global_stats); 161 160 162 - fm10k_add_stat_strings(&data, "", fm10k_gstrings_mbx_stats, 163 - FM10K_MBX_STATS_LEN); 161 + fm10k_add_stat_strings(&data, fm10k_gstrings_mbx_stats); 164 162 165 163 if (interface->hw.mac.type != fm10k_mac_vf) 166 - fm10k_add_stat_strings(&data, "", fm10k_gstrings_pf_stats, 167 - FM10K_PF_STATS_LEN); 164 + fm10k_add_stat_strings(&data, fm10k_gstrings_pf_stats); 168 165 169 166 for (i = 0; i < interface->hw.mac.max_queues; i++) { 170 - char prefix[ETH_GSTRING_LEN]; 167 + fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats, 168 + "tx", i); 171 169 172 - snprintf(prefix, ETH_GSTRING_LEN, "tx_queue_%u_", i); 173 - fm10k_add_stat_strings(&data, prefix, 174 - fm10k_gstrings_queue_stats, 175 - FM10K_QUEUE_STATS_LEN); 176 - 177 - snprintf(prefix, ETH_GSTRING_LEN, "rx_queue_%u_", i); 178 - fm10k_add_stat_strings(&data, prefix, 179 - fm10k_gstrings_queue_stats, 180 - FM10K_QUEUE_STATS_LEN); 170 + fm10k_add_stat_strings(&data, fm10k_gstrings_queue_stats, 171 + "rx", i); 181 172 } 182 173 } 183 174 ··· 217 218 } 218 219 } 219 220 220 - static void fm10k_add_ethtool_stats(u64 **data, void *pointer, 221 - const struct fm10k_stats stats[], 222 - const unsigned int size) 221 + static void __fm10k_add_ethtool_stats(u64 **data, void *pointer, 222 + const struct fm10k_stats stats[], 223 + const unsigned int size) 223 224 { 224 225 unsigned int i; 225 226 char *p; ··· 248 249 *((*data)++) = *(u8 *)p; 249 250 break; 250 251 default: 252 + WARN_ONCE(1, "unexpected stat size for %s", 253 + stats[i].stat_string); 251 254 *((*data)++) = 0; 252 255 } 253 256 } 254 257 } 258 + 259 + #define fm10k_add_ethtool_stats(data, pointer, stats) \ 260 + __fm10k_add_ethtool_stats(data, pointer, stats, ARRAY_SIZE(stats)) 255 261 256 262 static void fm10k_get_ethtool_stats(struct net_device *netdev, 257 263 struct ethtool_stats __always_unused *stats, ··· 268 264 269 265 fm10k_update_stats(interface); 270 266 271 - fm10k_add_ethtool_stats(&data, net_stats, fm10k_gstrings_net_stats, 272 - FM10K_NETDEV_STATS_LEN); 267 + fm10k_add_ethtool_stats(&data, net_stats, fm10k_gstrings_net_stats); 273 268 274 - fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats, 275 - FM10K_GLOBAL_STATS_LEN); 269 + fm10k_add_ethtool_stats(&data, interface, fm10k_gstrings_global_stats); 276 270 277 271 fm10k_add_ethtool_stats(&data, &interface->hw.mbx, 278 - fm10k_gstrings_mbx_stats, 279 - FM10K_MBX_STATS_LEN); 272 + fm10k_gstrings_mbx_stats); 280 273 281 274 if (interface->hw.mac.type != fm10k_mac_vf) { 282 275 fm10k_add_ethtool_stats(&data, interface, 283 - fm10k_gstrings_pf_stats, 284 - FM10K_PF_STATS_LEN); 276 + fm10k_gstrings_pf_stats); 285 277 } 286 278 287 279 for (i = 0; i < interface->hw.mac.max_queues; i++) { ··· 285 285 286 286 ring = interface->tx_ring[i]; 287 287 fm10k_add_ethtool_stats(&data, ring, 288 - fm10k_gstrings_queue_stats, 289 - FM10K_QUEUE_STATS_LEN); 288 + fm10k_gstrings_queue_stats); 290 289 291 290 ring = interface->rx_ring[i]; 292 291 fm10k_add_ethtool_stats(&data, ring, 293 - fm10k_gstrings_queue_stats, 294 - FM10K_QUEUE_STATS_LEN); 292 + fm10k_gstrings_queue_stats); 295 293 } 296 294 } 297 295
+54 -8
drivers/net/ethernet/intel/fm10k/fm10k_netdev.c
··· 907 907 static int fm10k_update_vid(struct net_device *netdev, u16 vid, bool set) 908 908 { 909 909 struct fm10k_intfc *interface = netdev_priv(netdev); 910 + struct fm10k_l2_accel *l2_accel = interface->l2_accel; 910 911 struct fm10k_hw *hw = &interface->hw; 912 + u16 glort; 911 913 s32 err; 912 914 int i; 913 915 ··· 976 974 hw->mac.addr, vid, set); 977 975 if (err) 978 976 goto err_out; 977 + 978 + /* Update L2 accelerated macvlan addresses */ 979 + if (l2_accel) { 980 + for (i = 0; i < l2_accel->size; i++) { 981 + struct net_device *sdev = l2_accel->macvlan[i]; 982 + 983 + if (!sdev) 984 + continue; 985 + 986 + glort = l2_accel->dglort + 1 + i; 987 + 988 + fm10k_queue_mac_request(interface, glort, 989 + sdev->dev_addr, 990 + vid, set); 991 + } 992 + } 979 993 980 994 /* set VLAN ID prior to syncing/unsyncing the VLAN */ 981 995 interface->vid = vid + (set ? VLAN_N_VID : 0); ··· 1232 1214 1233 1215 fm10k_queue_mac_request(interface, glort, 1234 1216 hw->mac.addr, vid, true); 1217 + 1218 + /* synchronize macvlan addresses */ 1219 + if (l2_accel) { 1220 + for (i = 0; i < l2_accel->size; i++) { 1221 + struct net_device *sdev = l2_accel->macvlan[i]; 1222 + 1223 + if (!sdev) 1224 + continue; 1225 + 1226 + glort = l2_accel->dglort + 1 + i; 1227 + 1228 + fm10k_queue_mac_request(interface, glort, 1229 + sdev->dev_addr, 1230 + vid, true); 1231 + } 1232 + } 1235 1233 } 1236 1234 1237 1235 /* update xcast mode before synchronizing addresses if host's mailbox ··· 1464 1430 struct fm10k_dglort_cfg dglort = { 0 }; 1465 1431 struct fm10k_hw *hw = &interface->hw; 1466 1432 int size = 0, i; 1467 - u16 glort; 1433 + u16 vid, glort; 1468 1434 1469 1435 /* The hardware supported by fm10k only filters on the destination MAC 1470 1436 * address. In order to avoid issues we only support offloading modes ··· 1537 1503 1538 1504 glort = l2_accel->dglort + 1 + i; 1539 1505 1540 - if (fm10k_host_mbx_ready(interface)) { 1506 + if (fm10k_host_mbx_ready(interface)) 1541 1507 hw->mac.ops.update_xcast_mode(hw, glort, 1542 1508 FM10K_XCAST_MODE_NONE); 1509 + 1510 + fm10k_queue_mac_request(interface, glort, sdev->dev_addr, 1511 + hw->mac.default_vid, true); 1512 + 1513 + for (vid = fm10k_find_next_vlan(interface, 0); 1514 + vid < VLAN_N_VID; 1515 + vid = fm10k_find_next_vlan(interface, vid)) 1543 1516 fm10k_queue_mac_request(interface, glort, sdev->dev_addr, 1544 - hw->mac.default_vid, true); 1545 - } 1517 + vid, true); 1546 1518 1547 1519 fm10k_mbx_unlock(interface); 1548 1520 ··· 1562 1522 struct fm10k_dglort_cfg dglort = { 0 }; 1563 1523 struct fm10k_hw *hw = &interface->hw; 1564 1524 struct net_device *sdev = priv; 1525 + u16 vid, glort; 1565 1526 int i; 1566 - u16 glort; 1567 1527 1568 1528 if (!l2_accel) 1569 1529 return; ··· 1583 1543 1584 1544 glort = l2_accel->dglort + 1 + i; 1585 1545 1586 - if (fm10k_host_mbx_ready(interface)) { 1546 + if (fm10k_host_mbx_ready(interface)) 1587 1547 hw->mac.ops.update_xcast_mode(hw, glort, 1588 1548 FM10K_XCAST_MODE_NONE); 1549 + 1550 + fm10k_queue_mac_request(interface, glort, sdev->dev_addr, 1551 + hw->mac.default_vid, false); 1552 + 1553 + for (vid = fm10k_find_next_vlan(interface, 0); 1554 + vid < VLAN_N_VID; 1555 + vid = fm10k_find_next_vlan(interface, vid)) 1589 1556 fm10k_queue_mac_request(interface, glort, sdev->dev_addr, 1590 - hw->mac.default_vid, false); 1591 - } 1557 + vid, false); 1592 1558 1593 1559 fm10k_mbx_unlock(interface); 1594 1560