i40e/i40evf updates
Subsystems (2)
cover i40e/i40evf updates
Anjali Singhai Jain refactors force_wb and WB_ON_ITR functionality code.
Catherine Sullivan changes vf driver string to reflect all products i40evf supports.
Jesse Brandeburg moves sync_vsi_filters up in service task, doesn't lose interrupts, tries again after failure, dumps descriptor indexes in hex, uses __GFP_NOWARN, bumps version.
Mitch Williams uses pages correctly in rx, uses logical operators, not bitwise, properly shows packet split status in debugfs.
Neerav Parikh makes the DCB firmware checks for X710/XL710 only.
Shannon Nelson sets shared bit for multicast filters, adds VEB stat control and removes L2 cloud filter, uses new add_veb calling with veb stats control.
drivers/net/ethernet/intel/i40e/i40e.h | 23 +- drivers/net/ethernet/intel/i40e/i40e_common.c | 21 +- drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 25 +- drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 11 +- drivers/net/ethernet/intel/i40e/i40e_main.c | 51 +++-- drivers/net/ethernet/intel/i40e/i40e_prototype.h | 6 +- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 249 +++++++++++++------- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 9 +- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 +- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 253 ++++++++++++++------- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 10 +- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 6 +- 12 files changed, 445 insertions(+), 223 deletions(-)
Signature · 1 line
2.1.0
PATCH 1/15 i40e: move sync_vsi_filters up in service_task
From: Jesse Brandeburg <[email protected]>
The sync_vsi_filters function is moved up in the service_task because it may need to request a reset, and we don't want to wait another round of service task time.
NOTE: Filters will be replayed by sync_vsi_filters including broadcast and promiscuous settings.
Also, added some error handling in this space in case any of these fail the driver will retry correctly.
Also update copyright year.
---
Testing Hints: This bug hits a sensitive area of the driver that is used in many different paths such as reset (PFR/CORER/GLOBR) and multicast address add/remove, vlan add/remove, MAC address add/remove. As much testing as possible should be done in the areas of filter add/remove, maximum filter add, etc.
drivers/net/ethernet/intel/i40e/i40e_main.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +6 -1
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -2173,6 +2173,10 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi) } } out: +/* if something went wrong then set the changed flag so we try again */ +if (retval) + vsi->flags |=I40E_VSI_FLAG_FILTER_CHANGED ; +clear_bit (__I40E_CONFIG_BUSY, &vsi->state);return retval; }
@@ -7108,6 +7112,7 @@ static void i40e_service_task(struct work_struct *work) }i40e_detect_recover_hung (pf); +i40e_sync_filters_subtask (pf);i40e_reset_subtask (pf);i40e_handle_mdd_event (pf);i40e_vc_process_vflr_event (pf);
Signature · 1 line
2.1.0
PATCH 2/15 i40e: Make the DCB firmware checks for X710/XL710 only
In reply to Joshua HayFrom: Neerav Parikh <[email protected]>
Make the DCB firmware version related checks specific to X710 and XL710 only. These checks are not required for X722 family of devices.
Introduced an inline routine to help determine if the MAC type is X710/XL710 or not.
Moved the firmware version related checks in i40e_sw_init() and defined flags for different cases
Fix the version check to allow using "Set LLDP MIB" AQ for beyond FVL4 FW releases.
---
Testing Hints:
- LLDP should get disabled on FVL with FVLSW1/2 NVM and no DCB/DCBX functionality should be available
- DCB capability should be enabled for FVL3/4 NVM images
- Once DCB is enabled for FPK builds SW functionally should be same as FVL DCB
drivers/net/ethernet/intel/i40e/i40e.h | 16 ++++++++++++++++ drivers/net/ethernet/intel/i40e/i40e_main.c | 27 ++++++++++++++++++++------- 2 files changed, 36 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +16 -0
@@ -137,6 +137,19 @@/* default to trying for four seconds */ #define I40E_TRY_LINK_TIMEOUT (4 * HZ) +/** +* i40e_is_mac_710 - Return true if MAC is X710/XL710 +* @hw: ptr to the hardware info +**/ +static inline bool i40e_is_mac_710 (struct i40e_hw *hw) +{ +if ((hw->mac.type ==I40E_MAC_X710 ) || + (hw->mac.type ==I40E_MAC_XL710 )) +return true; + +return false; +} +/* driver state flags */ enum i40e_state_t { __I40E_TESTING,
@@ -341,6 +354,9 @@ struct i40e_pf {#define I40E_FLAG_NO_PCI_LINK_CHECK BIT_ULL(42)#define I40E_FLAG_100M_SGMII_CAPABLE BIT_ULL(43)#define I40E_FLAG_RESTART_AUTONEG BIT_ULL(44) +#define I40E_FLAG_NO_DCB_SUPPORT BIT_ULL(45) +#define I40E_FLAG_USE_SET_LLDP_MIB BIT_ULL(46) +#define I40E_FLAG_STOP_FW_LLDP BIT_ULL(47)#define I40E_FLAG_PF_MAC BIT_ULL(50)/* tracks features that get auto disabled by errors */
drivers/net/ethernet/intel/i40e/i40e_main.c +20 -7
@@ -5017,8 +5017,7 @@ static int i40e_init_pf_dcb(struct i40e_pf *pf)int err =0 ;/* Do not enable DCB for SW1 and SW2 images even if the FW is capable */ -if (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <33 )) || - (pf->hw.aq.fw_maj_ver <4 )) +if (pf->flags &I40E_FLAG_NO_DCB_SUPPORT ) goto out;/* Get the initial DCB configuration */
@@ -8422,11 +8421,25 @@ static int i40e_sw_init(struct i40e_pf *pf) pf->hw.func_caps.fd_filters_best_effort; } -if (((pf->hw.mac.type ==I40E_MAC_X710 ) || - (pf->hw.mac.type ==I40E_MAC_XL710 )) && +if (i40e_is_mac_710 (&pf->hw) && (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <33 )) || - (pf->hw.aq.fw_maj_ver <4 ))) + (pf->hw.aq.fw_maj_ver <4 ))) { pf->flags |=I40E_FLAG_RESTART_AUTONEG ; +/* No DCB support for FW < v4.33 */ + pf->flags |=I40E_FLAG_NO_DCB_SUPPORT ; + } + +/* Disable FW LLDP if FW < v4.3 */ +if (i40e_is_mac_710 (&pf->hw) && + (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <3 )) || + (pf->hw.aq.fw_maj_ver <4 ))) + pf->flags |=I40E_FLAG_STOP_FW_LLDP ; + +/* Use the FW Set LLDP MIB API if FW > v4.40 */ +if (i40e_is_mac_710 (&pf->hw) && + (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver >=40 )) || + (pf->hw.aq.fw_maj_ver >=5 ))) + pf->flags |=I40E_FLAG_USE_SET_LLDP_MIB ;if (pf->hw.func_caps.vmdq) { pf->num_vmdq_vsis =I40E_DEFAULT_NUM_VMDQ_VSI ;
@@ -8455,6 +8468,7 @@ static int i40e_sw_init(struct i40e_pf *pf)I40E_FLAG_WB_ON_ITR_CAPABLE |I40E_FLAG_MULTIPLE_TCP_UDP_RSS_PCTYPE |I40E_FLAG_100M_SGMII_CAPABLE | +I40E_FLAG_USE_SET_LLDP_MIB |I40E_FLAG_GENEVE_OFFLOAD_CAPABLE ; } pf->eeprom_version =0xDEAD ;
@@ -10840,8 +10854,7 @@ static int i40e_probe(struct pci_dev *pdev, const struct pci_device_id *ent)* Ignore error return codes because if it was already disabled via * hardware settings this will fail */ -if (((pf->hw.aq.fw_maj_ver ==4 ) && (pf->hw.aq.fw_min_ver <3 )) || - (pf->hw.aq.fw_maj_ver <4 )) { +if (pf->flags &I40E_FLAG_STOP_FW_LLDP ) {dev_info (&pdev->dev,"Stopping firmware LLDP agent.\n" );i40e_aq_stop_lldp (hw, true,NULL ); }
Signature · 1 line
2.1.0
PATCH 3/15 i40e: set shared bit for multicast filters
In reply to Joshua HayFrom: Shannon Nelson <[email protected]>
Add the use of the new Shared MAC filter bit for multicast and broadcast filters in order to make better use of the filters available from the device. The FW folks have assured me that setting this bit on older FW will have no affect, so we don't need a version check.
Also fixed a stray indent problem nearby.
Also update copyright year.
---
Testing Hints (required if no HSD):
Disable link polling: ethtool --set-priv-flags p261p1 LinkPolling off Eanble AQ debug: ethtool -s p261p1 msglvl 0xff00000f
Add a new vlan: ip link add link p261p1 name p261p1.v10 type vlan id 10
This will generate an add macvlan request and dump the trace in dmesg. Make sure that the value in byte 8 for multicast and broadcast addresses is '11' as shown here:
14594.033921] i40e 00.0 0x0010 FF FF FF FF FF FF 0A 00 11 00 00 00 00 00 00 00
and should be '01' for unicast address. If running on older firmware, e.g. FVL4, this byte will always be '01'.
drivers/net/ethernet/intel/i40e/i40e_common.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_common.c +8 -2
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -2463,6 +2463,7 @@ i40e_status i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid, (struct i40e_aqc_macvlan *)&desc.params.raw;i40e_status status;u16 buf_size; +int i;if (count ==0 || !mv_list || !hw)return I40E_ERR_PARAM ;
@@ -2476,12 +2477,17 @@ i40e_status i40e_aq_add_macvlan(struct i40e_hw *hw, u16 seid, cmd->seid[1 ] =0 ; cmd->seid[2 ] =0 ; +for (i =0 ; i < count; i++) +if (is_multicast_ether_addr (mv_list[i].mac_addr)) + mv_list[i].flags |= +cpu_to_le16 (I40E_AQC_MACVLAN_ADD_USE_SHARED_MAC ); + desc.flags |=cpu_to_le16 ((u16)(I40E_AQ_FLAG_BUF |I40E_AQ_FLAG_RD ));if (buf_size >I40E_AQ_LARGE_BUF ) desc.flags |=cpu_to_le16 ((u16 )I40E_AQ_FLAG_LB ); status =i40e_asq_send_command (hw, &desc, mv_list, buf_size, - cmd_details); + cmd_details);return status; }
Signature · 1 line
2.1.0
PATCH 4/15 i40e: add VEB stat control and remove L2 cloud filter
In reply to Joshua HayFrom: Shannon Nelson <[email protected]>
With the latest firmware, statistics gathering can now be enabled and disabled in the HW switch, so we need to add a parameter to allow the driver to set it as desired. At the same time, the L2 cloud filtering parameter has been removed as it was never used.
Older drivers working with the newer firmware and newer drivers working with older firmware will not run into problems with these bits as the defaults are reasonable and there is no overlap in the bit definitions. Also, newer drivers will be forced to update because of the change in function call parameters, a reminder that the functionality exists.
Also update copyright year.
---
Testing Hints: Testing hints will be driver dependent, see the related base driver changes.
drivers/net/ethernet/intel/i40e/i40e_common.c | 11 ++++++----- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- drivers/net/ethernet/intel/i40e/i40e_prototype.h | 6 +++--- 3 files changed, 10 insertions(+), 9 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_common.c +6 -5
@@ -2336,8 +2336,8 @@ i40e_status i40e_update_link_info(struct i40e_hw *hw)* @downlink_seid: the VSI SEID * @enabled_tc: bitmap of TCs to be enabled * @default_port: true for default port VSI, false for control port -* @enable_l2_filtering: true to add L2 filter table rules to regular forwarding rules for cloud support * @veb_seid: pointer to where to put the resulting VEB SEID +* @enable_stats: true to turn on VEB stats * @cmd_details: pointer to command details structure or NULL * * This asks the FW to add a VEB between the uplink and downlink
@@ -2345,8 +2345,8 @@ i40e_status i40e_update_link_info(struct i40e_hw *hw)**/ i40e_status i40e_aq_add_veb (struct i40e_hw *hw,u16 uplink_seid,u16 downlink_seid,u8 enabled_tc, -bool default_port,bool enable_l2_filtering, -u16 *veb_seid, +bool default_port,u16 *veb_seid, +bool enable_stats,struct i40e_asq_cmd_details *cmd_details) {struct i40e_aq_desc desc;
@@ -2373,8 +2373,9 @@ i40e_status i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,else veb_flags |=I40E_AQC_ADD_VEB_PORT_TYPE_DATA ; -if (enable_l2_filtering) - veb_flags |=I40E_AQC_ADD_VEB_ENABLE_L2_FILTER ; +/* reverse logic here: set the bitflag to disable the stats */ +if (!enable_stats) + veb_flags |=I40E_AQC_ADD_VEB_ENABLE_DISABLE_STATS ; cmd->veb_flags =cpu_to_le16 (veb_flags);
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -10062,7 +10062,7 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi)/* get a VEB from the hardware */ ret =i40e_aq_add_veb (&pf->hw, veb->uplink_seid, vsi->seid, veb->enabled_tc, is_default, - is_cloud, &veb->seid,NULL ); + &veb->seid, is_cloud,NULL );if (ret) { dev_info(&pf->pdev->dev, "couldn't add VEB, err %s aq_err %s\n",
drivers/net/ethernet/intel/i40e/i40e_prototype.h +3 -3
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -138,8 +138,8 @@ i40e_status i40e_aq_update_vsi_params(struct i40e_hw *hw, struct i40e_asq_cmd_details *cmd_details);i40e_status i40e_aq_add_veb (struct i40e_hw *hw,u16 uplink_seid,u16 downlink_seid,u8 enabled_tc, -bool default_port,bool enable_l2_filtering, -u16 *pveb_seid, +bool default_port,u16 *pveb_seid, +bool enable_stats,struct i40e_asq_cmd_details *cmd_details); i40e_status i40e_aq_get_veb_parameters(struct i40e_hw *hw, u16 veb_seid, u16 *switch_id, bool *floating,
Signature · 1 line
2.1.0
PATCH 5/15 i40e: use new add_veb calling with veb stats control
In reply to Joshua HayFrom: Shannon Nelson <[email protected]>
The new parameters for add_veb allow us to enable and disable VEB stats, so let's use them.
Also update copyright year.
---
Testing Hints: These commands should now do something useful:
ethtool --set-priv-flags eth0 veb-stats on ethtool --set-priv-flags eth0 veb-stats off
drivers/net/ethernet/intel/i40e/i40e_ethtool.c | 11 ++++++++--- drivers/net/ethernet/intel/i40e/i40e_main.c | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_ethtool.c +8 -3
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -2782,10 +2782,15 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags) pf->auto_disable_flags |=I40E_FLAG_FD_ATR_ENABLED ; } -if (flags &I40E_PRIV_FLAGS_VEB_STATS ) +if ((flags &I40E_PRIV_FLAGS_VEB_STATS ) && + !(pf->flags &I40E_FLAG_VEB_STATS_ENABLED )) { pf->flags |=I40E_FLAG_VEB_STATS_ENABLED ; -else + reset_required = true; + }else if (!(flags &I40E_PRIV_FLAGS_VEB_STATS ) && + (pf->flags &I40E_FLAG_VEB_STATS_ENABLED )) { pf->flags &= ~I40E_FLAG_VEB_STATS_ENABLED ; + reset_required = true; + }/* if needed, issue reset to cause things to take effect */ if (reset_required)
drivers/net/ethernet/intel/i40e/i40e_main.c +2 -2
@@ -10056,13 +10056,13 @@ static int i40e_add_veb(struct i40e_veb *veb, struct i40e_vsi *vsi) {struct i40e_pf *pf = veb->pf;bool is_default = veb->pf->cur_promisc; -bool is_cloud = false; +bool enable_stats = !!(pf->flags &I40E_FLAG_VEB_STATS_ENABLED );int ret;/* get a VEB from the hardware */ ret =i40e_aq_add_veb (&pf->hw, veb->uplink_seid, vsi->seid, veb->enabled_tc, is_default, - &veb->seid, is_cloud,NULL ); + &veb->seid, enable_stats,NULL );if (ret) { dev_info(&pf->pdev->dev, "couldn't add VEB, err %s aq_err %s\n",
Signature · 1 line
2.1.0
PATCH 6/15 i40e: Refactor force_wb and WB_ON_ITR functionality code
In reply to Joshua HayFrom: Anjali Singhai Jain <[email protected]>
Now that the Force-WriteBack functionality in X710/XL710 devices has been moved out of the clean routine and into the service task, we need to make sure WriteBack-On-ITR is separated out since it is still called from clean.
In the X722 devices, Force-WriteBack implies WriteBack-On-ITR but without the interrupt, which put the driver into a missed interrupt scenario and a potential tx-timeout report.
With this patch, we break the two functions out, and call the appropriate ones at the right place. This will avoid creating missed interrupt like scenarios for X722 devices.
Also update copyright year in file headers.
---
Testing Hints: Stress test X722 devices for tx_timeout, see that the tx_lost_interrupt stat count goes down with the patch applied.
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 57 ++++++++++++++---------- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 63 +++++++++++++++------------ drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 3 +- 3 files changed, 72 insertions(+), 51 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +34 -23
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2014 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -774,37 +774,48 @@ static bool i40e_clean_tx_irq(struct i40e_ring *tx_ring, int budget) }/** -* i40e_force_wb - Arm hardware to do a wb on noncache aligned descriptors +* i40e_enable_wb_on_itr - Arm hardware to do a wb, interrupts are not enabled * @vsi: the VSI we care about -* @q_vector: the vector on which to force writeback +* @q_vector: the vector on which to enable writeback * **/ -void i40e_force_wb (struct i40e_vsi *vsi,struct i40e_q_vector *q_vector) +static void i40e_enable_wb_on_itr (struct i40e_vsi *vsi, +struct i40e_q_vector *q_vector) {u16 flags = q_vector->tx.ring[0 ].flags; +u32 val; -if (flags &I40E_TXR_FLAGS_WB_ON_ITR ) { -u32 val; +if (!(flags &I40E_TXR_FLAGS_WB_ON_ITR )) +return ; -if (q_vector->arm_wb_state) -return ; +if (q_vector->arm_wb_state) +return ; -if (vsi->back->flags &I40E_FLAG_MSIX_ENABLED ) { - val =I40E_PFINT_DYN_CTLN_WB_ON_ITR_MASK | -I40E_PFINT_DYN_CTLN_ITR_INDX_MASK ;/* set noitr */ +if (vsi->back->flags &I40E_FLAG_MSIX_ENABLED ) { + val =I40E_PFINT_DYN_CTLN_WB_ON_ITR_MASK | +I40E_PFINT_DYN_CTLN_ITR_INDX_MASK ;/* set noitr */ -wr32 (&vsi->back->hw, -I40E_PFINT_DYN_CTLN (q_vector->v_idx + - vsi->base_vector -1 ), - val); - }else { - val =I40E_PFINT_DYN_CTL0_WB_ON_ITR_MASK | -I40E_PFINT_DYN_CTL0_ITR_INDX_MASK ;/* set noitr */ +wr32 (&vsi->back->hw, +I40E_PFINT_DYN_CTLN (q_vector->v_idx + vsi->base_vector -1 ), + val); + }else { + val =I40E_PFINT_DYN_CTL0_WB_ON_ITR_MASK | +I40E_PFINT_DYN_CTL0_ITR_INDX_MASK ;/* set noitr */ -wr32 (&vsi->back->hw,I40E_PFINT_DYN_CTL0 , val); - } - q_vector->arm_wb_state = true; - }else if (vsi->back->flags &I40E_FLAG_MSIX_ENABLED ) { +wr32 (&vsi->back->hw,I40E_PFINT_DYN_CTL0 , val); + } + q_vector->arm_wb_state = true; +} + +/** +* i40e_force_wb - Issue SW Interrupt so HW does a wb +* @vsi: the VSI we care about +* @q_vector: the vector on which to force writeback +* +**/ +void i40e_force_wb (struct i40e_vsi *vsi,struct i40e_q_vector *q_vector) +{ +if (vsi->back->flags &I40E_FLAG_MSIX_ENABLED ) {u32 val =I40E_PFINT_DYN_CTLN_INTENA_MASK |I40E_PFINT_DYN_CTLN_ITR_INDX_MASK |/* set noitr */ I40E_PFINT_DYN_CTLN_SWINT_TRIG_MASK |
@@ -1946,7 +1957,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) tx_only:if (arm_wb) { q_vector->tx.ring[0 ].tx_stats.tx_force_wb++; -i40e_force_wb (vsi, q_vector); +i40e_enable_wb_on_itr (vsi, q_vector); }return budget; }
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +36 -27
90 lines not on this page · raw message
drivers/net/ethernet/intel/i40evf/i40e_txrx.h +2 -1
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver -* Copyright(c) 2013 - 2014 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -324,6 +324,7 @@ int i40evf_setup_rx_descriptors(struct i40e_ring *rx_ring);void i40evf_free_tx_resources (struct i40e_ring *tx_ring);void i40evf_free_rx_resources (struct i40e_ring *rx_ring);int i40evf_napi_poll (struct napi_struct *napi,int budget); +void i40evf_force_wb (struct i40e_vsi *vsi,struct i40e_q_vector *q_vector);u32 i40evf_get_tx_pending (struct i40e_ring *ring);/**
Signature · 1 line
2.1.0
PATCH 7/15 i40evf: Change vf driver string to reflect all products i40evf supports
In reply to Joshua HayFrom: Catherine Sullivan <[email protected]>
Change the driver string to 40-10 Gigabit instead of XL710/X710 for X722 and all future products.
Also update copyright year in file header.
---
Testing Hints: Make sure the new driver string is in dmesg upon driver load.
drivers/net/ethernet/intel/i40evf/i40evf_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40evf/i40evf_main.c +2 -2
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Virtual Function Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -32,7 +32,7 @@ static int i40evf_close(struct net_device *netdev);char i40evf_driver_name[] ="i40evf" ;static const char i40evf_driver_string[] = -"Intel(R) XL710/X710 Virtual Function Network Driver" ; +"Intel(R) 40-10 Gigabit Virtual Function Network Driver" ;#define DRV_KERN "-k"
Signature · 1 line
2.1.0
PATCH 8/15 i40e/i40evf: don't lose interrupts
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
While re-enabling interrupts the driver would clear all pending causes. This meant that if an interrupt was generated while the driver was cleaning or polling with interrupts disabled, then that interrupt was lost. This could cause a queue to become dead, especially for receive. Refactored the enable_icr0 function in order to allow it to be decided by the caller whether the CLEARPBA (clear pending events) bit will be set while re-enabling the interrupt.
Also update copyright year in file headers.
---
Testing Hints: use pktgen or a traffic generator to send packets to the device and force it to enter polling. If all queues are in use, usually a few of the queues will quit receiving.
drivers/net/ethernet/intel/i40e/i40e.h | 7 +++++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 11 ++++++----- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 6 ++++-- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 ++-- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 4 +++- 5 files changed, 20 insertions(+), 12 deletions(-)
drivers/net/ethernet/intel/i40e/i40e.h +5 -2
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -766,6 +766,9 @@ static inline void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector)struct i40e_hw *hw = &pf->hw;u32 val; +/* definitely clear the PBA here, as this function is meant to +* clean out all previous interrupts AND enable the interrupt +*/ val =I40E_PFINT_DYN_CTLN_INTENA_MASK |I40E_PFINT_DYN_CTLN_CLEARPBA_MASK | (I40E_ITR_NONE <<I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT );
@@ -774,7 +777,7 @@ static inline void i40e_irq_dynamic_enable(struct i40e_vsi *vsi, int vector) }void i40e_irq_dynamic_disable_icr0 (struct i40e_pf *pf); -void i40e_irq_dynamic_enable_icr0 (struct i40e_pf *pf); +void i40e_irq_dynamic_enable_icr0 (struct i40e_pf *pf,bool clearpba);#ifdef I40E_FCOE struct rtnl_link_stats64 *i40e_get_netdev_stats_struct( struct net_device *netdev,
drivers/net/ethernet/intel/i40e/i40e_main.c +6 -5
@@ -3262,14 +3262,15 @@ void i40e_irq_dynamic_disable_icr0(struct i40e_pf *pf)/** * i40e_irq_dynamic_enable_icr0 - Enable default interrupt generation for icr0 * @pf: board private structure +* @clearpba: true when all pending interrupt events should be cleared **/ -void i40e_irq_dynamic_enable_icr0 (struct i40e_pf *pf) +void i40e_irq_dynamic_enable_icr0 (struct i40e_pf *pf,bool clearpba) {struct i40e_hw *hw = &pf->hw;u32 val; val =I40E_PFINT_DYN_CTL0_INTENA_MASK | -I40E_PFINT_DYN_CTL0_CLEARPBA_MASK | + (clearpba ?I40E_PFINT_DYN_CTL0_CLEARPBA_MASK :0 ) | (I40E_ITR_NONE <<I40E_PFINT_DYN_CTL0_ITR_INDX_SHIFT );wr32 (hw,I40E_PFINT_DYN_CTL0 , val);
@@ -3401,7 +3402,7 @@ static int i40e_vsi_enable_irq(struct i40e_vsi *vsi)for (i =0 ; i < vsi->num_q_vectors; i++)i40e_irq_dynamic_enable (vsi, i); }else { -i40e_irq_dynamic_enable_icr0 (pf); +i40e_irq_dynamic_enable_icr0 (pf, true); }i40e_flush (&pf->hw);
@@ -3547,7 +3548,7 @@ enable_intr:wr32 (hw,I40E_PFINT_ICR0_ENA , ena_mask);if (!test_bit (__I40E_DOWN, &pf->state)) {i40e_service_event_schedule (pf); -i40e_irq_dynamic_enable_icr0 (pf); +i40e_irq_dynamic_enable_icr0 (pf, false); }return ret;
@@ -7855,7 +7856,7 @@ static int i40e_setup_misc_vector(struct i40e_pf *pf)i40e_flush (hw); -i40e_irq_dynamic_enable_icr0 (pf); +i40e_irq_dynamic_enable_icr0 (pf, true);return err; }
drivers/net/ethernet/intel/i40e/i40e_txrx.c +4 -2
@@ -1810,7 +1810,9 @@ static u32 i40e_buildreg_itr(const int type, const u16 itr)u32 val; val =I40E_PFINT_DYN_CTLN_INTENA_MASK | -I40E_PFINT_DYN_CTLN_CLEARPBA_MASK | +/* Don't clear PBA because that can cause lost interrupts that +* came in while we were cleaning/polling +*/ (type <<I40E_PFINT_DYN_CTLN_ITR_INDX_SHIFT ) | (itr <<I40E_PFINT_DYN_CTLN_INTERVAL_SHIFT );
@@ -1983,7 +1985,7 @@ tx_only: qval =rd32 (hw,I40E_QINT_TQCTL (0 )) |I40E_QINT_TQCTL_CAUSE_ENA_MASK ;wr32 (hw,I40E_QINT_TQCTL (0 ), qval); -i40e_irq_dynamic_enable_icr0 (vsi->back); +i40e_irq_dynamic_enable_icr0 (vsi->back, false); }return 0 ; }
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +2 -2
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2015 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -980,7 +980,7 @@ err_alloc:i40e_free_vfs (pf); err_iov:/* Re-enable interrupt 0. */ -i40e_irq_dynamic_enable_icr0 (pf); +i40e_irq_dynamic_enable_icr0 (pf, false);return ret; }
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +3 -1
@@ -1248,7 +1248,9 @@ static u32 i40e_buildreg_itr(const int type, const u16 itr)u32 val; val =I40E_VFINT_DYN_CTLN1_INTENA_MASK | -I40E_VFINT_DYN_CTLN1_CLEARPBA_MASK | +/* Don't clear PBA because that can cause lost interrupts that +* came in while we were cleaning/polling +*/ (type <<I40E_VFINT_DYN_CTLN1_ITR_INDX_SHIFT ) | (itr <<I40E_VFINT_DYN_CTLN1_INTERVAL_SHIFT );
Signature · 1 line
2.1.0
Bowers
PATCH 8/15 i40e/i40evf: don't lose interrupts
Quoted 27 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Monday, January 11, 2016 3:18 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S27 08/15] i40e/i40evf: don't lose interruptsFrom: Jesse Brandeburg <[email protected]>
While re-enabling interrupts the driver would clear all pending causes. This meant that if an interrupt was generated while the driver was cleaning or polling with interrupts disabled, then that interrupt was lost. This could cause a queue to become dead, especially for receive. Refactored the
enable_icr0function in order to allow it to be decided by the caller whether the CLEARPBA (clear pending
events) bit will be set while re-enabling the interrupt.Also update copyright year in file headers.
Signed-off-by Jesse Brandeburg <[email protected]>Change-ID Ic1db100a05e13c98919057696db147a258ca365a---
Testing Hints: use pktgen or a traffic generator to send packets to the device and force it to enter polling. If all queues are in use, usually a few of the queues will quit receiving.
Quoted 6 lines
drivers/net/ethernet/intel/i40e/i40e.h | 7 +++++-- drivers/net/ethernet/intel/i40e/i40e_main.c | 11 ++++++----- drivers/net/ethernet/intel/i40e/i40e_txrx.c | 6 ++++-- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 ++-- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 4 +++- 5 files changed, 20 insertions(+), 12 deletions(-)
Patch code changes correctly applied, queues don't drop when hammered with traffic
PATCH 9/15 i40e/i40evf: try again after failure
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
This is the "Don't Give Up" patch. Previously the driver could fail an allocation, and then possibly stall a queue forever, by never coming back to continue receiving or allocating buffers.
With this patch, the driver will keep polling trying to allocate receive buffers until it succeeds. This should keep all receive queues running even in the face of memory pressure.
Also update copyright year in file header.
---
Testing Hints: Load RHEL 7.1 -229 default kernel with firewall enabled, and receive more packets per second than the kernel can handle (indicating drops) and observe that kernel starts printing OOM errors. After OOM errors, stop incoming traffic and make sure all rx queues are still active/working.
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 51 ++++++++++++++++++++++----- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 6 ++-- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 51 ++++++++++++++++++++++----- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 4 +-- 4 files changed, 89 insertions(+), 23 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +42 -9
@@ -1195,8 +1195,10 @@ static inline void i40e_release_rx_desc(struct i40e_ring *rx_ring, u32 val)* i40e_alloc_rx_buffers_ps - Replace used receive buffers; packet split * @rx_ring: ring to place buffers on * @cleaned_count: number of buffers to replace +* +* Returns true if any errors on allocation **/ -void i40e_alloc_rx_buffers_ps (struct i40e_ring *rx_ring,u16 cleaned_count) +bool i40e_alloc_rx_buffers_ps (struct i40e_ring *rx_ring,u16 cleaned_count) {u16 i = rx_ring->next_to_use;union i40e_rx_desc *rx_desc;
@@ -1204,7 +1206,7 @@ void i40e_alloc_rx_buffers_ps(struct i40e_ring *rx_ring, u16 cleaned_count)/* do nothing if no valid netdev defined */ if (!rx_ring->netdev || !cleaned_count) -return ; +return false;while (cleaned_count--) { rx_desc =I40E_RX_DESC (rx_ring, i);
@@ -1251,17 +1253,29 @@ void i40e_alloc_rx_buffers_ps(struct i40e_ring *rx_ring, u16 cleaned_count) i =0 ; } +if (rx_ring->next_to_use != i) +i40e_release_rx_desc (rx_ring, i); + +return false; + no_buffers:if (rx_ring->next_to_use != i)i40e_release_rx_desc (rx_ring, i); + +/* make sure to come back via polling to try again after +* allocation failure +*/ +return true; }/** * i40e_alloc_rx_buffers_1buf - Replace used receive buffers; single buffer * @rx_ring: ring to place buffers on * @cleaned_count: number of buffers to replace +* +* Returns true if any errors on allocation **/ -void i40e_alloc_rx_buffers_1buf (struct i40e_ring *rx_ring,u16 cleaned_count) +bool i40e_alloc_rx_buffers_1buf (struct i40e_ring *rx_ring,u16 cleaned_count) {u16 i = rx_ring->next_to_use;union i40e_rx_desc *rx_desc;
@@ -1270,7 +1284,7 @@ void i40e_alloc_rx_buffers_1buf(struct i40e_ring *rx_ring, u16 cleaned_count)/* do nothing if no valid netdev defined */ if (!rx_ring->netdev || !cleaned_count) -return ; +return false;while (cleaned_count--) { rx_desc =I40E_RX_DESC (rx_ring, i);
@@ -1297,6 +1311,8 @@ void i40e_alloc_rx_buffers_1buf(struct i40e_ring *rx_ring, u16 cleaned_count)if (dma_mapping_error (rx_ring->dev, bi->dma)) { rx_ring->rx_stats.alloc_buff_failed++; bi->dma =0 ; +dev_kfree_skb (bi->skb); + bi->skb =NULL ; goto no_buffers; } }
@@ -1308,9 +1324,19 @@ void i40e_alloc_rx_buffers_1buf(struct i40e_ring *rx_ring, u16 cleaned_count) i =0 ; } +if (rx_ring->next_to_use != i) +i40e_release_rx_desc (rx_ring, i); + +return false; + no_buffers:if (rx_ring->next_to_use != i)i40e_release_rx_desc (rx_ring, i); + +/* make sure to come back via polling to try again after +* allocation failure +*/ +return true; }/**
@@ -1494,7 +1520,7 @@ static inline void i40e_rx_hash(struct i40e_ring *ring,* * Returns true if there's any budget left (e.g. the clean is finished) **/ -static int i40e_clean_rx_irq_ps (struct i40e_ring *rx_ring,int budget) +static int i40e_clean_rx_irq_ps (struct i40e_ring *rx_ring,const int budget) {unsigned int total_rx_bytes =0 , total_rx_packets =0 ;u16 rx_packet_len, rx_header_len, rx_sph, rx_hbo;
@@ -1504,6 +1530,7 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget)u16 i = rx_ring->next_to_clean;union i40e_rx_desc *rx_desc;u32 rx_error, rx_status; +bool failure = false;u8 rx_ptype;u64 qword;
@@ -1516,7 +1543,9 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget)u16 vlan_tag;/* return some buffers to hardware, one at a time is too slow */ if (cleaned_count >=I40E_RX_BUFFER_WRITE ) { -i40e_alloc_rx_buffers_ps (rx_ring, cleaned_count); + failure = failure || +i40e_alloc_rx_buffers_ps (rx_ring, + cleaned_count); cleaned_count =0 ; }
@@ -1546,6 +1575,7 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget) rx_ring->rx_hdr_len);if (!skb) { rx_ring->rx_stats.alloc_buff_failed++; + failure = true;break ; }
@@ -1675,7 +1705,7 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, int budget) rx_ring->q_vector->rx.total_packets += total_rx_packets; rx_ring->q_vector->rx.total_bytes += total_rx_bytes; -return total_rx_packets; +return failure ? budget : total_rx_packets; }/**
@@ -1693,6 +1723,7 @@ static int i40e_clean_rx_irq_1buf(struct i40e_ring *rx_ring, int budget)union i40e_rx_desc *rx_desc;u32 rx_error, rx_status;u16 rx_packet_len; +bool failure = false;u8 rx_ptype;u64 qword;u16 i;
@@ -1703,7 +1734,9 @@ static int i40e_clean_rx_irq_1buf(struct i40e_ring *rx_ring, int budget)u16 vlan_tag;/* return some buffers to hardware, one at a time is too slow */ if (cleaned_count >=I40E_RX_BUFFER_WRITE ) { -i40e_alloc_rx_buffers_1buf (rx_ring, cleaned_count); + failure = failure || +i40e_alloc_rx_buffers_1buf (rx_ring, + cleaned_count); cleaned_count =0 ; }
@@ -1802,7 +1835,7 @@ static int i40e_clean_rx_irq_1buf(struct i40e_ring *rx_ring, int budget) rx_ring->q_vector->rx.total_packets += total_rx_packets; rx_ring->q_vector->rx.total_bytes += total_rx_bytes; -return total_rx_packets; +return failure ? budget : total_rx_packets; }static u32 i40e_buildreg_itr (const int type,const u16 itr)
drivers/net/ethernet/intel/i40e/i40e_txrx.h +3 -3
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2014 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -316,8 +316,8 @@ struct i40e_ring_container {#define i40e_for_each_ring (pos, head) \ for (pos = (head).ring; pos != NULL; pos = pos->next) -void i40e_alloc_rx_buffers_ps (struct i40e_ring *rxr,u16 cleaned_count); -void i40e_alloc_rx_buffers_1buf (struct i40e_ring *rxr,u16 cleaned_count); +bool i40e_alloc_rx_buffers_ps (struct i40e_ring *rxr,u16 cleaned_count); +bool i40e_alloc_rx_buffers_1buf (struct i40e_ring *rxr,u16 cleaned_count);void i40e_alloc_rx_headers (struct i40e_ring *rxr);netdev_tx_t i40e_lan_xmit_frame (struct sk_buff *skb,struct net_device *netdev);void i40e_clean_tx_ring (struct i40e_ring *tx_ring);
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +42 -9
149 lines not on this page · raw message
drivers/net/ethernet/intel/i40evf/i40e_txrx.h +2 -2
@@ -313,8 +313,8 @@ struct i40e_ring_container {#define i40e_for_each_ring (pos, head) \ for (pos = (head).ring; pos != NULL; pos = pos->next) -void i40evf_alloc_rx_buffers_ps (struct i40e_ring *rxr,u16 cleaned_count); -void i40evf_alloc_rx_buffers_1buf (struct i40e_ring *rxr,u16 cleaned_count); +bool i40evf_alloc_rx_buffers_ps (struct i40e_ring *rxr,u16 cleaned_count); +bool i40evf_alloc_rx_buffers_1buf (struct i40e_ring *rxr,u16 cleaned_count);void i40evf_alloc_rx_headers (struct i40e_ring *rxr);netdev_tx_t i40evf_xmit_frame (struct sk_buff *skb,struct net_device *netdev);void i40evf_clean_tx_ring (struct i40e_ring *tx_ring);
Signature · 1 line
2.1.0
PATCH 10/15 i40e: dump descriptor indexes in hex
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
The debugging helpers for showing descriptor rings were dumping the indexes in decimal and the offsets in hex.
Put everything in hex and at least be consistent.
Also update copyright year in file header.
---
Testing Hints: echo dump desc rx <vsi> 0 > command
drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +7 -7
@@ -1,7 +1,7 @@/******************************************************************************* * * Intel Ethernet Controller XL710 Family Linux Driver -* Copyright(c) 2013 - 2014 Intel Corporation. +* Copyright(c) 2013 - 2016 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License,
@@ -825,20 +825,20 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,if (!is_rx_ring) { txd =I40E_TX_DESC (ring, i);dev_info (&pf->pdev->dev, -" d[%03i] = 0x%016llx 0x%016llx\n" , +" d[%03x] = 0x%016llx 0x%016llx\n" , i, txd->buffer_addr, txd->cmd_type_offset_bsz); }else if (sizeof (union i40e_rx_desc ) ==sizeof (union i40e_16byte_rx_desc )) { rxd =I40E_RX_DESC (ring, i);dev_info (&pf->pdev->dev, -" d[%03i] = 0x%016llx 0x%016llx\n" , +" d[%03x] = 0x%016llx 0x%016llx\n" , i, rxd->read.pkt_addr, rxd->read.hdr_addr); }else { rxd =I40E_RX_DESC (ring, i);dev_info (&pf->pdev->dev, -" d[%03i] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n" , +" d[%03x] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n" , i, rxd->read.pkt_addr, rxd->read.hdr_addr, rxd->read.rsvd1, rxd->read.rsvd2);
@@ -853,20 +853,20 @@ static void i40e_dbg_dump_desc(int cnt, int vsi_seid, int ring_id, int desc_n,if (!is_rx_ring) { txd =I40E_TX_DESC (ring, desc_n);dev_info (&pf->pdev->dev, -"vsi = %02i tx ring = %02i d[%03i] = 0x%016llx 0x%016llx\n" , +"vsi = %02i tx ring = %02i d[%03x] = 0x%016llx 0x%016llx\n" , vsi_seid, ring_id, desc_n, txd->buffer_addr, txd->cmd_type_offset_bsz); }else if (sizeof (union i40e_rx_desc ) ==sizeof (union i40e_16byte_rx_desc )) { rxd =I40E_RX_DESC (ring, desc_n);dev_info (&pf->pdev->dev, -"vsi = %02i rx ring = %02i d[%03i] = 0x%016llx 0x%016llx\n" , +"vsi = %02i rx ring = %02i d[%03x] = 0x%016llx 0x%016llx\n" , vsi_seid, ring_id, desc_n, rxd->read.pkt_addr, rxd->read.hdr_addr); }else { rxd =I40E_RX_DESC (ring, desc_n);dev_info (&pf->pdev->dev, -"vsi = %02i rx ring = %02i d[%03i] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n" , +"vsi = %02i rx ring = %02i d[%03x] = 0x%016llx 0x%016llx 0x%016llx 0x%016llx\n" , vsi_seid, ring_id, desc_n, rxd->read.pkt_addr, rxd->read.hdr_addr, rxd->read.rsvd1, rxd->read.rsvd2);
Signature · 1 line
2.1.0
Bowers
PATCH 10/15 i40e: dump descriptor indexes in hex
Quoted 17 lines
-----Original Message-----
From: Intel-wired-lan [mailto:intel-wired-lan-bounces at lists.osuosl.org] On Behalf Of Joshua Hay
Sent: Monday, January 11, 2016 3:18 PM
To: intel-wired-lan at lists.osuosl.org
Subject: [Intel-wired-lan] [next PATCH S27 10/15] i40e: dump descriptor indexes in hexFrom: Jesse Brandeburg <[email protected]>
The debugging helpers for showing descriptor rings were dumping the indexes in decimal and the offsets in hex.
Put everything in hex and at least be consistent.
Also update copyright year in file header.
Quoted 7 lines
Signed-off-by Jesse Brandeburg <[email protected]>Change-ID Ia35a21411a2ddb713772dffb4e8718889fcfc895---
Testing Hints: echo dump desc rx <vsi> 0 > commanddrivers/net/ethernet/intel/i40e/i40e_debugfs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
Patch code changes correctly applied, dump is entirely in hexadecimal
PATCH 11/15 i40e/i40evf: use __GFP_NOWARN
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
The i40e and i40evf drivers now cleanly handle allocation failures and can avoid kernel log spew from the memory allocator when allocations fail, so set __GFP_NOWARN on rx buffer alloc.
---
Testing Hints: compile everywhere
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 12 ++++++++---- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +8 -4
@@ -1292,8 +1292,10 @@ bool i40e_alloc_rx_buffers_1buf(struct i40e_ring *rx_ring, u16 cleaned_count) skb = bi->skb;if (!skb) { - skb =netdev_alloc_skb_ip_align (rx_ring->netdev, - rx_ring->rx_buf_len); + skb =__netdev_alloc_skb_ip_align (rx_ring->netdev, + rx_ring->rx_buf_len, +GFP_ATOMIC | + __GFP_NOWARN);if (!skb) { rx_ring->rx_stats.alloc_buff_failed++; goto no_buffers;
@@ -1571,8 +1573,10 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, const int budget) rx_bi = &rx_ring->rx_bi[i]; skb = rx_bi->skb;if (likely (!skb)) { - skb =netdev_alloc_skb_ip_align (rx_ring->netdev, - rx_ring->rx_hdr_len); + skb =__netdev_alloc_skb_ip_align (rx_ring->netdev, + rx_ring->rx_hdr_len, +GFP_ATOMIC | + __GFP_NOWARN);if (!skb) { rx_ring->rx_stats.alloc_buff_failed++; failure = true;
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +8 -4
@@ -764,8 +764,10 @@ bool i40evf_alloc_rx_buffers_1buf(struct i40e_ring *rx_ring, u16 cleaned_count) skb = bi->skb;if (!skb) { - skb =netdev_alloc_skb_ip_align (rx_ring->netdev, - rx_ring->rx_buf_len); + skb =__netdev_alloc_skb_ip_align (rx_ring->netdev, + rx_ring->rx_buf_len, +GFP_ATOMIC | + __GFP_NOWARN);if (!skb) { rx_ring->rx_stats.alloc_buff_failed++; goto no_buffers;
@@ -1034,8 +1036,10 @@ static int i40e_clean_rx_irq_ps(struct i40e_ring *rx_ring, const int budget) rx_bi = &rx_ring->rx_bi[i]; skb = rx_bi->skb;if (likely (!skb)) { - skb =netdev_alloc_skb_ip_align (rx_ring->netdev, - rx_ring->rx_hdr_len); + skb =__netdev_alloc_skb_ip_align (rx_ring->netdev, + rx_ring->rx_hdr_len, +GFP_ATOMIC | + __GFP_NOWARN);if (!skb) { rx_ring->rx_stats.alloc_buff_failed++; failure = true;
Signature · 1 line
2.1.0
PATCH 12/15 i40e/i40evf: use pages correctly in rx
In reply to Joshua HayFrom: Mitch Williams <[email protected]>
Refactor the packet split rx code to properly use half-pages for receives. The previous code was doing way more mapping and unmapping than it needed to, and wasn't properly using half-pages.
Increment the page use count each time we give a half-page to an skb, knowing that the stack will probably process and release the page before we need it again. Only free and reallocate pages if the count shows that both half-pages are in use. Add counters to track reallocations and page reuse.
---
Testing Hints: Hammer the receive path and make
sure it a) works and b) doesn't leak memory.
drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 5 ++ drivers/net/ethernet/intel/i40e/i40e_txrx.c | 118 ++++++++++++++++--------- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 2 + drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 118 ++++++++++++++++--------- drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 2 + 5 files changed, 159 insertions(+), 86 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +5 -0
@@ -536,6 +536,11 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid) rx_ring->rx_stats.alloc_page_failed, rx_ring->rx_stats.alloc_buff_failed);dev_info (&pf->pdev->dev, +" rx_rings[%i]: rx_stats: realloc_count = %lld, page_reuse_count = %lld\n" , + i, + rx_ring->rx_stats.realloc_count, + rx_ring->rx_stats.page_reuse_count); +dev_info (&pf->pdev->dev," rx_rings[%i]: size = %i, dma = 0x%08lx\n" , i, rx_ring->size, (unsigned long int )rx_ring->dma);
drivers/net/ethernet/intel/i40e/i40e_txrx.c +75 -43
193 lines not on this page · raw message
drivers/net/ethernet/intel/i40e/i40e_txrx.h +2 -0
@@ -209,6 +209,8 @@ struct i40e_rx_queue_stats {u64 non_eop_descs;u64 alloc_page_failed;u64 alloc_buff_failed; +u64 page_reuse_count; +u64 realloc_count; };enum i40e_ring_state_t {
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +75 -43
193 lines not on this page · raw message
drivers/net/ethernet/intel/i40evf/i40e_txrx.h +2 -0
@@ -208,6 +208,8 @@ struct i40e_rx_queue_stats {u64 non_eop_descs;u64 alloc_page_failed;u64 alloc_buff_failed; +u64 page_reuse_count; +u64 realloc_count; };enum i40e_ring_state_t {
Signature · 1 line
2.1.0
PATCH 13/15 i40e/i40evf: use logical operators, not bitwise
In reply to Joshua HayFrom: Mitch Williams <[email protected]>
Mr. Spock would certainly raise an eyebrow to see us using bitwise operaters, when we should clearly be relying on logic. Fascinating.
---
Testing Hints: No functional change, but the code is more correct. Make sure it compiles and passes traffic properly.
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 5 +++-- drivers/net/ethernet/intel/i40evf/i40e_txrx.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_txrx.c +3 -2
@@ -1996,7 +1996,8 @@ int i40e_napi_poll(struct napi_struct *napi, int budget)* budget and be more aggressive about cleaning up the Tx descriptors. */ i40e_for_each_ring (ring, q_vector->tx) { - clean_complete &=i40e_clean_tx_irq (ring, vsi->work_limit); + clean_complete = clean_complete && +i40e_clean_tx_irq (ring, vsi->work_limit); arm_wb = arm_wb || ring->arm_wb; ring->arm_wb = false; }
@@ -2020,7 +2021,7 @@ int i40e_napi_poll(struct napi_struct *napi, int budget) work_done += cleaned;/* if we didn't clean as many as budgeted, we must be done */ - clean_complete &= (budget_per_ring != cleaned); + clean_complete = clean_complete && (budget_per_ring > cleaned); }/* If work not completed, return budget and polling will return */
drivers/net/ethernet/intel/i40evf/i40e_txrx.c +3 -2
@@ -1432,7 +1432,8 @@ int i40evf_napi_poll(struct napi_struct *napi, int budget)* budget and be more aggressive about cleaning up the Tx descriptors. */ i40e_for_each_ring (ring, q_vector->tx) { - clean_complete &=i40e_clean_tx_irq (ring, vsi->work_limit); + clean_complete = clean_complete && +i40e_clean_tx_irq (ring, vsi->work_limit); arm_wb = arm_wb || ring->arm_wb; ring->arm_wb = false; }
@@ -1456,7 +1457,7 @@ int i40evf_napi_poll(struct napi_struct *napi, int budget) work_done += cleaned;/* if we didn't clean as many as budgeted, we must be done */ - clean_complete &= (budget_per_ring != cleaned); + clean_complete = clean_complete && (budget_per_ring > cleaned); }/* If work not completed, return budget and polling will return */
Signature · 1 line
2.1.0
PATCH 14/15 i40e: properly show packet split status in debugfs
In reply to Joshua HayFrom: Mitch Williams <[email protected]>
Get rid of the unused hsplit field in the ring struct and use the existing macro to detect packet split enablement. This allows debugfs dumps of the VSI to properly show which rx routine is in use.
---
Testing Hints: Enable/disable packet split and
dump the VSI through debugfs. Note the output.
drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 6 +++--- drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 - drivers/net/ethernet/intel/i40evf/i40e_txrx.h | 1 - 3 files changed, 3 insertions(+), 5 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_debugfs.c +3 -3
@@ -521,7 +521,7 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid) rx_ring->dtype);dev_info (&pf->pdev->dev," rx_rings[%i]: hsplit = %d, next_to_use = %d, next_to_clean = %d, ring_active = %i\n" , - i, rx_ring->hsplit, + i,ring_is_ps_enabled (rx_ring), rx_ring->next_to_use, rx_ring->next_to_clean, rx_ring->ring_active);
@@ -572,8 +572,8 @@ static void i40e_dbg_dump_vsi_seid(struct i40e_pf *pf, int seid)" tx_rings[%i]: dtype = %d\n" , i, tx_ring->dtype);dev_info (&pf->pdev->dev, -" tx_rings[%i]: hsplit = %d, next_to_use = %d, next_to_clean = %d, ring_active = %i\n" , - i, tx_ring->hsplit, +" tx_rings[%i]: next_to_use = %d, next_to_clean = %d, ring_active = %i\n" , + i, tx_ring->next_to_use, tx_ring->next_to_clean, tx_ring->ring_active);
drivers/net/ethernet/intel/i40e/i40e_txrx.h +0 -1
@@ -256,7 +256,6 @@ struct i40e_ring {#define I40E_RX_DTYPE_NO_SPLIT 0#define I40E_RX_DTYPE_HEADER_SPLIT 1#define I40E_RX_DTYPE_SPLIT_ALWAYS 2 -u8 hsplit;#define I40E_RX_SPLIT_L2 0x1#define I40E_RX_SPLIT_IP 0x2#define I40E_RX_SPLIT_TCP_UDP 0x4
drivers/net/ethernet/intel/i40evf/i40e_txrx.h +0 -1
@@ -255,7 +255,6 @@ struct i40e_ring {#define I40E_RX_DTYPE_NO_SPLIT 0#define I40E_RX_DTYPE_HEADER_SPLIT 1#define I40E_RX_DTYPE_SPLIT_ALWAYS 2 -u8 hsplit;#define I40E_RX_SPLIT_L2 0x1#define I40E_RX_SPLIT_IP 0x2#define I40E_RX_SPLIT_TCP_UDP 0x4
Signature · 1 line
2.1.0
PATCH 15/15 i40e/i40evf: Bump version
In reply to Joshua HayFrom: Jesse Brandeburg <[email protected]>
Bump version to i40e-1.4.13 and i40evf-1.4.9
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 2 +- drivers/net/ethernet/intel/i40evf/i40evf_main.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/intel/i40e/i40e_main.c +1 -1
@@ -51,7 +51,7 @@ static const char i40e_driver_string[] =#define DRV_VERSION_MAJOR 1#define DRV_VERSION_MINOR 4 -#define DRV_VERSION_BUILD 12 +#define DRV_VERSION_BUILD 13#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ __stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_BUILD) DRV_KERN
drivers/net/ethernet/intel/i40evf/i40evf_main.c +1 -1
@@ -38,7 +38,7 @@ static const char i40evf_driver_string[] =#define DRV_VERSION_MAJOR 1#define DRV_VERSION_MINOR 4 -#define DRV_VERSION_BUILD 8 +#define DRV_VERSION_BUILD 9#define DRV_VERSION __stringify(DRV_VERSION_MAJOR) "." \ __stringify(DRV_VERSION_MINOR) "." \ __stringify(DRV_VERSION_BUILD) \
Signature · 1 line
2.1.0
cover i40e/i40evf updates
In reply to Joshua HayQuoted 32 lines · Joshua Hay
Anjali Singhai Jain refactors
force_wbandWB_ON_ITRfunctionality code.Catherine Sullivan changes vf driver string to reflect all products? i40evf supports.
Jesse Brandeburg moves
sync_vsi_filtersup in service task, doesn't lose?
interrupts, tries again after failure, dumps descriptor indexes in hex,
uses__GFP_NOWARN, bumps version.Mitch Williams uses pages correctly in rx, uses logical operators,? not bitwise, properly shows packet split status in debugfs.
Neerav Parikh makes the DCB firmware checks for X710/XL710 only.
Shannon Nelson sets shared bit for multicast filters, adds VEB stat control and removes L2 cloud filter, uses new
add_vebcalling with? veb stats control.?drivers/net/ethernet/intel/i40e/i40e.h???????????? |? 23 +- ?drivers/net/ethernet/intel/i40e/i40e_common.c????? |? 21 +- ?drivers/net/ethernet/intel/i40e/i40e_debugfs.c???? |? 25 +- ?drivers/net/ethernet/intel/i40e/i40e_ethtool.c???? |? 11 +- ?drivers/net/ethernet/intel/i40e/i40e_main.c??????? |? 51 +++-- ?drivers/net/ethernet/intel/i40e/i40e_prototype.h?? |?? 6 +- ?drivers/net/ethernet/intel/i40e/i40e_txrx.c??????? | 249 +++++++++++++------- ?drivers/net/ethernet/intel/i40e/i40e_txrx.h??????? |?? 9 +- ?drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c |?? 4 +- ?drivers/net/ethernet/intel/i40evf/i40e_txrx.c????? | 253
Quoted 4 lines
++++++++++++++-------
?drivers/net/ethernet/intel/i40evf/i40e_txrx.h????? |? 10 +- ?drivers/net/ethernet/intel/i40evf/i40evf_main.c??? |?? 6 +- ?12 files changed, 445 insertions(+), 223 deletions(-)
Dropping this series because the second patch did not apply cleanly AND after applying patch 2 by hand, patches 3 & 4 generated compile warnings and errors.
Rather than taking the time to cleanup your patches, simply dropping
them and will wait for you to rebase your patches against my current
tree and re-submit.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://lists.osuosl.org/pipermail/intel-wired-lan/attachments/20160112/8d891ec5/attachment.asc>