diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2008-10-07 17:22:33 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-10-07 17:22:33 -0400 |
commit | 654bed16cf86a9ef94495d9e6131b7ff7840a3dd (patch) | |
tree | 7d64fdb8de3e893b1acf5f420890a503a4e0327f | |
parent | c57943a1c96214ee68f3890bb6772841ffbfd606 (diff) |
net: packet split receive api
Add some packet-split receive hooks.
For one this allows to do NUMA node affine page allocs. Later on these
hooks will be extended to do emergency reserve allocations for
fragments.
Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/skbuff.h | 23 | ||||
-rw-r--r-- | net/core/skbuff.c | 20 |
2 files changed, 43 insertions, 0 deletions
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 720b688c22b6..2725f4e5a9bf 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -968,6 +968,9 @@ static inline void skb_fill_page_desc(struct sk_buff *skb, int i, | |||
968 | skb_shinfo(skb)->nr_frags = i + 1; | 968 | skb_shinfo(skb)->nr_frags = i + 1; |
969 | } | 969 | } |
970 | 970 | ||
971 | extern void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, | ||
972 | int off, int size); | ||
973 | |||
971 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) | 974 | #define SKB_PAGE_ASSERT(skb) BUG_ON(skb_shinfo(skb)->nr_frags) |
972 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list) | 975 | #define SKB_FRAG_ASSERT(skb) BUG_ON(skb_shinfo(skb)->frag_list) |
973 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) | 976 | #define SKB_LINEAR_ASSERT(skb) BUG_ON(skb_is_nonlinear(skb)) |
@@ -1382,6 +1385,26 @@ static inline struct sk_buff *netdev_alloc_skb(struct net_device *dev, | |||
1382 | return __netdev_alloc_skb(dev, length, GFP_ATOMIC); | 1385 | return __netdev_alloc_skb(dev, length, GFP_ATOMIC); |
1383 | } | 1386 | } |
1384 | 1387 | ||
1388 | extern struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask); | ||
1389 | |||
1390 | /** | ||
1391 | * netdev_alloc_page - allocate a page for ps-rx on a specific device | ||
1392 | * @dev: network device to receive on | ||
1393 | * | ||
1394 | * Allocate a new page node local to the specified device. | ||
1395 | * | ||
1396 | * %NULL is returned if there is no free memory. | ||
1397 | */ | ||
1398 | static inline struct page *netdev_alloc_page(struct net_device *dev) | ||
1399 | { | ||
1400 | return __netdev_alloc_page(dev, GFP_ATOMIC); | ||
1401 | } | ||
1402 | |||
1403 | static inline void netdev_free_page(struct net_device *dev, struct page *page) | ||
1404 | { | ||
1405 | __free_page(page); | ||
1406 | } | ||
1407 | |||
1385 | /** | 1408 | /** |
1386 | * skb_clone_writable - is the header of a clone writable | 1409 | * skb_clone_writable - is the header of a clone writable |
1387 | * @skb: buffer to check | 1410 | * @skb: buffer to check |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 8bd248a64879..7f7bb1a636d9 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -263,6 +263,26 @@ struct sk_buff *__netdev_alloc_skb(struct net_device *dev, | |||
263 | return skb; | 263 | return skb; |
264 | } | 264 | } |
265 | 265 | ||
266 | struct page *__netdev_alloc_page(struct net_device *dev, gfp_t gfp_mask) | ||
267 | { | ||
268 | int node = dev->dev.parent ? dev_to_node(dev->dev.parent) : -1; | ||
269 | struct page *page; | ||
270 | |||
271 | page = alloc_pages_node(node, gfp_mask, 0); | ||
272 | return page; | ||
273 | } | ||
274 | EXPORT_SYMBOL(__netdev_alloc_page); | ||
275 | |||
276 | void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off, | ||
277 | int size) | ||
278 | { | ||
279 | skb_fill_page_desc(skb, i, page, off, size); | ||
280 | skb->len += size; | ||
281 | skb->data_len += size; | ||
282 | skb->truesize += size; | ||
283 | } | ||
284 | EXPORT_SYMBOL(skb_add_rx_frag); | ||
285 | |||
266 | /** | 286 | /** |
267 | * dev_alloc_skb - allocate an skbuff for receiving | 287 | * dev_alloc_skb - allocate an skbuff for receiving |
268 | * @length: length to allocate | 288 | * @length: length to allocate |