diff -uNarp linux-2.6.9/drivers/xen/netfront/netfront.c linux-2.6.9.new/drivers/xen/netfront/netfront.c
--- linux-2.6.9/drivers/xen/netfront/netfront.c	2009-05-18 15:37:23.613777000 -0700
+++ linux-2.6.9.new/drivers/xen/netfront/netfront.c	2009-05-18 15:57:11.032777000 -0700
@@ -902,6 +902,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)) {
@@ -911,12 +912,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;
 	}
 
@@ -986,7 +987,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;
 
@@ -996,6 +997,14 @@ 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;
@@ -1995,6 +2004,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);
