All of lore.kernel.org
 help / color / mirror / Atom feed
From: Michael S. Tsirkin <mst@redhat.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [RFC Patch 10/12] IXGBEVF: Add lock to protect tx/rx ring operation
Date: Thu, 22 Oct 2015 15:40:27 +0300	[thread overview]
Message-ID: <20151022153756-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1445445464-5056-11-git-send-email-tianyu.lan@intel.com>

On Thu, Oct 22, 2015 at 12:37:42AM +0800, Lan Tianyu wrote:
> Ring shifting during restoring VF function maybe race with original
> ring operation(transmit/receive package). This patch is to add tx/rx
> lock to protect ring related data.
> 
> Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>

That's adding a bunch of locking on data path - what's the
performance impact?

Can't you do something faster? E.g. migration things
are slow path - can't you use something like RCU
to flush outstanding work?


> ---
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf.h      |  2 ++
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 28 ++++++++++++++++++++---
>  2 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> index 6eab402e..3a748c8 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> @@ -448,6 +448,8 @@ struct ixgbevf_adapter {
>  
>  	spinlock_t mbx_lock;
>  	unsigned long last_reset;
> +	spinlock_t mg_rx_lock;
> +	spinlock_t mg_tx_lock;
>  };
>  
>  enum ixbgevf_state_t {
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> index 15ec361..04b6ce7 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> @@ -227,8 +227,10 @@ static u64 ixgbevf_get_tx_completed(struct ixgbevf_ring *ring)
>  
>  int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_tx_buffer *tx_buffer = NULL;
>  	static union ixgbevf_desc *tx_desc = NULL;
> +	unsigned long flags;
>  
>  	tx_buffer = vmalloc(sizeof(struct ixgbevf_tx_buffer) * (r->count));
>  	if (!tx_buffer)
> @@ -238,6 +240,7 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!tx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
>  	memcpy(tx_desc, r->desc, sizeof(union ixgbevf_desc) * r->count);
>  	memcpy(r->desc, &tx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], tx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -256,6 +259,8 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	else
>  		r->next_to_use += (r->count - head);
>  
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
> +
>  	vfree(tx_buffer);
>  	vfree(tx_desc);
>  	return 0;
> @@ -263,8 +268,10 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  
>  int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_rx_buffer *rx_buffer = NULL;
>  	static union ixgbevf_desc *rx_desc = NULL;
> +	unsigned long flags;	
>  
>  	rx_buffer = vmalloc(sizeof(struct ixgbevf_rx_buffer) * (r->count));
>  	if (!rx_buffer)
> @@ -274,6 +281,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!rx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_rx_lock, flags);
>  	memcpy(rx_desc, r->desc, sizeof(union ixgbevf_desc) * (r->count));
>  	memcpy(r->desc, &rx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], rx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -291,6 +299,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  		r->next_to_use -= head;
>  	else
>  		r->next_to_use += (r->count - head);
> +	spin_unlock_irqrestore(&adapter->mg_rx_lock, flags);
>  
>  	vfree(rx_buffer);
>  	vfree(rx_desc);
> @@ -377,6 +386,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	if (test_bit(__IXGBEVF_DOWN, &adapter->state))
>  		return true;
>  
> +	spin_lock(&adapter->mg_tx_lock);
> +	i = tx_ring->next_to_clean;
>  	tx_buffer = &tx_ring->tx_buffer_info[i];
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  	i -= tx_ring->count;
> @@ -471,6 +482,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->tx.total_bytes += total_bytes;
>  	q_vector->tx.total_packets += total_packets;
>  
> +	spin_unlock(&adapter->mg_tx_lock);
> +
>  	if (check_for_tx_hang(tx_ring) && ixgbevf_check_tx_hang(tx_ring)) {
>  		struct ixgbe_hw *hw = &adapter->hw;
>  		union ixgbe_adv_tx_desc *eop_desc;
> @@ -999,10 +1012,12 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  				struct ixgbevf_ring *rx_ring,
>  				int budget)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(rx_ring->netdev);
>  	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
>  	u16 cleaned_count = ixgbevf_desc_unused(rx_ring);
>  	struct sk_buff *skb = rx_ring->skb;
>  
> +	spin_lock(&adapter->mg_rx_lock);
>  	while (likely(total_rx_packets < budget)) {
>  		union ixgbe_adv_rx_desc *rx_desc;
>  
> @@ -1078,6 +1093,7 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->rx.total_packets += total_rx_packets;
>  	q_vector->rx.total_bytes += total_rx_bytes;
>  
> +	spin_unlock(&adapter->mg_rx_lock);
>  	return total_rx_packets;
>  }
>  
> @@ -3572,14 +3588,17 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  	struct ixgbevf_tx_buffer *tx_buffer;
>  	union ixgbe_adv_tx_desc *tx_desc;
>  	struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
> +	struct ixgbevf_adapter *adapter = netdev_priv(tx_ring->netdev);
>  	unsigned int data_len = skb->data_len;
>  	unsigned int size = skb_headlen(skb);
>  	unsigned int paylen = skb->len - hdr_len;
> +	unsigned long flags;
>  	u32 tx_flags = first->tx_flags;
>  	__le32 cmd_type;
> -	u16 i = tx_ring->next_to_use;
> -	u16 start;
> +	u16 i, start;     
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
> +	i = tx_ring->next_to_use;
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  
>  	ixgbevf_tx_olinfo_status(tx_desc, tx_flags, paylen);
> @@ -3673,7 +3692,7 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  
>  	/* notify HW of packet */
>  	ixgbevf_write_tail(tx_ring, i);
> -
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  	return;
>  dma_error:
>  	dev_err(tx_ring->dev, "TX DMA map failed\n");
> @@ -3690,6 +3709,7 @@ dma_error:
>  	}
>  
>  	tx_ring->next_to_use = i;
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  }
>  
>  static int __ixgbevf_maybe_stop_tx(struct ixgbevf_ring *tx_ring, int size)
> @@ -4188,6 +4208,8 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  		break;
>  	}
>  
> +	spin_lock_init(&adapter->mg_tx_lock);
> +	spin_lock_init(&adapter->mg_rx_lock);
>  	return 0;
>  
>  err_register:
> -- 
> 1.8.4.rc0.1.g8f6a3e5.dirty
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo at vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Lan Tianyu <tianyu.lan@intel.com>
Cc: bhelgaas@google.com, carolyn.wyborny@intel.com,
	donald.c.skidmore@intel.com, eddie.dong@intel.com,
	nrupal.jani@intel.com, yang.z.zhang@intel.com, agraf@suse.de,
	kvm@vger.kernel.org, pbonzini@redhat.com, qemu-devel@nongnu.org,
	emil.s.tantilov@intel.com, intel-wired-lan@lists.osuosl.org,
	jeffrey.t.kirsher@intel.com, jesse.brandeburg@intel.com,
	john.ronciak@intel.com, linux-kernel@vger.kernel.org,
	linux-pci@vger.kernel.org, matthew.vick@intel.com,
	mitch.a.williams@intel.com, netdev@vger.kernel.org,
	shannon.nelson@intel.com
