diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 3 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c | 6 | 
3 files changed, 10 insertions, 0 deletions
| diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 921a4d977d65..8813b4dd6872 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -779,6 +779,7 @@ struct ixgbe_adapter {  #ifdef CONFIG_IXGBE_IPSEC  	struct ixgbe_ipsec *ipsec;  #endif /* CONFIG_IXGBE_IPSEC */ +	spinlock_t vfs_lock;  };  static inline int ixgbe_determine_xdp_q_idx(int cpu) diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c index 77c2e70b0860..55f91c9ff047 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c @@ -6403,6 +6403,9 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter,  	/* n-tuple support exists, always init our spinlock */  	spin_lock_init(&adapter->fdir_perfect_lock); +	/* init spinlock to avoid concurrency of VF resources */ +	spin_lock_init(&adapter->vfs_lock); +  #ifdef CONFIG_IXGBE_DCB  	ixgbe_init_dcb(adapter);  #endif diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c index d4e63f0644c3..a1e69c734863 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c @@ -205,10 +205,13 @@ void ixgbe_enable_sriov(struct ixgbe_adapter *adapter, unsigned int max_vfs)  int ixgbe_disable_sriov(struct ixgbe_adapter *adapter)  {  	unsigned int num_vfs = adapter->num_vfs, vf; +	unsigned long flags;  	int rss; +	spin_lock_irqsave(&adapter->vfs_lock, flags);  	/* set num VFs to 0 to prevent access to vfinfo */  	adapter->num_vfs = 0; +	spin_unlock_irqrestore(&adapter->vfs_lock, flags);  	/* put the reference to all of the vf devices */  	for (vf = 0; vf < num_vfs; ++vf) { @@ -1355,8 +1358,10 @@ static void ixgbe_rcv_ack_from_vf(struct ixgbe_adapter *adapter, u32 vf)  void ixgbe_msg_task(struct ixgbe_adapter *adapter)  {  	struct ixgbe_hw *hw = &adapter->hw; +	unsigned long flags;  	u32 vf; +	spin_lock_irqsave(&adapter->vfs_lock, flags);  	for (vf = 0; vf < adapter->num_vfs; vf++) {  		/* process any reset requests */  		if (!ixgbe_check_for_rst(hw, vf)) @@ -1370,6 +1375,7 @@ void ixgbe_msg_task(struct ixgbe_adapter *adapter)  		if (!ixgbe_check_for_ack(hw, vf))  			ixgbe_rcv_ack_from_vf(adapter, vf);  	} +	spin_unlock_irqrestore(&adapter->vfs_lock, flags);  }  static inline void ixgbe_ping_vf(struct ixgbe_adapter *adapter, int vf) |