--- linux-2.6.18.i386/drivers/xen/netfront/netfront.c.orig	2010-11-18 15:08:06.117310000 -0800
+++ linux-2.6.18.i386/drivers/xen/netfront/netfront.c	2010-11-18 15:13:55.960303000 -0800
@@ -936,6 +936,7 @@ static int network_start_xmit(struct sk_
 	int frags = skb_shinfo(skb)->nr_frags;
 	unsigned int offset = offset_in_page(data);
 	unsigned int len = skb_headlen(skb);
+	unsigned long flags;
 
 	frags += (offset + len + PAGE_SIZE - 1) / PAGE_SIZE;
 	if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
@@ -945,12 +946,12 @@ static int network_start_xmit(struct sk_
 		goto drop;
 	}
 
-	spin_lock_irq(&np->tx_lock);
+	spin_lock_irqsave(&np->tx_lock, flags);
 
 	if (unlikely(!netif_carrier_ok(dev) ||
 		     (frags > 1 && !xennet_can_sg(dev)) ||
 		     netif_needs_gso(dev, skb))) {
-		spin_unlock_irq(&np->tx_lock);
+		spin_unlock_irqrestore(&np->tx_lock, flags);
 		goto drop;
 	}
 
@@ -1020,7 +1021,7 @@ static int network_start_xmit(struct sk_
 	if (!netfront_tx_slot_available(np))
 		netif_stop_queue(dev);
 
-	spin_unlock_irq(&np->tx_lock);
+	spin_unlock_irqrestore(&np->tx_lock, flags);
 
 	return 0;
 
@@ -1030,6 +1031,15 @@ static int network_start_xmit(struct sk_
 	return 0;
 }
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+static void netif_poll_controller(struct net_device *dev)
+{
+
+	netif_int(NULL, dev, NULL);
+}
+#endif
+
+
 static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs)
 {
 	struct net_device *dev = dev_id;
@@ -2035,6 +2045,10 @@ static struct net_device * __devinit cre
 	netdev->weight          = 64;
 	netdev->features        = NETIF_F_IP_CSUM;
 
+#ifdef CONFIG_NET_POLL_CONTROLLER
+	netdev->poll_controller = netif_poll_controller;
+#endif
+
 	SET_ETHTOOL_OPS(netdev, &network_ethtool_ops);
 	SET_MODULE_OWNER(netdev);
 	SET_NETDEV_DEV(netdev, &dev->dev);
