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@xxxxxxxxx [mailto:cluemerchant@xxxxxxxxx]
> On Behalf Of Mitch Williams
> Sent: Tuesday, February 17, 2009 3:44 PM
> To: xen-devel@xxxxxxxxxxxxxxxxxxx
> Cc: Santos, Jose Renato G; steven.smith@xxxxxxxxxxxxx
> 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@xxxxxxxxx>
>
> (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@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|