Subject: Re: [RFC Patch 10/12] IXGBEVF: Add lock to protect tx/rx ring operation
Date: Thu, 22 Oct 2015 15:40:27 +0300	[thread overview]
Message-ID: <20151022153756-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1445445464-5056-11-git-send-email-tianyu.lan@intel.com>

On Thu, Oct 22, 2015 at 12:37:42AM +0800, Lan Tianyu wrote:
> Ring shifting during restoring VF function maybe race with original
> ring operation(transmit/receive package). This patch is to add tx/rx
> lock to protect ring related data.
> 
> Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>

That's adding a bunch of locking on data path - what's the
performance impact?

Can't you do something faster? E.g. migration things
are slow path - can't you use something like RCU
to flush outstanding work?


> ---
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf.h      |  2 ++
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 28 ++++++++++++++++++++---
>  2 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> index 6eab402e..3a748c8 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> @@ -448,6 +448,8 @@ struct ixgbevf_adapter {
>  
>  	spinlock_t mbx_lock;
>  	unsigned long last_reset;
> +	spinlock_t mg_rx_lock;
> +	spinlock_t mg_tx_lock;
>  };
>  
>  enum ixbgevf_state_t {
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> index 15ec361..04b6ce7 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> @@ -227,8 +227,10 @@ static u64 ixgbevf_get_tx_completed(struct ixgbevf_ring *ring)
>  
>  int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_tx_buffer *tx_buffer = NULL;
>  	static union ixgbevf_desc *tx_desc = NULL;
> +	unsigned long flags;
>  
>  	tx_buffer = vmalloc(sizeof(struct ixgbevf_tx_buffer) * (r->count));
>  	if (!tx_buffer)
> @@ -238,6 +240,7 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!tx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
>  	memcpy(tx_desc, r->desc, sizeof(union ixgbevf_desc) * r->count);
>  	memcpy(r->desc, &tx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], tx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -256,6 +259,8 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	else
>  		r->next_to_use += (r->count - head);
>  
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
> +
>  	vfree(tx_buffer);
>  	vfree(tx_desc);
>  	return 0;
> @@ -263,8 +268,10 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  
>  int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_rx_buffer *rx_buffer = NULL;
>  	static union ixgbevf_desc *rx_desc = NULL;
> +	unsigned long flags;	
>  
>  	rx_buffer = vmalloc(sizeof(struct ixgbevf_rx_buffer) * (r->count));
>  	if (!rx_buffer)
> @@ -274,6 +281,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!rx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_rx_lock, flags);
>  	memcpy(rx_desc, r->desc, sizeof(union ixgbevf_desc) * (r->count));
>  	memcpy(r->desc, &rx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], rx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -291,6 +299,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  		r->next_to_use -= head;
>  	else
>  		r->next_to_use += (r->count - head);
> +	spin_unlock_irqrestore(&adapter->mg_rx_lock, flags);
>  
>  	vfree(rx_buffer);
>  	vfree(rx_desc);
> @@ -377,6 +386,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	if (test_bit(__IXGBEVF_DOWN, &adapter->state))
>  		return true;
>  
> +	spin_lock(&adapter->mg_tx_lock);
> +	i = tx_ring->next_to_clean;
>  	tx_buffer = &tx_ring->tx_buffer_info[i];
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  	i -= tx_ring->count;
> @@ -471,6 +482,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->tx.total_bytes += total_bytes;
>  	q_vector->tx.total_packets += total_packets;
>  
> +	spin_unlock(&adapter->mg_tx_lock);
> +
>  	if (check_for_tx_hang(tx_ring) && ixgbevf_check_tx_hang(tx_ring)) {
>  		struct ixgbe_hw *hw = &adapter->hw;
>  		union ixgbe_adv_tx_desc *eop_desc;
> @@ -999,10 +1012,12 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  				struct ixgbevf_ring *rx_ring,
>  				int budget)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(rx_ring->netdev);
>  	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
>  	u16 cleaned_count = ixgbevf_desc_unused(rx_ring);
>  	struct sk_buff *skb = rx_ring->skb;
>  
> +	spin_lock(&adapter->mg_rx_lock);
>  	while (likely(total_rx_packets < budget)) {
>  		union ixgbe_adv_rx_desc *rx_desc;
>  
> @@ -1078,6 +1093,7 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->rx.total_packets += total_rx_packets;
>  	q_vector->rx.total_bytes += total_rx_bytes;
>  
> +	spin_unlock(&adapter->mg_rx_lock);
>  	return total_rx_packets;
>  }
>  
> @@ -3572,14 +3588,17 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  	struct ixgbevf_tx_buffer *tx_buffer;
>  	union ixgbe_adv_tx_desc *tx_desc;
>  	struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
> +	struct ixgbevf_adapter *adapter = netdev_priv(tx_ring->netdev);
>  	unsigned int data_len = skb->data_len;
>  	unsigned int size = skb_headlen(skb);
>  	unsigned int paylen = skb->len - hdr_len;
> +	unsigned long flags;
>  	u32 tx_flags = first->tx_flags;
>  	__le32 cmd_type;
> -	u16 i = tx_ring->next_to_use;
> -	u16 start;
> +	u16 i, start;     
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
> +	i = tx_ring->next_to_use;
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  
>  	ixgbevf_tx_olinfo_status(tx_desc, tx_flags, paylen);
> @@ -3673,7 +3692,7 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  
>  	/* notify HW of packet */
>  	ixgbevf_write_tail(tx_ring, i);
> -
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  	return;
>  dma_error:
>  	dev_err(tx_ring->dev, "TX DMA map failed\n");
> @@ -3690,6 +3709,7 @@ dma_error:
>  	}
>  
>  	tx_ring->next_to_use = i;
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  }
>  
>  static int __ixgbevf_maybe_stop_tx(struct ixgbevf_ring *tx_ring, int size)
> @@ -4188,6 +4208,8 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  		break;
>  	}
>  
> +	spin_lock_init(&adapter->mg_tx_lock);
> +	spin_lock_init(&adapter->mg_rx_lock);
>  	return 0;
>  
>  err_register:
> -- 
> 1.8.4.rc0.1.g8f6a3e5.dirty
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Lan Tianyu <tianyu.lan@intel.com>
Cc: shannon.nelson@intel.com, emil.s.tantilov@intel.com,
	kvm@vger.kernel.org, linux-pci@vger.kernel.org,
	donald.c.skidmore@intel.com, mitch.a.williams@intel.com,
	eddie.dong@intel.com, agraf@suse.de, qemu-devel@nongnu.org,
	yang.z.zhang@intel.com, nrupal.jani@intel.com,
	john.ronciak@intel.com, intel-wired-lan@lists.osuosl.org,
	jeffrey.t.kirsher@intel.com, jesse.brandeburg@intel.com,
	bhelgaas@google.com, pbonzini@redhat.com,
	carolyn.wyborny@intel.com, matthew.vick@intel.com,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [Qemu-devel] [RFC Patch 10/12] IXGBEVF: Add lock to protect tx/rx ring operation
