Mitch Williams
2009-Feb-17 23:44 UTC
[Xen-devel] [PATCH ixgbe] Fix VMDq operation when maxcpus=1
Renato reported a crash in ixgbe when the Dom0 kernel was booted with maxcpus=1. Added checks to the single-vector code path to make sure we don''t call any vmq functions before the ring is activated. Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> (Patch is attached as well as inline due to previous issue with mangled patches.) diff -r 9681e69b222b drivers/net/ixgbe/ixgbe_main.c --- a/drivers/net/ixgbe/ixgbe_main.c Thu Feb 12 17:38:15 2009 +0000 +++ b/drivers/net/ixgbe/ixgbe_main.c Tue Feb 17 14:06:44 2009 -0800 @@ -541,6 +541,11 @@ i = rx_ring->next_to_use; bi = &rx_ring->rx_buffer_info[i]; +#ifdef CONFIG_XEN_NETDEV2_VMQ + if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && + (!rx_ring->active)) + return; +#endif while (cleaned_count--) { rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); @@ -1123,7 +1128,13 @@ /* ERR_MASK will only have valid bits if EOP set */ if (unlikely(staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) { - dev_kfree_skb_irq(skb); +#ifdef CONFIG_XEN_NETDEV2_VMQ + if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && + rx_ring->queue_index) + vmq_free_skb(skb, rx_ring->queue_index); + else +#endif + dev_kfree_skb_irq(skb); goto next_desc; } @@ -1600,7 +1611,8 @@ ixgbe_update_rx_dca(adapter, rx_ring); #endif - ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); + if (rx_ring->active) + ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); /* If all Rx work done, exit the polling mode */ if ((work_done == 0) || !netif_running(adapter->netdev)) { @@ -1644,7 +1656,9 @@ if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) ixgbe_update_rx_dca(adapter, rx_ring); #endif - ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); + if (rx_ring->active) + ixgbe_clean_rx_irq(adapter, rx_ring, + &work_done, budget); enable_mask |= rx_ring->v_idx; r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, r_idx + 1); _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Steven Smith
2009-Feb-18 14:10 UTC
[Xen-devel] Re: [PATCH ixgbe] Fix VMDq operation when maxcpus=1
Applied, thanks. Steven.> Renato reported a crash in ixgbe when the Dom0 kernel was booted with > maxcpus=1. > > Added checks to the single-vector code path to make sure we don''t call > any vmq functions before the ring is activated. > > Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> > > (Patch is attached as well as inline due to previous issue with > mangled patches.) > > diff -r 9681e69b222b drivers/net/ixgbe/ixgbe_main.c > --- a/drivers/net/ixgbe/ixgbe_main.c Thu Feb 12 17:38:15 2009 +0000 > +++ b/drivers/net/ixgbe/ixgbe_main.c Tue Feb 17 14:06:44 2009 -0800 > @@ -541,6 +541,11 @@ > > i = rx_ring->next_to_use; > bi = &rx_ring->rx_buffer_info[i]; > +#ifdef CONFIG_XEN_NETDEV2_VMQ > + if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && > + (!rx_ring->active)) > + return; > +#endif > > while (cleaned_count--) { > rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); > @@ -1123,7 +1128,13 @@ > > /* ERR_MASK will only have valid bits if EOP set */ > if (unlikely(staterr & IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) { > - dev_kfree_skb_irq(skb); > +#ifdef CONFIG_XEN_NETDEV2_VMQ > + if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && > + rx_ring->queue_index) > + vmq_free_skb(skb, rx_ring->queue_index); > + else > +#endif > + dev_kfree_skb_irq(skb); > goto next_desc; > } > > @@ -1600,7 +1611,8 @@ > ixgbe_update_rx_dca(adapter, rx_ring); > #endif > > - ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); > + if (rx_ring->active) > + ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); > > /* If all Rx work done, exit the polling mode */ > if ((work_done == 0) || !netif_running(adapter->netdev)) { > @@ -1644,7 +1656,9 @@ > if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) > ixgbe_update_rx_dca(adapter, rx_ring); > #endif > - ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); > + if (rx_ring->active) > + ixgbe_clean_rx_irq(adapter, rx_ring, > + &work_done, budget); > enable_mask |= rx_ring->v_idx; > r_idx = find_next_bit(q_vector->rxr_idx, adapter->num_rx_queues, > r_idx + 1);_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel
Santos, Jose Renato G
2009-Feb-19 06:39 UTC
[Xen-devel] RE: [PATCH ixgbe] Fix VMDq operation when maxcpus=1
Yes, this patch fixes the problem I was seeing when running dom0 with one CPU. I am now able to use VMDq with the ixgbe driver using the current netchannel2 tree. Thanks Mitch Renato> -----Original Message----- > From: cluemerchant@gmail.com [mailto:cluemerchant@gmail.com] > On Behalf Of Mitch Williams > Sent: Tuesday, February 17, 2009 3:44 PM > To: xen-devel@lists.xensource.com > Cc: Santos, Jose Renato G; steven.smith@eu.citrix.com > Subject: [PATCH ixgbe] Fix VMDq operation when maxcpus=1 > > Renato reported a crash in ixgbe when the Dom0 kernel was > booted with maxcpus=1. > > Added checks to the single-vector code path to make sure we > don''t call any vmq functions before the ring is activated. > > Signed-off-by: Mitch Williams <mitch.a.williams@intel.com> > > (Patch is attached as well as inline due to previous issue > with mangled patches.) > > diff -r 9681e69b222b drivers/net/ixgbe/ixgbe_main.c > --- a/drivers/net/ixgbe/ixgbe_main.c Thu Feb 12 17:38:15 2009 +0000 > +++ b/drivers/net/ixgbe/ixgbe_main.c Tue Feb 17 14:06:44 2009 -0800 > @@ -541,6 +541,11 @@ > > i = rx_ring->next_to_use; > bi = &rx_ring->rx_buffer_info[i]; > +#ifdef CONFIG_XEN_NETDEV2_VMQ > + if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && > + (!rx_ring->active)) > + return; > +#endif > > while (cleaned_count--) { > rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); @@ > -1123,7 +1128,13 @@ > > /* ERR_MASK will only have valid bits if EOP set */ > if (unlikely(staterr & > IXGBE_RXDADV_ERR_FRAME_ERR_MASK)) { > - dev_kfree_skb_irq(skb); > +#ifdef CONFIG_XEN_NETDEV2_VMQ > + if ((adapter->flags & > IXGBE_FLAG_VMDQ_ENABLED) && > + rx_ring->queue_index) > + vmq_free_skb(skb, rx_ring->queue_index); > + else > +#endif > + dev_kfree_skb_irq(skb); > goto next_desc; > } > > @@ -1600,7 +1611,8 @@ > ixgbe_update_rx_dca(adapter, rx_ring); #endif > > - ixgbe_clean_rx_irq(adapter, rx_ring, &work_done, budget); > + if (rx_ring->active) > + ixgbe_clean_rx_irq(adapter, rx_ring, > &work_done, budget); > > /* If all Rx work done, exit the polling mode */ > if ((work_done == 0) || > !netif_running(adapter->netdev)) { @@ -1644,7 +1656,9 @@ > if (adapter->flags & IXGBE_FLAG_DCA_ENABLED) > ixgbe_update_rx_dca(adapter, rx_ring); #endif > - ixgbe_clean_rx_irq(adapter, rx_ring, > &work_done, budget); > + if (rx_ring->active) > + ixgbe_clean_rx_irq(adapter, rx_ring, > + &work_done, budget); > enable_mask |= rx_ring->v_idx; > r_idx = find_next_bit(q_vector->rxr_idx, > adapter->num_rx_queues, > r_idx + 1); >_______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel