Change the skb allocation api to indicate RX usage and use this to fall back to
the reserve when needed. Skbs allocated from the reserve are tagged in
skb->emergency.
Teach all other skb ops about emergency skbs and the reserve accounting.
Use the (new) packet split API to allocate and track fragment pages from the
emergency reserve. Do this using an atomic counter in page->index. This is
needed because the fragments have a different sharing semantic than that
indicated by skb_shinfo()->dataref.
(NOTE the extra atomic overhead is only for those pages allocated from the
reserves - it does not affect the normal fast path.)
Signed-off-by: Peter Zijlstra <a.p.zijlstra@xxxxxxxxx>
---
include/linux/skbuff.h | 22 +++++-
net/core/skbuff.c | 161 ++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 157 insertions(+), 26 deletions(-)
+#define skb_alloc_rx(skb) (skb_emergency(skb) ? SKB_ALLOC_RX : 0)