Date: Thu, 22 Oct 2015 15:40:27 +0300	[thread overview]
Message-ID: <20151022153756-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1445445464-5056-11-git-send-email-tianyu.lan@intel.com>

On Thu, Oct 22, 2015 at 12:37:42AM +0800, Lan Tianyu wrote:
> Ring shifting during restoring VF function maybe race with original
> ring operation(transmit/receive package). This patch is to add tx/rx
> lock to protect ring related data.
> 
> Signed-off-by: Lan Tianyu <tianyu.lan@intel.com>

That's adding a bunch of locking on data path - what's the
performance impact?

Can't you do something faster? E.g. migration things
are slow path - can't you use something like RCU
to flush outstanding work?


> ---
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf.h      |  2 ++
>  drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c | 28 ++++++++++++++++++++---
>  2 files changed, 27 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> index 6eab402e..3a748c8 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf.h
> @@ -448,6 +448,8 @@ struct ixgbevf_adapter {
>  
>  	spinlock_t mbx_lock;
>  	unsigned long last_reset;
> +	spinlock_t mg_rx_lock;
> +	spinlock_t mg_tx_lock;
>  };
>  
>  enum ixbgevf_state_t {
> diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> index 15ec361..04b6ce7 100644
> --- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> +++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
> @@ -227,8 +227,10 @@ static u64 ixgbevf_get_tx_completed(struct ixgbevf_ring *ring)
>  
>  int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_tx_buffer *tx_buffer = NULL;
>  	static union ixgbevf_desc *tx_desc = NULL;
> +	unsigned long flags;
>  
>  	tx_buffer = vmalloc(sizeof(struct ixgbevf_tx_buffer) * (r->count));
>  	if (!tx_buffer)
> @@ -238,6 +240,7 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!tx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
>  	memcpy(tx_desc, r->desc, sizeof(union ixgbevf_desc) * r->count);
>  	memcpy(r->desc, &tx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], tx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -256,6 +259,8 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	else
>  		r->next_to_use += (r->count - head);
>  
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
> +
>  	vfree(tx_buffer);
>  	vfree(tx_desc);
>  	return 0;
> @@ -263,8 +268,10 @@ int ixgbevf_tx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  
>  int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(r->netdev);
>  	struct ixgbevf_rx_buffer *rx_buffer = NULL;
>  	static union ixgbevf_desc *rx_desc = NULL;
> +	unsigned long flags;	
>  
>  	rx_buffer = vmalloc(sizeof(struct ixgbevf_rx_buffer) * (r->count));
>  	if (!rx_buffer)
> @@ -274,6 +281,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  	if (!rx_desc)
>  		return -ENOMEM;
>  
> +	spin_lock_irqsave(&adapter->mg_rx_lock, flags);
>  	memcpy(rx_desc, r->desc, sizeof(union ixgbevf_desc) * (r->count));
>  	memcpy(r->desc, &rx_desc[head], sizeof(union ixgbevf_desc) * (r->count - head));
>  	memcpy(&r->desc[r->count - head], rx_desc, sizeof(union ixgbevf_desc) * head);
> @@ -291,6 +299,7 @@ int ixgbevf_rx_ring_shift(struct ixgbevf_ring *r, u32 head)
>  		r->next_to_use -= head;
>  	else
>  		r->next_to_use += (r->count - head);
> +	spin_unlock_irqrestore(&adapter->mg_rx_lock, flags);
>  
>  	vfree(rx_buffer);
>  	vfree(rx_desc);
> @@ -377,6 +386,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	if (test_bit(__IXGBEVF_DOWN, &adapter->state))
>  		return true;
>  
> +	spin_lock(&adapter->mg_tx_lock);
> +	i = tx_ring->next_to_clean;
>  	tx_buffer = &tx_ring->tx_buffer_info[i];
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  	i -= tx_ring->count;
> @@ -471,6 +482,8 @@ static bool ixgbevf_clean_tx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->tx.total_bytes += total_bytes;
>  	q_vector->tx.total_packets += total_packets;
>  
> +	spin_unlock(&adapter->mg_tx_lock);
> +
>  	if (check_for_tx_hang(tx_ring) && ixgbevf_check_tx_hang(tx_ring)) {
>  		struct ixgbe_hw *hw = &adapter->hw;
>  		union ixgbe_adv_tx_desc *eop_desc;
> @@ -999,10 +1012,12 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  				struct ixgbevf_ring *rx_ring,
>  				int budget)
>  {
> +	struct ixgbevf_adapter *adapter = netdev_priv(rx_ring->netdev);
>  	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
>  	u16 cleaned_count = ixgbevf_desc_unused(rx_ring);
>  	struct sk_buff *skb = rx_ring->skb;
>  
> +	spin_lock(&adapter->mg_rx_lock);
>  	while (likely(total_rx_packets < budget)) {
>  		union ixgbe_adv_rx_desc *rx_desc;
>  
> @@ -1078,6 +1093,7 @@ static int ixgbevf_clean_rx_irq(struct ixgbevf_q_vector *q_vector,
>  	q_vector->rx.total_packets += total_rx_packets;
>  	q_vector->rx.total_bytes += total_rx_bytes;
>  
> +	spin_unlock(&adapter->mg_rx_lock);
>  	return total_rx_packets;
>  }
>  
> @@ -3572,14 +3588,17 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  	struct ixgbevf_tx_buffer *tx_buffer;
>  	union ixgbe_adv_tx_desc *tx_desc;
>  	struct skb_frag_struct *frag = &skb_shinfo(skb)->frags[0];
> +	struct ixgbevf_adapter *adapter = netdev_priv(tx_ring->netdev);
>  	unsigned int data_len = skb->data_len;
>  	unsigned int size = skb_headlen(skb);
>  	unsigned int paylen = skb->len - hdr_len;
> +	unsigned long flags;
>  	u32 tx_flags = first->tx_flags;
>  	__le32 cmd_type;
> -	u16 i = tx_ring->next_to_use;
> -	u16 start;
> +	u16 i, start;     
>  
> +	spin_lock_irqsave(&adapter->mg_tx_lock, flags);
> +	i = tx_ring->next_to_use;
>  	tx_desc = IXGBEVF_TX_DESC(tx_ring, i);
>  
>  	ixgbevf_tx_olinfo_status(tx_desc, tx_flags, paylen);
> @@ -3673,7 +3692,7 @@ static void ixgbevf_tx_map(struct ixgbevf_ring *tx_ring,
>  
>  	/* notify HW of packet */
>  	ixgbevf_write_tail(tx_ring, i);
> -
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  	return;
>  dma_error:
>  	dev_err(tx_ring->dev, "TX DMA map failed\n");
> @@ -3690,6 +3709,7 @@ dma_error:
>  	}
>  
>  	tx_ring->next_to_use = i;
> +	spin_unlock_irqrestore(&adapter->mg_tx_lock, flags);
>  }
>  
>  static int __ixgbevf_maybe_stop_tx(struct ixgbevf_ring *tx_ring, int size)
> @@ -4188,6 +4208,8 @@ static int ixgbevf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  		break;
>  	}
>  
> +	spin_lock_init(&adapter->mg_tx_lock);
> +	spin_lock_init(&adapter->mg_rx_lock);
>  	return 0;
>  
>  err_register:
> -- 
> 1.8.4.rc0.1.g8f6a3e5.dirty
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2015-10-22 12:40 UTC|newest]

