[Intel-wired-lan] [next PATCH S82 3/9] i40evf: Drop i40evf_fire_sw_int as it is prone to races

Shannon Nelson shannon.nelson at oracle.com
Fri Nov 3 20:08:14 UTC 2017


On 11/3/2017 4:05 AM, Alice Michael wrote:
> From: Alexander Duyck <alexander.h.duyck at intel.com>
> 
> Having the interrupts firing while we are polling causes extra overhead and
> isn't needed for most systems out there. If an interrupt is lost us
> experiencing a 2s latency spike before recovering is still not acceptable
> and masks the issue. We are better off just identifying systems that lose
> interrupts and instead enable workarounds for those systems.
> 
> To that end I am dropping the code that was strobing the interrupts as
> there is a narrow window where having them enabled can actually cause
> race issues anyway where a few stray packets might get misses if the
> interrupt is re-enabled and fires before we call napi_complete.
> 
> Also replace one line where we were using bit 31 instead of the define
> for the bit to represent masking the interrupt enable bit.

I don't think I see any code change for this comment... did this get 
stripped out?

sln

> 
> Signed-off-by: Alexander Duyck <alexander.h.duyck at intel.com>
> ---
>   drivers/net/ethernet/intel/i40evf/i40evf_main.c | 34 -------------------------
>   1 file changed, 34 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> index 4dd3149..5e27619 100644
> --- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> +++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
> @@ -282,33 +282,6 @@ void i40evf_irq_enable_queues(struct i40evf_adapter *adapter, u32 mask)
>   }
>   
>   /**
> - * i40evf_fire_sw_int - Generate SW interrupt for specified vectors
> - * @adapter: board private structure
> - * @mask: bitmap of vectors to trigger
> - **/
> -static void i40evf_fire_sw_int(struct i40evf_adapter *adapter, u32 mask)
> -{
> -	struct i40e_hw *hw = &adapter->hw;
> -	int i;
> -	u32 dyn_ctl;
> -
> -	if (mask & 1) {
> -		dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTL01);
> -		dyn_ctl |= I40E_VFINT_DYN_CTLN1_SWINT_TRIG_MASK |
> -			   I40E_VFINT_DYN_CTLN1_ITR_INDX_MASK;
> -		wr32(hw, I40E_VFINT_DYN_CTL01, dyn_ctl);
> -	}
> -	for (i = 1; i < adapter->num_msix_vectors; i++) {
> -		if (mask & BIT(i)) {
> -			dyn_ctl = rd32(hw, I40E_VFINT_DYN_CTLN1(i - 1));
> -			dyn_ctl |= I40E_VFINT_DYN_CTLN1_SWINT_TRIG_MASK |
> -				   I40E_VFINT_DYN_CTLN1_ITR_INDX_MASK;
> -			wr32(hw, I40E_VFINT_DYN_CTLN1(i - 1), dyn_ctl);
> -		}
> -	}
> -}
> -
> -/**
>    * i40evf_irq_enable - Enable default interrupt generation settings
>    * @adapter: board private structure
>    * @flush: boolean value whether to run rd32()
> @@ -1743,13 +1716,6 @@ static void i40evf_watchdog_task(struct work_struct *work)
>   	if (adapter->state == __I40EVF_RUNNING)
>   		i40evf_request_stats(adapter);
>   watchdog_done:
> -	if (adapter->state == __I40EVF_RUNNING) {
> -		i40evf_irq_enable_queues(adapter, ~0);
> -		i40evf_fire_sw_int(adapter, 0xFF);
> -	} else {
> -		i40evf_fire_sw_int(adapter, 0x1);
> -	}
> -
>   	clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section);
>   restart_watchdog:
>   	if (adapter->state == __I40EVF_REMOVE)
> 


More information about the Intel-wired-lan mailing list