aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netfront.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-28 11:26:12 -0400
commit7a9787e1eba95a166265e6a260cf30af04ef0a99 (patch)
treee730a4565e0318140d2fbd2f0415d18a339d7336 /drivers/net/xen-netfront.c
parent41b9eb264c8407655db57b60b4457fe1b2ec9977 (diff)
parent0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (diff)
Merge commit 'v2.6.28-rc2' into x86/pci-ioapic-boot-irq-quirks
Diffstat (limited to 'drivers/net/xen-netfront.c')
-rw-r--r--drivers/net/xen-netfront.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index ef671d1a3bf0..c6948d8f53f6 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -92,7 +92,7 @@ struct netfront_info {
92 */ 92 */
93 union skb_entry { 93 union skb_entry {
94 struct sk_buff *skb; 94 struct sk_buff *skb;
95 unsigned link; 95 unsigned long link;
96 } tx_skbs[NET_TX_RING_SIZE]; 96 } tx_skbs[NET_TX_RING_SIZE];
97 grant_ref_t gref_tx_head; 97 grant_ref_t gref_tx_head;
98 grant_ref_t grant_tx_ref[NET_TX_RING_SIZE]; 98 grant_ref_t grant_tx_ref[NET_TX_RING_SIZE];
@@ -125,6 +125,17 @@ struct netfront_rx_info {
125 struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1]; 125 struct xen_netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
126}; 126};
127 127
128static void skb_entry_set_link(union skb_entry *list, unsigned short id)
129{
130 list->link = id;
131}
132
133static int skb_entry_is_link(const union skb_entry *list)
134{
135 BUILD_BUG_ON(sizeof(list->skb) != sizeof(list->link));
136 return ((unsigned long)list->skb < PAGE_OFFSET);
137}
138
128/* 139/*
129 * Access macros for acquiring freeing slots in tx_skbs[]. 140 * Access macros for acquiring freeing slots in tx_skbs[].
130 */ 141 */
@@ -132,7 +143,7 @@ struct netfront_rx_info {
132static void add_id_to_freelist(unsigned *head, union skb_entry *list, 143static void add_id_to_freelist(unsigned *head, union skb_entry *list,
133 unsigned short id) 144 unsigned short id)
134{ 145{
135 list[id].link = *head; 146 skb_entry_set_link(&list[id], *head);
136 *head = id; 147 *head = id;
137} 148}
138 149
@@ -228,11 +239,14 @@ static void xennet_alloc_rx_buffers(struct net_device *dev)
228 */ 239 */
229 batch_target = np->rx_target - (req_prod - np->rx.rsp_cons); 240 batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
230 for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) { 241 for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
231 skb = __netdev_alloc_skb(dev, RX_COPY_THRESHOLD, 242 skb = __netdev_alloc_skb(dev, RX_COPY_THRESHOLD + NET_IP_ALIGN,
232 GFP_ATOMIC | __GFP_NOWARN); 243 GFP_ATOMIC | __GFP_NOWARN);
233 if (unlikely(!skb)) 244 if (unlikely(!skb))
234 goto no_skb; 245 goto no_skb;
235 246
247 /* Align ip header to a 16 bytes boundary */
248 skb_reserve(skb, NET_IP_ALIGN);
249
236 page = alloc_page(GFP_ATOMIC | __GFP_NOWARN); 250 page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
237 if (!page) { 251 if (!page) {
238 kfree_skb(skb); 252 kfree_skb(skb);
@@ -318,7 +332,7 @@ static int xennet_open(struct net_device *dev)
318 } 332 }
319 spin_unlock_bh(&np->rx_lock); 333 spin_unlock_bh(&np->rx_lock);
320 334
321 xennet_maybe_wake_tx(dev); 335 netif_start_queue(dev);
322 336
323 return 0; 337 return 0;
324} 338}
@@ -460,7 +474,7 @@ static int xennet_start_xmit(struct sk_buff *skb, struct net_device *dev)
460 unsigned int offset = offset_in_page(data); 474 unsigned int offset = offset_in_page(data);
461 unsigned int len = skb_headlen(skb); 475 unsigned int len = skb_headlen(skb);
462 476
463 frags += (offset + len + PAGE_SIZE - 1) / PAGE_SIZE; 477 frags += DIV_ROUND_UP(offset + len, PAGE_SIZE);
464 if (unlikely(frags > MAX_SKB_FRAGS + 1)) { 478 if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
465 printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n", 479 printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n",
466 frags); 480 frags);
@@ -993,7 +1007,7 @@ static void xennet_release_tx_bufs(struct netfront_info *np)
993 1007
994 for (i = 0; i < NET_TX_RING_SIZE; i++) { 1008 for (i = 0; i < NET_TX_RING_SIZE; i++) {
995 /* Skip over entries which are actually freelist references */ 1009 /* Skip over entries which are actually freelist references */
996 if ((unsigned long)np->tx_skbs[i].skb < PAGE_OFFSET) 1010 if (skb_entry_is_link(&np->tx_skbs[i]))
997 continue; 1011 continue;
998 1012
999 skb = np->tx_skbs[i].skb; 1013 skb = np->tx_skbs[i].skb;
@@ -1123,7 +1137,7 @@ static struct net_device * __devinit xennet_create_dev(struct xenbus_device *dev
1123 /* Initialise tx_skbs as a free chain containing every entry. */ 1137 /* Initialise tx_skbs as a free chain containing every entry. */
1124 np->tx_skb_freelist = 0; 1138 np->tx_skb_freelist = 0;
1125 for (i = 0; i < NET_TX_RING_SIZE; i++) { 1139 for (i = 0; i < NET_TX_RING_SIZE; i++) {
1126 np->tx_skbs[i].link = i+1; 1140 skb_entry_set_link(&np->tx_skbs[i], i+1);
1127 np->grant_tx_ref[i] = GRANT_INVALID_REF; 1141 np->grant_tx_ref[i] = GRANT_INVALID_REF;
1128 } 1142 }
1129 1143
@@ -1783,10 +1797,10 @@ static struct xenbus_driver netfront = {
1783 1797
1784static int __init netif_init(void) 1798static int __init netif_init(void)
1785{ 1799{
1786 if (!is_running_on_xen()) 1800 if (!xen_domain())
1787 return -ENODEV; 1801 return -ENODEV;
1788 1802
1789 if (is_initial_xendomain()) 1803 if (xen_initial_domain())
1790 return 0; 1804 return 0;
1791 1805
1792 printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n"); 1806 printk(KERN_INFO "Initialising Xen virtual ethernet driver.\n");
@@ -1798,7 +1812,7 @@ module_init(netif_init);
1798 1812
1799static void __exit netif_exit(void) 1813static void __exit netif_exit(void)
1800{ 1814{
1801 if (is_initial_xendomain()) 1815 if (xen_initial_domain())
1802 return; 1816 return;
1803 1817
1804 xenbus_unregister_driver(&netfront); 1818 xenbus_unregister_driver(&netfront);