From: Jonathan Lemon <b...@fb.com>

Currently, an ubuf is attached to a new skb, the skb zc_flags
is initialized to a fixed value.  Instead of doing this, set
the default zc_flags in the ubuf, and have new skb's inherit
from this default.

This is needed when setting up different zerocopy types.

Signed-off-by: Jonathan Lemon <jonathan.le...@gmail.com>
---
 include/linux/skbuff.h | 3 ++-
 net/core/skbuff.c      | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index a50d52b796a7..65ef46b02f65 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -478,6 +478,7 @@ struct ubuf_info {
                };
        };
        refcount_t refcnt;
+       u8 zc_flags;
 
        struct mmpin {
                struct user_struct *user;
@@ -1454,7 +1455,7 @@ static inline void skb_zcopy_set(struct sk_buff *skb, 
struct ubuf_info *uarg,
                else
                        skb_zcopy_get(uarg);
                skb_shinfo(skb)->destructor_arg = uarg;
-               skb_shinfo(skb)->zc_flags |= SKBZC_FRAGMENTS;
+               skb_shinfo(skb)->zc_flags |= uarg->zc_flags;
        }
 }
 
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 8352da29f052..463078ba663f 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -1118,6 +1118,7 @@ struct ubuf_info *sock_zerocopy_alloc(struct sock *sk, 
size_t size)
        uarg->len = 1;
        uarg->bytelen = size;
        uarg->zerocopy = 1;
+       uarg->zc_flags = SKBZC_FRAGMENTS;
        refcount_set(&uarg->refcnt, 1);
        sock_hold(sk);
 
-- 
2.24.1

Reply via email to