[Devel,RHEL7,COMMIT] ve/net: Restore default sock_alloc_send_pskb() changed by initial cumulative patch

Submitted by Konstantin Khorenko on Oct. 19, 2016, 10:10 a.m.

Details

Message ID 201610191010.u9JAAsZJ009610@finist_cl7.x64_64.work.ct
State New
Series "net: Restore default sock_alloc_send_pskb() changed by initial cumulative patch"
Headers show

Commit Message

Konstantin Khorenko Oct. 19, 2016, 10:10 a.m.
The commit is pushed to "branch-rh7-3.10.0-327.36.1.vz7.19.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-327.36.1.vz7.19.2
------>
commit 0a8cff5c40fe30893df7f0568521daa7cc1b2fe9
Author: Kirill Tkhai <ktkhai@virtuozzo.com>
Date:   Wed Oct 19 14:10:54 2016 +0400

    ve/net: Restore default sock_alloc_send_pskb() changed by initial cumulative patch
    
    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 <rkagan@virtuozzo.com>
    Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
    Reviewed-by: Roman Kagan <rkagan@virtuozzo.com>
---
 drivers/net/macvtap.c | 7 ++++++-
 drivers/net/tun.c     | 8 ++++++--
 2 files changed, 12 insertions(+), 3 deletions(-)

Patch hide | download patch | download mbox

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);