Thread overview: 171+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-10-21 16:37 [Intel-wired-lan] [RFC Patch 00/12] IXGBE: Add live migration support for SRIOV NIC Lan Tianyu
2015-10-21 16:37 ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37 ` Lan Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 01/12] PCI: Add virtfn_index for struct pci_device Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 18:07   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 18:07     ` [Qemu-devel] " Alexander Duyck
2015-10-21 18:07     ` Alexander Duyck
2015-10-24 14:46     ` [Intel-wired-lan] " Lan, Tianyu
2015-10-24 14:46       ` [Qemu-devel] " Lan, Tianyu
2015-10-24 14:46       ` Lan, Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 02/12] IXGBE: Add new mail box event to restore VF status in the PF driver Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 20:34   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 20:34     ` [Qemu-devel] " Alexander Duyck
2015-10-21 20:34     ` Alexander Duyck
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 03/12] IXGBE: Add sysfs interface for Qemu to migrate " Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 20:45   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 20:45     ` [Qemu-devel] " Alexander Duyck
2015-10-21 20:45     ` Alexander Duyck
2015-10-25  7:21     ` [Intel-wired-lan] " Lan, Tianyu
2015-10-25  7:21       ` [Qemu-devel] " Lan, Tianyu
2015-10-25  7:21       ` Lan, Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 04/12] IXGBE: Add ixgbe_ping_vf() to notify a specified VF via mailbox msg Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 05/12] IXGBE: Add new sysfs interface of "notify_vf" Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 20:52   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 20:52     ` [Qemu-devel] " Alexander Duyck
2015-10-21 20:52     ` Alexander Duyck
2015-10-22 12:51     ` [Intel-wired-lan] [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:51       ` Michael S. Tsirkin
2015-10-22 12:51       ` Michael S. Tsirkin
2015-10-22 12:51       ` [Qemu-devel] " Michael S. Tsirkin
2015-10-24 15:43     ` [Intel-wired-lan] " Lan, Tianyu
2015-10-24 15:43       ` [Qemu-devel] " Lan, Tianyu
2015-10-24 15:43       ` Lan, Tianyu
2015-10-25  6:03       ` [Intel-wired-lan] " Alexander Duyck
2015-10-25  6:03         ` [Qemu-devel] " Alexander Duyck
2015-10-25  6:03         ` Alexander Duyck
2015-10-25  6:45         ` [Intel-wired-lan] " Lan, Tianyu
2015-10-25  6:45           ` [Qemu-devel] " Lan, Tianyu
2015-10-25  6:45           ` Lan, Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 06/12] IXGBEVF: Add self emulation layer Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 20:58   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 20:58     ` [Qemu-devel] " Alexander Duyck
2015-10-21 20:58     ` Alexander Duyck
2015-10-22 12:50     ` [Intel-wired-lan] [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:50       ` Michael S. Tsirkin
2015-10-22 12:50       ` Michael S. Tsirkin
2015-10-22 15:50       ` [Intel-wired-lan] " Alexander Duyck
2015-10-22 15:50         ` Alexander Duyck
2015-10-22 15:50         ` Alexander Duyck
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 07/12] IXGBEVF: Add new mail box event for migration Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 08/12] IXGBEVF: Rework code of finding the end transmit desc of package Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 21:14   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 21:14     ` [Qemu-devel] " Alexander Duyck
2015-10-21 21:14     ` Alexander Duyck
2015-10-24 16:12     ` [Intel-wired-lan] " Lan, Tianyu
2015-10-24 16:12       ` [Qemu-devel] " Lan, Tianyu
2015-10-24 16:12       ` Lan, Tianyu
2015-10-22 12:58   ` [Intel-wired-lan] " Michael S. Tsirkin
2015-10-22 12:58     ` [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:58     ` Michael S. Tsirkin
2015-10-24 16:08     ` [Intel-wired-lan] " Lan, Tianyu
2015-10-24 16:08       ` [Qemu-devel] " Lan, Tianyu
2015-10-24 16:08       ` Lan, Tianyu
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 09/12] IXGBEVF: Add live migration support for VF driver Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 21:48   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 21:48     ` [Qemu-devel] " Alexander Duyck
2015-10-21 21:48     ` Alexander Duyck
2015-10-22 12:46   ` [Intel-wired-lan] " Michael S. Tsirkin
2015-10-22 12:46     ` [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:46     ` Michael S. Tsirkin
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 10/12] IXGBEVF: Add lock to protect tx/rx ring operation Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-21 21:55   ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 21:55     ` [Qemu-devel] " Alexander Duyck
2015-10-21 21:55     ` Alexander Duyck
2015-10-22 12:40   ` Michael S. Tsirkin [this message]
2015-10-22 12:40     ` [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:40     ` Michael S. Tsirkin
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 11/12] IXGBEVF: Migrate VF statistic data Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-22 12:36   ` [Intel-wired-lan] " Michael S. Tsirkin
2015-10-22 12:36     ` [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:36     ` Michael S. Tsirkin
2015-10-22 12:36     ` Michael S. Tsirkin
2015-10-21 16:37 ` [Intel-wired-lan] [RFC Patch 12/12] IXGBEVF: Track dma dirty pages Lan Tianyu
2015-10-21 16:37   ` [Qemu-devel] " Lan Tianyu
2015-10-21 16:37   ` Lan Tianyu
2015-10-22 12:30   ` [Intel-wired-lan] " Michael S. Tsirkin
2015-10-22 12:30     ` [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:30     ` Michael S. Tsirkin
2015-10-21 18:45 ` [Intel-wired-lan] [RFC Patch 00/12] IXGBE: Add live migration support for SRIOV NIC Or Gerlitz
2015-10-21 18:45   ` [Qemu-devel] " Or Gerlitz
2015-10-21 18:45   ` Or Gerlitz
2015-10-21 19:20   ` [Intel-wired-lan] " Alex Williamson
2015-10-21 19:20     ` [Qemu-devel] " Alex Williamson
2015-10-21 19:20     ` Alex Williamson
2015-10-21 23:26     ` [Intel-wired-lan] " Alexander Duyck
2015-10-21 23:26       ` [Qemu-devel] " Alexander Duyck
2015-10-21 23:26       ` Alexander Duyck
2015-10-22 12:32     ` [Intel-wired-lan] [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:32       ` Michael S. Tsirkin
2015-10-22 12:32       ` Michael S. Tsirkin
2015-10-22 13:01       ` [Intel-wired-lan] " Alex Williamson
2015-10-22 13:01         ` Alex Williamson
2015-10-22 13:01         ` Alex Williamson
2015-10-22 13:06         ` [Intel-wired-lan] " Michael S. Tsirkin
2015-10-22 13:06           ` Michael S. Tsirkin
2015-10-22 13:06           ` Michael S. Tsirkin
2015-10-22 15:58     ` [Intel-wired-lan] " Or Gerlitz
2015-10-22 15:58       ` [Qemu-devel] " Or Gerlitz
2015-10-22 15:58       ` Or Gerlitz
2015-10-22 16:17       ` [Intel-wired-lan] " Alex Williamson
2015-10-22 16:17         ` [Qemu-devel] " Alex Williamson
2015-10-22 16:17         ` Alex Williamson
2015-10-22 12:55 ` [Intel-wired-lan] [Qemu-devel] " Michael S. Tsirkin
2015-10-22 12:55   ` Michael S. Tsirkin
2015-10-22 12:55   ` Michael S. Tsirkin
2015-10-23 18:36 ` [Intel-wired-lan] " Alexander Duyck
2015-10-23 18:36   ` [Qemu-devel] " Alexander Duyck
2015-10-23 18:36   ` Alexander Duyck
2015-10-23 19:05   ` [Intel-wired-lan] " Alex Williamson
2015-10-23 19:05     ` [Qemu-devel] " Alex Williamson
2015-10-23 19:05     ` Alex Williamson
2015-10-23 19:05     ` Alex Williamson
2015-10-23 20:01     ` [Intel-wired-lan] " Alexander Duyck
2015-10-23 20:01       ` [Qemu-devel] " Alexander Duyck
2015-10-23 20:01       ` Alexander Duyck
2015-10-26  5:36   ` [Intel-wired-lan] " Lan Tianyu
2015-10-26  5:36     ` [Qemu-devel] " Lan Tianyu
2015-10-26  5:36     ` Lan Tianyu
2015-10-26 15:03     ` [Intel-wired-lan] " Alexander Duyck
2015-10-26 15:03       ` [Qemu-devel] " Alexander Duyck
2015-10-26 15:03       ` Alexander Duyck
2015-10-29  6:12       ` [Intel-wired-lan] " Lan Tianyu
2015-10-29  6:12         ` [Qemu-devel] " Lan Tianyu
2015-10-29  6:12         ` Lan Tianyu
2015-10-29  6:58         ` [Intel-wired-lan] " Alexander Duyck
2015-10-29  6:58           ` [Qemu-devel] " Alexander Duyck
2015-10-29  6:58           ` Alexander Duyck
2015-10-29  8:33           ` [Intel-wired-lan] " Lan Tianyu
2015-10-29  8:33             ` [Qemu-devel] " Lan Tianyu
2015-10-29  8:33             ` Lan Tianyu
2015-10-29 16:17             ` [Intel-wired-lan] " Alexander Duyck
2015-10-29 16:17               ` [Qemu-devel] " Alexander Duyck
2015-10-29 16:17               ` Alexander Duyck
2015-10-30  2:41               ` [Intel-wired-lan] " Lan Tianyu
2015-10-30  2:41                 ` [Qemu-devel] " Lan Tianyu
2015-10-30  2:41                 ` Lan Tianyu
2015-10-30 18:04                 ` [Intel-wired-lan] " Alexander Duyck
2015-10-30 18:04                   ` [Qemu-devel] " Alexander Duyck
2015-10-30 18:04                   ` Alexander Duyck

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151022153756-mutt-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=intel-wired-lan@osuosl.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.