diff options
author | Ingo Molnar <mingo@elte.hu> | 2008-10-28 11:26:12 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-10-28 11:26:12 -0400 |
commit | 7a9787e1eba95a166265e6a260cf30af04ef0a99 (patch) | |
tree | e730a4565e0318140d2fbd2f0415d18a339d7336 /drivers/net/xen-netfront.c | |
parent | 41b9eb264c8407655db57b60b4457fe1b2ec9977 (diff) | |
parent | 0173a3265b228da319ceb9c1ec6a5682fd1b2d92 (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.c | 34 |
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 | ||
128 | static void skb_entry_set_link(union skb_entry *list, unsigned short id) | ||
129 | { | ||
130 | list->link = id; | ||
131 | } | ||
132 | |||
133 | static 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 { | |||
132 | static void add_id_to_freelist(unsigned *head, union skb_entry *list, | 143 | static 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 | ||
1784 | static int __init netif_init(void) | 1798 | static 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 | ||
1799 | static void __exit netif_exit(void) | 1813 | static 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); |