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);
ixgbe-onecpu.patch
Description: Binary data
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|