The addition of VMDq support to ixgbe completely broke normal RSS
receive operation. Since RSS is the default operating mode, the
driver would cause a kernel panic as soon as the interface was opened.
This patch fixes the problem by correctly checking the VMDQ_ENABLED
flag before attempting any VMDQ-specific call.
Signed-off-by: Mitch Williams <mitch.a.williams@xxxxxxxxx>
diff -r fcc044a90d40 drivers/net/ixgbe/ixgbe_main.c
--- a/drivers/net/ixgbe/ixgbe_main.c Thu Jan 29 10:46:35 2009 +0000
+++ b/drivers/net/ixgbe/ixgbe_main.c Tue Feb 10 10:13:32 2009 -0800
@@ -432,15 +432,11 @@
u16 tag = le16_to_cpu(rx_desc->wb.upper.vlan);
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- if(ring->queue_index) {
+ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) && ring->queue_index) {
/* This is a VMDq packet destined for a VM. */
vmq_netif_rx(skb, ring->queue_index);
return;
}
- else {
- netif_rx(skb);
- return;
- }
#endif
#ifndef IXGBE_NO_INET_LRO
if (adapter->netdev->features & NETIF_F_LRO &&
@@ -524,7 +520,8 @@
adapter->hw_csum_rx_good++;
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- skb->proto_data_valid = 1;
+ if (adapter->flags & IXGBE_FLAG_VMDQ_ENABLED)
+ skb->proto_data_valid = 1;
#endif
}
@@ -1060,9 +1057,8 @@
skb = rx_buffer_info->skb;
rx_buffer_info->skb = NULL;
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- if(!rx_ring->queue_index || !skb_shinfo(skb)->nr_frags) {
- prefetch(skb->data - NET_IP_ALIGN);
- } else {
+ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) &&
+ rx_ring->queue_index) {
/* for Xen VMDq, packet data goes in first page of
* skb, instead of data.
*/
@@ -1071,6 +1067,8 @@
PAGE_SIZE, PCI_DMA_FROMDEVICE);
skb->len += len;
skb_shinfo(skb)->frags[0].size = len;
+ } else {
+ prefetch(skb->data - NET_IP_ALIGN);
}
#else
prefetch(skb->data - NET_IP_ALIGN);
@@ -1135,7 +1133,7 @@
total_rx_bytes += skb->len;
total_rx_packets++;
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- if(!rx_ring->queue_index)
+ if (skb->data)
#endif
skb->protocol = eth_type_trans(skb, adapter->netdev);
@@ -2907,7 +2905,8 @@
rx_buffer_info = &rx_ring->rx_buffer_info[i];
if (rx_buffer_info->skb) {
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- if (rx_ring->queue_index) {
+ if ((adapter->flags & IXGBE_FLAG_VMDQ_ENABLED) &&
+ rx_ring->queue_index) {
pci_unmap_page(pdev, rx_buffer_info->dma,
PAGE_SIZE,
PCI_DMA_FROMDEVICE);
diff -r fcc044a90d40 drivers/net/ixgbe/ixgbe_param.c
--- a/drivers/net/ixgbe/ixgbe_param.c Thu Jan 29 10:46:35 2009 +0000
+++ b/drivers/net/ixgbe/ixgbe_param.c Tue Feb 10 10:13:32 2009 -0800
@@ -724,8 +724,9 @@
}
#endif
#ifdef CONFIG_XEN_NETDEV2_BACKEND
- if (adapter->flags &
- (IXGBE_FLAG_RX_PS_CAPABLE | IXGBE_FLAG_VMDQ_ENABLED)) {
+ if ((adapter->flags &
+ (IXGBE_FLAG_RX_PS_CAPABLE | IXGBE_FLAG_VMDQ_ENABLED)) ==
+ (IXGBE_FLAG_RX_PS_CAPABLE | IXGBE_FLAG_VMDQ_ENABLED)) {
printk(KERN_INFO "ixgbe: packet split disabled for Xen VMDQ\n");
adapter->flags &= ~IXGBE_FLAG_RX_PS_CAPABLE;
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|