ixgbevf: Add flag to indicate when rx is in net poll
napi_gro_receive shouldn't be called from netpoll context. Doing so was causing kernel panics when jumbo frames larger than 2K were set. Add a flag to check if the Rx ring processing is occurring from interrupt context or from netpoll context and call netif_rx() if in the polling context. Signed-off-by: Greg Rose <gregory.v.rose@intel.com> Tested-by: Sibai Li <sibai.li@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a5f9337bdc
commit
366c109912
|
@ -229,6 +229,7 @@ struct ixgbevf_adapter {
|
|||
*/
|
||||
u32 flags;
|
||||
#define IXGBE_FLAG_IN_WATCHDOG_TASK (u32)(1)
|
||||
#define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 1)
|
||||
|
||||
/* OS defined structs */
|
||||
struct net_device *netdev;
|
||||
|
|
|
@ -288,7 +288,10 @@ static void ixgbevf_receive_skb(struct ixgbevf_q_vector *q_vector,
|
|||
if (is_vlan && test_bit(tag & VLAN_VID_MASK, adapter->active_vlans))
|
||||
__vlan_hwaccel_put_tag(skb, tag);
|
||||
|
||||
if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL))
|
||||
napi_gro_receive(&q_vector->napi, skb);
|
||||
else
|
||||
netif_rx(skb);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -550,9 +553,11 @@ static int ixgbevf_poll(struct napi_struct *napi, int budget)
|
|||
else
|
||||
per_ring_budget = budget;
|
||||
|
||||
adapter->flags |= IXGBE_FLAG_IN_NETPOLL;
|
||||
ixgbevf_for_each_ring(ring, q_vector->rx)
|
||||
clean_complete &= ixgbevf_clean_rx_irq(q_vector, ring,
|
||||
per_ring_budget);
|
||||
adapter->flags &= ~IXGBE_FLAG_IN_NETPOLL;
|
||||
|
||||
/* If all work not completed, return budget and keep polling */
|
||||
if (!clean_complete)
|
||||
|
|
Loading…
Reference in New Issue