Some of pre-2.6.32 kernel need linear skb allocation for these places. The most probably, it's connected with problems of memory accounting then.
But now, these hunks creates problem for VMs, because allocation of continuous big skbs fails there. Restore the default behaviour to fix the problem. https://jira.sw.ru/browse/PSBM-52390 Reported-by: Roman Kagan <rka...@virtuozzo.com> Signed-off-by: Kirill Tkhai <ktk...@virtuozzo.com> --- diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c index a128823..d589b6d 100644 --- a/drivers/net/macvtap.c +++ b/drivers/net/macvtap.c @@ -605,7 +605,12 @@ static inline struct sk_buff *macvtap_alloc_skb(struct sock *sk, size_t prepad, { struct sk_buff *skb; - skb = sock_alloc_send_skb(sk, prepad + linear, noblock, err); + /* Under a page? Don't bother with paged skb. */ + if (prepad + len < PAGE_SIZE || !linear) + linear = len; + + skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock, + err, 0); if (!skb) return NULL; diff --git a/drivers/net/tun.c b/drivers/net/tun.c index dabe51c..75c627b 100644 --- a/drivers/net/tun.c +++ b/drivers/net/tun.c @@ -1028,8 +1028,12 @@ static struct sk_buff *tun_alloc_skb(struct tun_file *tfile, struct sk_buff *skb; int err; - linear = len; - skb = sock_alloc_send_skb(sk, prepad + linear, noblock, &err); + /* Under a page? Don't bother with paged skb. */ + if (prepad + len < PAGE_SIZE || !linear) + linear = len; + + skb = sock_alloc_send_pskb(sk, prepad + linear, len - linear, noblock, + &err, 0); if (!skb) return ERR_PTR(err); _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel