[net-next,v3,3/3] net: add netmem_ref to skb_frag_t

Message ID 20231220214505.2303297-4-almasrymina@google.com
State New
Headers
Series Abstract page from net stack |

Commit Message

Mina Almasry Dec. 20, 2023, 9:45 p.m. UTC
  Use netmem_ref instead of page in skb_frag_t. Currently netmem_ref
is always a struct page underneath, but the abstraction allows efforts
to add support for skb frags not backed by pages.

There is unfortunately 1 instance where the skb_frag_t is assumed to be
a bio_vec in kcm. For this case, add a debug assert that the skb frag is
indeed backed by a page, and do a cast.

Add skb[_frag]_fill_netmem_*() and skb_add_rx_frag_netmem() helpers so
that the API can be used to create netmem skbs.

Signed-off-by: Mina Almasry <almasrymina@google.com>

---

v3;
- Renamed the fields in skb_frag_t.

v2:
- Add skb frag filling helpers.

---
 include/linux/skbuff.h | 92 +++++++++++++++++++++++++++++-------------
 net/core/skbuff.c      | 22 +++++++---
 net/kcm/kcmsock.c      | 10 ++++-
 3 files changed, 89 insertions(+), 35 deletions(-)
  

Comments

Simon Horman Dec. 21, 2023, 5:16 p.m. UTC | #1
On Wed, Dec 20, 2023 at 01:45:02PM -0800, Mina Almasry wrote:
> Use netmem_ref instead of page in skb_frag_t. Currently netmem_ref
> is always a struct page underneath, but the abstraction allows efforts
> to add support for skb frags not backed by pages.
> 
> There is unfortunately 1 instance where the skb_frag_t is assumed to be
> a bio_vec in kcm. For this case, add a debug assert that the skb frag is
> indeed backed by a page, and do a cast.
> 
> Add skb[_frag]_fill_netmem_*() and skb_add_rx_frag_netmem() helpers so
> that the API can be used to create netmem skbs.
> 
> Signed-off-by: Mina Almasry <almasrymina@google.com>

...

> diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
> index 65d1f6755f98..3180a54b2c68 100644
> --- a/net/kcm/kcmsock.c
> +++ b/net/kcm/kcmsock.c
> @@ -636,9 +636,15 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
>  		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
>  			msize += skb_shinfo(skb)->frags[i].bv_len;
>  
> +		/* The cast to struct bio_vec* here assumes the frags are
> +		 * struct page based. WARN if there is no page in this skb.
> +		 */
> +		DEBUG_NET_WARN_ON_ONCE(
> +			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
> +
>  		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
> -			      skb_shinfo(skb)->frags, skb_shinfo(skb)->nr_frags,
> -			      msize);
> +			      (const struct bio_vec *)skb_shinfo(skb)->frags,
> +			      skb_shinfo(skb)->nr_frags, msize);
>  		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
>  
>  		do {

Hi Mina,

something isn't quite right here.

  ...//kcmsock.c:637:39: error: no member named 'bv_len' in 'struct skb_frag'
  637 |                         msize += skb_shinfo(skb)->frags[i].bv_len;
      |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~ ^
  
Willem de Bruijn Dec. 21, 2023, 5:18 p.m. UTC | #2
Mina Almasry wrote:
> Use netmem_ref instead of page in skb_frag_t. Currently netmem_ref
> is always a struct page underneath, but the abstraction allows efforts
> to add support for skb frags not backed by pages.
> 
> There is unfortunately 1 instance where the skb_frag_t is assumed to be
> a bio_vec in kcm. For this case, add a debug assert that the skb frag is
> indeed backed by a page, and do a cast.
> 
> Add skb[_frag]_fill_netmem_*() and skb_add_rx_frag_netmem() helpers so
> that the API can be used to create netmem skbs.
> 
> Signed-off-by: Mina Almasry <almasrymina@google.com>
> 
> ---
> 
> v3;
> - Renamed the fields in skb_frag_t.
> 
> v2:
> - Add skb frag filling helpers.
> 
> ---
>  include/linux/skbuff.h | 92 +++++++++++++++++++++++++++++-------------
>  net/core/skbuff.c      | 22 +++++++---
>  net/kcm/kcmsock.c      | 10 ++++-
>  3 files changed, 89 insertions(+), 35 deletions(-)
> 
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 7ce38874dbd1..729c95e97be1 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -37,6 +37,7 @@
>  #endif
>  #include <net/net_debug.h>
>  #include <net/dropreason-core.h>
> +#include <net/netmem.h>
>  
>  /**
>   * DOC: skb checksums
> @@ -359,7 +360,11 @@ extern int sysctl_max_skb_frags;
>   */
>  #define GSO_BY_FRAGS	0xFFFF
>  
> -typedef struct bio_vec skb_frag_t;
> +typedef struct skb_frag {
> +	netmem_ref netmem;
> +	unsigned int len;
> +	unsigned int offset;
> +} skb_frag_t;
>  
>  /**
>   * skb_frag_size() - Returns the size of a skb fragment
> @@ -367,7 +372,7 @@ typedef struct bio_vec skb_frag_t;
>   */
>  static inline unsigned int skb_frag_size(const skb_frag_t *frag)
>  {
> -	return frag->bv_len;
> +	return frag->len;
>  }
>  
>  /**
> @@ -377,7 +382,7 @@ static inline unsigned int skb_frag_size(const skb_frag_t *frag)
>   */
>  static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
>  {
> -	frag->bv_len = size;
> +	frag->len = size;
>  }
>  
>  /**
> @@ -387,7 +392,7 @@ static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
>   */
>  static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
>  {
> -	frag->bv_len += delta;
> +	frag->len += delta;
>  }
>  
>  /**
> @@ -397,7 +402,7 @@ static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
>   */
>  static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
>  {
> -	frag->bv_len -= delta;
> +	frag->len -= delta;
>  }
>  
>  /**
> @@ -417,7 +422,7 @@ static inline bool skb_frag_must_loop(struct page *p)
>   *	skb_frag_foreach_page - loop over pages in a fragment
>   *
>   *	@f:		skb frag to operate on
> - *	@f_off:		offset from start of f->bv_page
> + *	@f_off:		offset from start of f->netmem
>   *	@f_len:		length from f_off to loop over
>   *	@p:		(temp var) current page
>   *	@p_off:		(temp var) offset from start of current page,
> @@ -2431,22 +2436,37 @@ static inline unsigned int skb_pagelen(const struct sk_buff *skb)
>  	return skb_headlen(skb) + __skb_pagelen(skb);
>  }
>  
> +static inline void skb_frag_fill_netmem_desc(skb_frag_t *frag,
> +					     netmem_ref netmem, int off,
> +					     int size)
> +{
> +	frag->netmem = netmem;
> +	frag->offset = off;
> +	skb_frag_size_set(frag, size);
> +}
> +
>  static inline void skb_frag_fill_page_desc(skb_frag_t *frag,
>  					   struct page *page,
>  					   int off, int size)
>  {
> -	frag->bv_page = page;
> -	frag->bv_offset = off;
> -	skb_frag_size_set(frag, size);
> +	skb_frag_fill_netmem_desc(frag, page_to_netmem(page), off, size);
> +}
> +
> +static inline void __skb_fill_netmem_desc_noacc(struct skb_shared_info *shinfo,
> +						int i, netmem_ref netmem,
> +						int off, int size)
> +{
> +	skb_frag_t *frag = &shinfo->frags[i];
> +
> +	skb_frag_fill_netmem_desc(frag, netmem, off, size);
>  }
>  
>  static inline void __skb_fill_page_desc_noacc(struct skb_shared_info *shinfo,
>  					      int i, struct page *page,
>  					      int off, int size)
>  {
> -	skb_frag_t *frag = &shinfo->frags[i];
> -
> -	skb_frag_fill_page_desc(frag, page, off, size);
> +	__skb_fill_netmem_desc_noacc(shinfo, i, page_to_netmem(page), off,
> +				     size);
>  }
>  
>  /**
> @@ -2462,10 +2482,10 @@ static inline void skb_len_add(struct sk_buff *skb, int delta)
>  }
>  
>  /**
> - * __skb_fill_page_desc - initialise a paged fragment in an skb
> + * __skb_fill_netmem_desc - initialise a fragment in an skb
>   * @skb: buffer containing fragment to be initialised
> - * @i: paged fragment index to initialise
> - * @page: the page to use for this fragment
> + * @i: fragment index to initialise
> + * @netmem: the netmem to use for this fragment
>   * @off: the offset to the data with @page
>   * @size: the length of the data
>   *
> @@ -2474,10 +2494,13 @@ static inline void skb_len_add(struct sk_buff *skb, int delta)
>   *
>   * Does not take any additional reference on the fragment.
>   */
> -static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
> -					struct page *page, int off, int size)
> +static inline void __skb_fill_netmem_desc(struct sk_buff *skb, int i,
> +					  netmem_ref netmem, int off,
> +					  int size)
>  {
> -	__skb_fill_page_desc_noacc(skb_shinfo(skb), i, page, off, size);
> +	struct page *page = netmem_to_page(netmem);
> +
> +	__skb_fill_netmem_desc_noacc(skb_shinfo(skb), i, netmem, off, size);
>  
>  	/* Propagate page pfmemalloc to the skb if we can. The problem is
>  	 * that not all callers have unique ownership of the page but rely
> @@ -2485,7 +2508,21 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
>  	 */
>  	page = compound_head(page);
>  	if (page_is_pfmemalloc(page))
> -		skb->pfmemalloc	= true;
> +		skb->pfmemalloc = true;
> +}
> +
> +static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
> +					struct page *page, int off, int size)
> +{
> +	__skb_fill_netmem_desc(skb, i, page_to_netmem(page), off, size);
> +}
> +
> +static inline void skb_fill_netmem_desc(struct sk_buff *skb, int i,
> +					netmem_ref netmem, int off,
> +					int size)
> +{
> +	__skb_fill_netmem_desc(skb, i, netmem, off, size);
> +	skb_shinfo(skb)->nr_frags = i + 1;
>  }
>  
>  /**
> @@ -2505,8 +2542,7 @@ static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
>  static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
>  				      struct page *page, int off, int size)
>  {
> -	__skb_fill_page_desc(skb, i, page, off, size);
> -	skb_shinfo(skb)->nr_frags = i + 1;
> +	skb_fill_netmem_desc(skb, i, page_to_netmem(page), off, size);
>  }
>  
>  /**
> @@ -2532,6 +2568,8 @@ static inline void skb_fill_page_desc_noacc(struct sk_buff *skb, int i,
>  
>  void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
>  		     int size, unsigned int truesize);
> +void skb_add_rx_frag_netmem(struct sk_buff *skb, int i, netmem_ref netmem,
> +			    int off, int size, unsigned int truesize);
>  
>  void skb_coalesce_rx_frag(struct sk_buff *skb, int i, int size,
>  			  unsigned int truesize);
> @@ -3380,7 +3418,7 @@ static inline void skb_propagate_pfmemalloc(const struct page *page,
>   */
>  static inline unsigned int skb_frag_off(const skb_frag_t *frag)
>  {
> -	return frag->bv_offset;
> +	return frag->offset;
>  }
>  
>  /**
> @@ -3390,7 +3428,7 @@ static inline unsigned int skb_frag_off(const skb_frag_t *frag)
>   */
>  static inline void skb_frag_off_add(skb_frag_t *frag, int delta)
>  {
> -	frag->bv_offset += delta;
> +	frag->offset += delta;
>  }
>  
>  /**
> @@ -3400,7 +3438,7 @@ static inline void skb_frag_off_add(skb_frag_t *frag, int delta)
>   */
>  static inline void skb_frag_off_set(skb_frag_t *frag, unsigned int offset)
>  {
> -	frag->bv_offset = offset;
> +	frag->offset = offset;
>  }
>  
>  /**
> @@ -3411,7 +3449,7 @@ static inline void skb_frag_off_set(skb_frag_t *frag, unsigned int offset)
>  static inline void skb_frag_off_copy(skb_frag_t *fragto,
>  				     const skb_frag_t *fragfrom)
>  {
> -	fragto->bv_offset = fragfrom->bv_offset;
> +	fragto->offset = fragfrom->offset;
>  }
>  
>  /**
> @@ -3422,7 +3460,7 @@ static inline void skb_frag_off_copy(skb_frag_t *fragto,
>   */
>  static inline struct page *skb_frag_page(const skb_frag_t *frag)
>  {
> -	return frag->bv_page;
> +	return netmem_to_page(frag->netmem);
>  }
>  
>  /**
> @@ -3526,7 +3564,7 @@ static inline void *skb_frag_address_safe(const skb_frag_t *frag)
>  static inline void skb_frag_page_copy(skb_frag_t *fragto,
>  				      const skb_frag_t *fragfrom)
>  {
> -	fragto->bv_page = fragfrom->bv_page;
> +	fragto->netmem = fragfrom->netmem;
>  }
>  
>  bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio);
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index 4d4b11b0a83d..8b55e927bbe9 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -845,16 +845,24 @@ struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
>  }
>  EXPORT_SYMBOL(__napi_alloc_skb);
>  
> -void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
> -		     int size, unsigned int truesize)
> +void skb_add_rx_frag_netmem(struct sk_buff *skb, int i, netmem_ref netmem,
> +			    int off, int size, unsigned int truesize)
>  {
>  	DEBUG_NET_WARN_ON_ONCE(size > truesize);
>  
> -	skb_fill_page_desc(skb, i, page, off, size);
> +	skb_fill_netmem_desc(skb, i, netmem, off, size);
>  	skb->len += size;
>  	skb->data_len += size;
>  	skb->truesize += truesize;
>  }
> +EXPORT_SYMBOL(skb_add_rx_frag_netmem);
> +
> +void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
> +		     int size, unsigned int truesize)
> +{
> +	skb_add_rx_frag_netmem(skb, i, page_to_netmem(page), off, size,
> +			       truesize);
> +}
>  EXPORT_SYMBOL(skb_add_rx_frag);
>  
>  void skb_coalesce_rx_frag(struct sk_buff *skb, int i, int size,
> @@ -1904,10 +1912,11 @@ int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
>  
>  	/* skb frags point to kernel buffers */
>  	for (i = 0; i < new_frags - 1; i++) {
> -		__skb_fill_page_desc(skb, i, head, 0, psize);
> +		__skb_fill_netmem_desc(skb, i, page_to_netmem(head), 0, psize);
>  		head = (struct page *)page_private(head);
>  	}
> -	__skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off);
> +	__skb_fill_netmem_desc(skb, new_frags - 1, page_to_netmem(head), 0,
> +			       d_off);
>  	skb_shinfo(skb)->nr_frags = new_frags;
>  
>  release:
> @@ -3645,7 +3654,8 @@ skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, int hlen)
>  		if (plen) {
>  			page = virt_to_head_page(from->head);
>  			offset = from->data - (unsigned char *)page_address(page);
> -			__skb_fill_page_desc(to, 0, page, offset, plen);
> +			__skb_fill_netmem_desc(to, 0, page_to_netmem(page),
> +					       offset, plen);
>  			get_page(page);
>  			j = 1;
>  			len -= plen;
> diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
> index 65d1f6755f98..3180a54b2c68 100644
> --- a/net/kcm/kcmsock.c
> +++ b/net/kcm/kcmsock.c
> @@ -636,9 +636,15 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
>  		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
>  			msize += skb_shinfo(skb)->frags[i].bv_len;
>  
> +		/* The cast to struct bio_vec* here assumes the frags are
> +		 * struct page based. WARN if there is no page in this skb.
> +		 */
> +		DEBUG_NET_WARN_ON_ONCE(
> +			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
> +

It would be unsafe to continue the operation in this case. Even though
we should never get here, test and exit in all codepaths, similar to
other test above?

                if (WARN_ON(!skb_shinfo(skb)->nr_frags)) {
                        ret = -EINVAL;
                        goto out;
                }

>  		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
> -			      skb_shinfo(skb)->frags, skb_shinfo(skb)->nr_frags,
> -			      msize);
> +			      (const struct bio_vec *)skb_shinfo(skb)->frags,
> +			      skb_shinfo(skb)->nr_frags, msize);
>  		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
>  
>  		do {
> -- 
> 2.43.0.472.g3155946c3a-goog
>
  
Shakeel Butt Dec. 21, 2023, 11:27 p.m. UTC | #3
On Wed, Dec 20, 2023 at 01:45:02PM -0800, Mina Almasry wrote:
> diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
> index 65d1f6755f98..3180a54b2c68 100644
> --- a/net/kcm/kcmsock.c
> +++ b/net/kcm/kcmsock.c
> @@ -636,9 +636,15 @@ static int kcm_write_msgs(struct kcm_sock *kcm)
>  		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
>  			msize += skb_shinfo(skb)->frags[i].bv_len;

Don't you need the above to cast to bio_vec to get bv_len? skb_frag_t
does not have bv_len anymore.

>  
> +		/* The cast to struct bio_vec* here assumes the frags are
> +		 * struct page based. WARN if there is no page in this skb.
> +		 */
> +		DEBUG_NET_WARN_ON_ONCE(
> +			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
> +
>  		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
> -			      skb_shinfo(skb)->frags, skb_shinfo(skb)->nr_frags,
> -			      msize);
> +			      (const struct bio_vec *)skb_shinfo(skb)->frags,
> +			      skb_shinfo(skb)->nr_frags, msize);
>  		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
>  
>  		do {
> -- 
> 2.43.0.472.g3155946c3a-goog
>
  
kernel test robot Dec. 22, 2023, 8:10 p.m. UTC | #4
Hi Mina,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Mina-Almasry/vsock-virtio-use-skb_frag_-helpers/20231222-164637
base:   net-next/main
patch link:    https://lore.kernel.org/r/20231220214505.2303297-4-almasrymina%40google.com
patch subject: [PATCH net-next v3 3/3] net: add netmem_ref to skb_frag_t
config: powerpc-allmodconfig (https://download.01.org/0day-ci/archive/20231223/202312230340.iCf8sOop-lkp@intel.com/config)
compiler: clang version 18.0.0git (https://github.com/llvm/llvm-project d3ef86708241a3bee902615c190dead1638c4e09)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231223/202312230340.iCf8sOop-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312230340.iCf8sOop-lkp@intel.com/

All errors (new ones prefixed by >>):

>> net/kcm/kcmsock.c:637:39: error: no member named 'bv_len' in 'struct skb_frag'
     637 |                         msize += skb_shinfo(skb)->frags[i].bv_len;
         |                                  ~~~~~~~~~~~~~~~~~~~~~~~~~ ^
   1 error generated.


vim +637 net/kcm/kcmsock.c

cd6e111bf5be5c Tom Herbert       2016-03-07  578  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  579  /* Write any messages ready on the kcm socket.  Called with kcm sock lock
ab7ac4eb9832e3 Tom Herbert       2016-03-07  580   * held.  Return bytes actually sent or error.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  581   */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  582  static int kcm_write_msgs(struct kcm_sock *kcm)
ab7ac4eb9832e3 Tom Herbert       2016-03-07  583  {
c31a25e1db486f David Howells     2023-06-09  584  	unsigned int total_sent = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  585  	struct sock *sk = &kcm->sk;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  586  	struct kcm_psock *psock;
c31a25e1db486f David Howells     2023-06-09  587  	struct sk_buff *head;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  588  	int ret = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  589  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  590  	kcm->tx_wait_more = false;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  591  	psock = kcm->tx_psock;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  592  	if (unlikely(psock && psock->tx_stopped)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  593  		/* A reserved psock was aborted asynchronously. Unreserve
ab7ac4eb9832e3 Tom Herbert       2016-03-07  594  		 * it and we'll retry the message.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  595  		 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  596  		unreserve_psock(kcm);
cd6e111bf5be5c Tom Herbert       2016-03-07  597  		kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  598  		if (skb_queue_empty(&sk->sk_write_queue))
ab7ac4eb9832e3 Tom Herbert       2016-03-07  599  			return 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  600  
c31a25e1db486f David Howells     2023-06-09  601  		kcm_tx_msg(skb_peek(&sk->sk_write_queue))->started_tx = false;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  602  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  603  
c31a25e1db486f David Howells     2023-06-09  604  retry:
c31a25e1db486f David Howells     2023-06-09  605  	while ((head = skb_peek(&sk->sk_write_queue))) {
c31a25e1db486f David Howells     2023-06-09  606  		struct msghdr msg = {
c31a25e1db486f David Howells     2023-06-09  607  			.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,
c31a25e1db486f David Howells     2023-06-09  608  		};
c31a25e1db486f David Howells     2023-06-09  609  		struct kcm_tx_msg *txm = kcm_tx_msg(head);
c31a25e1db486f David Howells     2023-06-09  610  		struct sk_buff *skb;
c31a25e1db486f David Howells     2023-06-09  611  		unsigned int msize;
c31a25e1db486f David Howells     2023-06-09  612  		int i;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  613  
c31a25e1db486f David Howells     2023-06-09  614  		if (!txm->started_tx) {
c31a25e1db486f David Howells     2023-06-09  615  			psock = reserve_psock(kcm);
c31a25e1db486f David Howells     2023-06-09  616  			if (!psock)
c31a25e1db486f David Howells     2023-06-09  617  				goto out;
c31a25e1db486f David Howells     2023-06-09  618  			skb = head;
c31a25e1db486f David Howells     2023-06-09  619  			txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  620  			txm->sent = 0;
c31a25e1db486f David Howells     2023-06-09  621  			txm->started_tx = true;
c31a25e1db486f David Howells     2023-06-09  622  		} else {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  623  			if (WARN_ON(!psock)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  624  				ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  625  				goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  626  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  627  			skb = txm->frag_skb;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  628  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  629  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  630  		if (WARN_ON(!skb_shinfo(skb)->nr_frags)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  631  			ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  632  			goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  633  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  634  
c31a25e1db486f David Howells     2023-06-09  635  		msize = 0;
c31a25e1db486f David Howells     2023-06-09  636  		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
c31a25e1db486f David Howells     2023-06-09 @637  			msize += skb_shinfo(skb)->frags[i].bv_len;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  638  
b2e5852793b6eb Mina Almasry      2023-12-20  639  		/* The cast to struct bio_vec* here assumes the frags are
b2e5852793b6eb Mina Almasry      2023-12-20  640  		 * struct page based. WARN if there is no page in this skb.
b2e5852793b6eb Mina Almasry      2023-12-20  641  		 */
b2e5852793b6eb Mina Almasry      2023-12-20  642  		DEBUG_NET_WARN_ON_ONCE(
b2e5852793b6eb Mina Almasry      2023-12-20  643  			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
b2e5852793b6eb Mina Almasry      2023-12-20  644  
c31a25e1db486f David Howells     2023-06-09  645  		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
b2e5852793b6eb Mina Almasry      2023-12-20  646  			      (const struct bio_vec *)skb_shinfo(skb)->frags,
b2e5852793b6eb Mina Almasry      2023-12-20  647  			      skb_shinfo(skb)->nr_frags, msize);
c31a25e1db486f David Howells     2023-06-09  648  		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  649  
c31a25e1db486f David Howells     2023-06-09  650  		do {
264ba53fac79b0 David Howells     2023-06-09  651  			ret = sock_sendmsg(psock->sk->sk_socket, &msg);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  652  			if (ret <= 0) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  653  				if (ret == -EAGAIN) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  654  					/* Save state to try again when there's
ab7ac4eb9832e3 Tom Herbert       2016-03-07  655  					 * write space on the socket
ab7ac4eb9832e3 Tom Herbert       2016-03-07  656  					 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  657  					txm->frag_skb = skb;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  658  					ret = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  659  					goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  660  				}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  661  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  662  				/* Hard failure in sending message, abort this
ab7ac4eb9832e3 Tom Herbert       2016-03-07  663  				 * psock since it has lost framing
71a2fae50895b3 Bhaskar Chowdhury 2021-03-27  664  				 * synchronization and retry sending the
ab7ac4eb9832e3 Tom Herbert       2016-03-07  665  				 * message from the beginning.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  666  				 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  667  				kcm_abort_tx_psock(psock, ret ? -ret : EPIPE,
ab7ac4eb9832e3 Tom Herbert       2016-03-07  668  						   true);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  669  				unreserve_psock(kcm);
9f8d0dc0ec4a4b David Howells     2023-06-15  670  				psock = NULL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  671  
c31a25e1db486f David Howells     2023-06-09  672  				txm->started_tx = false;
cd6e111bf5be5c Tom Herbert       2016-03-07  673  				kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  674  				ret = 0;
c31a25e1db486f David Howells     2023-06-09  675  				goto retry;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  676  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  677  
c31a25e1db486f David Howells     2023-06-09  678  			txm->sent += ret;
c31a25e1db486f David Howells     2023-06-09  679  			txm->frag_offset += ret;
cd6e111bf5be5c Tom Herbert       2016-03-07  680  			KCM_STATS_ADD(psock->stats.tx_bytes, ret);
c31a25e1db486f David Howells     2023-06-09  681  		} while (msg.msg_iter.count > 0);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  682  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  683  		if (skb == head) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  684  			if (skb_has_frag_list(skb)) {
c31a25e1db486f David Howells     2023-06-09  685  				txm->frag_skb = skb_shinfo(skb)->frag_list;
c31a25e1db486f David Howells     2023-06-09  686  				txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  687  				continue;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  688  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  689  		} else if (skb->next) {
c31a25e1db486f David Howells     2023-06-09  690  			txm->frag_skb = skb->next;
c31a25e1db486f David Howells     2023-06-09  691  			txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  692  			continue;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  693  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  694  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  695  		/* Successfully sent the whole packet, account for it. */
c31a25e1db486f David Howells     2023-06-09  696  		sk->sk_wmem_queued -= txm->sent;
c31a25e1db486f David Howells     2023-06-09  697  		total_sent += txm->sent;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  698  		skb_dequeue(&sk->sk_write_queue);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  699  		kfree_skb(head);
cd6e111bf5be5c Tom Herbert       2016-03-07  700  		KCM_STATS_INCR(psock->stats.tx_msgs);
c31a25e1db486f David Howells     2023-06-09  701  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  702  out:
ab7ac4eb9832e3 Tom Herbert       2016-03-07  703  	if (!head) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  704  		/* Done with all queued messages. */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  705  		WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
9f8d0dc0ec4a4b David Howells     2023-06-15  706  		if (psock)
ab7ac4eb9832e3 Tom Herbert       2016-03-07  707  			unreserve_psock(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  708  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  709  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  710  	/* Check if write space is available */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  711  	sk->sk_write_space(sk);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  712  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  713  	return total_sent ? : ret;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  714  }
ab7ac4eb9832e3 Tom Herbert       2016-03-07  715
  
kernel test robot Dec. 22, 2023, 11:39 p.m. UTC | #5
Hi Mina,

kernel test robot noticed the following build errors:

[auto build test ERROR on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Mina-Almasry/vsock-virtio-use-skb_frag_-helpers/20231222-164637
base:   net-next/main
patch link:    https://lore.kernel.org/r/20231220214505.2303297-4-almasrymina%40google.com
patch subject: [PATCH net-next v3 3/3] net: add netmem_ref to skb_frag_t
config: i386-randconfig-141-20231222 (https://download.01.org/0day-ci/archive/20231223/202312230739.g0Tfssdt-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231223/202312230739.g0Tfssdt-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202312230739.g0Tfssdt-lkp@intel.com/

All errors (new ones prefixed by >>):

   net/kcm/kcmsock.c: In function 'kcm_write_msgs':
>> net/kcm/kcmsock.c:637:59: error: 'skb_frag_t' {aka 'struct skb_frag'} has no member named 'bv_len'
     637 |                         msize += skb_shinfo(skb)->frags[i].bv_len;
         |                                                           ^


vim +637 net/kcm/kcmsock.c

cd6e111bf5be5c Tom Herbert       2016-03-07  578  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  579  /* Write any messages ready on the kcm socket.  Called with kcm sock lock
ab7ac4eb9832e3 Tom Herbert       2016-03-07  580   * held.  Return bytes actually sent or error.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  581   */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  582  static int kcm_write_msgs(struct kcm_sock *kcm)
ab7ac4eb9832e3 Tom Herbert       2016-03-07  583  {
c31a25e1db486f David Howells     2023-06-09  584  	unsigned int total_sent = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  585  	struct sock *sk = &kcm->sk;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  586  	struct kcm_psock *psock;
c31a25e1db486f David Howells     2023-06-09  587  	struct sk_buff *head;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  588  	int ret = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  589  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  590  	kcm->tx_wait_more = false;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  591  	psock = kcm->tx_psock;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  592  	if (unlikely(psock && psock->tx_stopped)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  593  		/* A reserved psock was aborted asynchronously. Unreserve
ab7ac4eb9832e3 Tom Herbert       2016-03-07  594  		 * it and we'll retry the message.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  595  		 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  596  		unreserve_psock(kcm);
cd6e111bf5be5c Tom Herbert       2016-03-07  597  		kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  598  		if (skb_queue_empty(&sk->sk_write_queue))
ab7ac4eb9832e3 Tom Herbert       2016-03-07  599  			return 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  600  
c31a25e1db486f David Howells     2023-06-09  601  		kcm_tx_msg(skb_peek(&sk->sk_write_queue))->started_tx = false;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  602  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  603  
c31a25e1db486f David Howells     2023-06-09  604  retry:
c31a25e1db486f David Howells     2023-06-09  605  	while ((head = skb_peek(&sk->sk_write_queue))) {
c31a25e1db486f David Howells     2023-06-09  606  		struct msghdr msg = {
c31a25e1db486f David Howells     2023-06-09  607  			.msg_flags = MSG_DONTWAIT | MSG_SPLICE_PAGES,
c31a25e1db486f David Howells     2023-06-09  608  		};
c31a25e1db486f David Howells     2023-06-09  609  		struct kcm_tx_msg *txm = kcm_tx_msg(head);
c31a25e1db486f David Howells     2023-06-09  610  		struct sk_buff *skb;
c31a25e1db486f David Howells     2023-06-09  611  		unsigned int msize;
c31a25e1db486f David Howells     2023-06-09  612  		int i;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  613  
c31a25e1db486f David Howells     2023-06-09  614  		if (!txm->started_tx) {
c31a25e1db486f David Howells     2023-06-09  615  			psock = reserve_psock(kcm);
c31a25e1db486f David Howells     2023-06-09  616  			if (!psock)
c31a25e1db486f David Howells     2023-06-09  617  				goto out;
c31a25e1db486f David Howells     2023-06-09  618  			skb = head;
c31a25e1db486f David Howells     2023-06-09  619  			txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  620  			txm->sent = 0;
c31a25e1db486f David Howells     2023-06-09  621  			txm->started_tx = true;
c31a25e1db486f David Howells     2023-06-09  622  		} else {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  623  			if (WARN_ON(!psock)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  624  				ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  625  				goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  626  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  627  			skb = txm->frag_skb;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  628  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  629  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  630  		if (WARN_ON(!skb_shinfo(skb)->nr_frags)) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  631  			ret = -EINVAL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  632  			goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  633  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  634  
c31a25e1db486f David Howells     2023-06-09  635  		msize = 0;
c31a25e1db486f David Howells     2023-06-09  636  		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
c31a25e1db486f David Howells     2023-06-09 @637  			msize += skb_shinfo(skb)->frags[i].bv_len;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  638  
b2e5852793b6eb Mina Almasry      2023-12-20  639  		/* The cast to struct bio_vec* here assumes the frags are
b2e5852793b6eb Mina Almasry      2023-12-20  640  		 * struct page based. WARN if there is no page in this skb.
b2e5852793b6eb Mina Almasry      2023-12-20  641  		 */
b2e5852793b6eb Mina Almasry      2023-12-20  642  		DEBUG_NET_WARN_ON_ONCE(
b2e5852793b6eb Mina Almasry      2023-12-20  643  			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
b2e5852793b6eb Mina Almasry      2023-12-20  644  
c31a25e1db486f David Howells     2023-06-09  645  		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
b2e5852793b6eb Mina Almasry      2023-12-20  646  			      (const struct bio_vec *)skb_shinfo(skb)->frags,
b2e5852793b6eb Mina Almasry      2023-12-20  647  			      skb_shinfo(skb)->nr_frags, msize);
c31a25e1db486f David Howells     2023-06-09  648  		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  649  
c31a25e1db486f David Howells     2023-06-09  650  		do {
264ba53fac79b0 David Howells     2023-06-09  651  			ret = sock_sendmsg(psock->sk->sk_socket, &msg);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  652  			if (ret <= 0) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  653  				if (ret == -EAGAIN) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  654  					/* Save state to try again when there's
ab7ac4eb9832e3 Tom Herbert       2016-03-07  655  					 * write space on the socket
ab7ac4eb9832e3 Tom Herbert       2016-03-07  656  					 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  657  					txm->frag_skb = skb;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  658  					ret = 0;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  659  					goto out;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  660  				}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  661  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  662  				/* Hard failure in sending message, abort this
ab7ac4eb9832e3 Tom Herbert       2016-03-07  663  				 * psock since it has lost framing
71a2fae50895b3 Bhaskar Chowdhury 2021-03-27  664  				 * synchronization and retry sending the
ab7ac4eb9832e3 Tom Herbert       2016-03-07  665  				 * message from the beginning.
ab7ac4eb9832e3 Tom Herbert       2016-03-07  666  				 */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  667  				kcm_abort_tx_psock(psock, ret ? -ret : EPIPE,
ab7ac4eb9832e3 Tom Herbert       2016-03-07  668  						   true);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  669  				unreserve_psock(kcm);
9f8d0dc0ec4a4b David Howells     2023-06-15  670  				psock = NULL;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  671  
c31a25e1db486f David Howells     2023-06-09  672  				txm->started_tx = false;
cd6e111bf5be5c Tom Herbert       2016-03-07  673  				kcm_report_tx_retry(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  674  				ret = 0;
c31a25e1db486f David Howells     2023-06-09  675  				goto retry;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  676  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  677  
c31a25e1db486f David Howells     2023-06-09  678  			txm->sent += ret;
c31a25e1db486f David Howells     2023-06-09  679  			txm->frag_offset += ret;
cd6e111bf5be5c Tom Herbert       2016-03-07  680  			KCM_STATS_ADD(psock->stats.tx_bytes, ret);
c31a25e1db486f David Howells     2023-06-09  681  		} while (msg.msg_iter.count > 0);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  682  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  683  		if (skb == head) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  684  			if (skb_has_frag_list(skb)) {
c31a25e1db486f David Howells     2023-06-09  685  				txm->frag_skb = skb_shinfo(skb)->frag_list;
c31a25e1db486f David Howells     2023-06-09  686  				txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  687  				continue;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  688  			}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  689  		} else if (skb->next) {
c31a25e1db486f David Howells     2023-06-09  690  			txm->frag_skb = skb->next;
c31a25e1db486f David Howells     2023-06-09  691  			txm->frag_offset = 0;
c31a25e1db486f David Howells     2023-06-09  692  			continue;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  693  		}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  694  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  695  		/* Successfully sent the whole packet, account for it. */
c31a25e1db486f David Howells     2023-06-09  696  		sk->sk_wmem_queued -= txm->sent;
c31a25e1db486f David Howells     2023-06-09  697  		total_sent += txm->sent;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  698  		skb_dequeue(&sk->sk_write_queue);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  699  		kfree_skb(head);
cd6e111bf5be5c Tom Herbert       2016-03-07  700  		KCM_STATS_INCR(psock->stats.tx_msgs);
c31a25e1db486f David Howells     2023-06-09  701  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  702  out:
ab7ac4eb9832e3 Tom Herbert       2016-03-07  703  	if (!head) {
ab7ac4eb9832e3 Tom Herbert       2016-03-07  704  		/* Done with all queued messages. */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  705  		WARN_ON(!skb_queue_empty(&sk->sk_write_queue));
9f8d0dc0ec4a4b David Howells     2023-06-15  706  		if (psock)
ab7ac4eb9832e3 Tom Herbert       2016-03-07  707  			unreserve_psock(kcm);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  708  	}
ab7ac4eb9832e3 Tom Herbert       2016-03-07  709  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  710  	/* Check if write space is available */
ab7ac4eb9832e3 Tom Herbert       2016-03-07  711  	sk->sk_write_space(sk);
ab7ac4eb9832e3 Tom Herbert       2016-03-07  712  
ab7ac4eb9832e3 Tom Herbert       2016-03-07  713  	return total_sent ? : ret;
ab7ac4eb9832e3 Tom Herbert       2016-03-07  714  }
ab7ac4eb9832e3 Tom Herbert       2016-03-07  715
  
kernel test robot Dec. 23, 2023, 11:16 a.m. UTC | #6
Hi Mina,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Mina-Almasry/vsock-virtio-use-skb_frag_-helpers/20231222-164637
base:   net-next/main
patch link:    https://lore.kernel.org/r/20231220214505.2303297-4-almasrymina%40google.com
patch subject: [PATCH net-next v3 3/3] net: add netmem_ref to skb_frag_t
:::::: branch date: 15 hours ago
:::::: commit date: 15 hours ago
config: x86_64-randconfig-121-20231223 (https://download.01.org/0day-ci/archive/20231223/202312230726.4XaPn84E-lkp@intel.com/config)
compiler: gcc-11 (Debian 11.3.0-12) 11.3.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231223/202312230726.4XaPn84E-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/r/202312230726.4XaPn84E-lkp@intel.com/

sparse warnings: (new ones prefixed by >>)
   net/core/netevent.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/netevent.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/linux/rtnetlink.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/request_sock.c: note: in included file (through include/linux/skbuff.h, include/linux/tcp.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/request_sock.c: note: in included file (through include/linux/tcp.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/utils.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/inet.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/utils.c: note: in included file (through include/net/net_namespace.h, include/linux/inet.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/secure_seq.c: note: in included file (through include/linux/skbuff.h, include/linux/tcp.h, include/net/tcp.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/secure_seq.c: note: in included file (through include/linux/tcp.h, include/net/tcp.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/net_namespace.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/net_namespace.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/linux/rtnetlink.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/stream.c: note: in included file (through include/linux/skbuff.h, include/linux/tcp.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/stream.c: note: in included file (through include/linux/tcp.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/dst.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/dst.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/gen_stats.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/gen_stats.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/linux/rtnetlink.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/gen_estimator.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/gen_estimator.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/scm.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/scm.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/datagram.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/inet.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/datagram.c: note: in included file (through include/net/net_namespace.h, include/linux/inet.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/sysctl_net_core.c: note: in included file (through include/linux/skbuff.h, include/linux/filter.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/sysctl_net_core.c: note: in included file (through include/linux/filter.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/dev_addr_lists.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/dev_addr_lists.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
   net/core/dev_addr_lists.c: note: in included file (through include/linux/hrtimer.h, include/linux/sched.h, include/linux/delay.h, ...):
   include/linux/rbtree.h:74:9: sparse: sparse: incompatible types in comparison expression (different address spaces):
   include/linux/rbtree.h:74:9: sparse:    struct rb_node [noderef] __rcu *
   include/linux/rbtree.h:74:9: sparse:    struct rb_node *
--
   net/core/flow_dissector.c: note: in included file (through include/linux/skbuff.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/flow_dissector.c: note: in included file:
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/link_watch.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/link_watch.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/tso.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/tso.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/linux/if_vlan.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/sock_diag.c: note: in included file (through include/linux/skbuff.h, include/linux/filter.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/sock_diag.c: note: in included file (through include/linux/filter.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/fib_notifier.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/fib_notifier.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/linux/rtnetlink.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/netdev-genl-gen.c: note: in included file (through include/linux/skbuff.h, include/linux/netlink.h, include/net/netlink.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/netdev-genl-gen.c: note: in included file (through include/linux/netlink.h, include/net/netlink.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/dev_ioctl.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/dev_ioctl.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/sock_reuseport.c: note: in included file (through include/linux/skbuff.h, include/linux/ip.h, include/net/ip.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/sock_reuseport.c: note: in included file (through include/linux/ip.h, include/net/ip.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/gso.c: note: in included file (through include/linux/skbuff.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/gso.c: note: in included file:
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/flow_offload.c: note: in included file (through include/linux/skbuff.h, include/linux/netlink.h, include/net/flow_offload.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/flow_offload.c: note: in included file (through include/linux/netlink.h, include/net/flow_offload.h, include/net/act_api.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/netdev-genl.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/netdev-genl.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/net-procfs.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/net-procfs.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/xdp.c: note: in included file (through include/linux/skbuff.h, include/linux/filter.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/xdp.c: note: in included file (through include/linux/filter.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/neighbour.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/neighbour.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/gro.c: note: in included file (through include/linux/skbuff.h, include/linux/ip.h, include/net/gro.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/gro.c: note: in included file (through include/linux/ip.h, include/net/gro.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/sock.c: note: in included file (through include/linux/skbuff.h, include/linux/ip.h, include/net/ip.h, include/linux/errqueue.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/sock.c: note: in included file (through include/linux/ip.h, include/net/ip.h, include/linux/errqueue.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/net-sysfs.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/net-sysfs.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/gro_cells.c: note: in included file (through include/linux/skbuff.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/gro_cells.c: note: in included file:
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/ptp_classifier.c: note: in included file (through include/linux/skbuff.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/ptp_classifier.c: note: in included file:
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/of_net.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/of_net.c: note: in included file (through include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/failover.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/failover.c: note: in included file (through include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/dst_cache.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/dst_cache.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/net/dst.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/rtnetlink.c: note: in included file (through include/linux/skbuff.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/rtnetlink.c: note: in included file:
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/skbuff.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/inet.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/skbuff.c: note: in included file (through include/net/net_namespace.h, include/linux/inet.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
>> net/core/skbuff.c:848:68: sparse: sparse: invalid modifier
--
   net/core/dev.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/dev.c: note: in included file (through include/linux/if_ether.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/net-traces.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/net-traces.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/core/filter.c: note: in included file (through include/linux/skbuff.h, include/linux/filter.h, include/linux/bpf_verifier.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/core/filter.c: note: in included file (through include/linux/filter.h, include/linux/bpf_verifier.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/common.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/common.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/strset.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/strset.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/wol.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/wol.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/privflags.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/privflags.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/linkstate.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/linkstate.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/rss.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/rss.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/debug.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/debug.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/linkinfo.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/linkinfo.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/bitset.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/bitset.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/linkmodes.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/linkmodes.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/features.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/features.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/netlink.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/netlink.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/net/sock.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/rings.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/rings.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/channels.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/channels.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, include/net/sock.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/pause.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/pause.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/eee.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/eee.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/ioctl.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/ioctl.c: note: in included file (through include/linux/if_ether.h, include/linux/etherdevice.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/coalesce.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/coalesce.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/tsinfo.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/tsinfo.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/cabletest.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/cabletest.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/linux/phy.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/fec.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/fec.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/tunnels.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/tunnels.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/eeprom.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/eeprom.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/module.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/module.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/plca.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/plca.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/linux/phy.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/phc_vclocks.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/phc_vclocks.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/pse-pd.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/pse-pd.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, net/ethtool/common.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/stats.c: note: in included file (through include/linux/skbuff.h, include/linux/if_ether.h, include/linux/ethtool.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/stats.c: note: in included file (through include/linux/if_ether.h, include/linux/ethtool.h, include/uapi/linux/ethtool_netlink.h, ...):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier
--
   net/ethtool/mm.c: note: in included file (through include/linux/skbuff.h, include/net/net_namespace.h, include/linux/netdevice.h, ...):
>> include/net/netmem.h:28:54: sparse: sparse: invalid modifier
   include/net/netmem.h:36:26: sparse: sparse: invalid modifier
   include/net/netmem.h:38:27: sparse: sparse: invalid modifier
   net/ethtool/mm.c: note: in included file (through include/net/net_namespace.h, include/linux/netdevice.h, net/ethtool/common.h):
>> include/linux/skbuff.h:364:20: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2440:57: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2456:67: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2498:54: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2521:52: sparse: sparse: invalid modifier
   include/linux/skbuff.h:2571:68: sparse: sparse: invalid modifier

vim +364 include/linux/skbuff.h

3953c46c3ac7ee Marcelo Ricardo Leitner 2016-06-02  362  
b2e5852793b6eb Mina Almasry            2023-12-20  363  typedef struct skb_frag {
b2e5852793b6eb Mina Almasry            2023-12-20 @364  	netmem_ref netmem;
b2e5852793b6eb Mina Almasry            2023-12-20  365  	unsigned int len;
b2e5852793b6eb Mina Almasry            2023-12-20  366  	unsigned int offset;
b2e5852793b6eb Mina Almasry            2023-12-20  367  } skb_frag_t;
^1da177e4c3f41 Linus Torvalds          2005-04-16  368
  

Patch

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 7ce38874dbd1..729c95e97be1 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -37,6 +37,7 @@ 
 #endif
 #include <net/net_debug.h>
 #include <net/dropreason-core.h>
+#include <net/netmem.h>
 
 /**
  * DOC: skb checksums
@@ -359,7 +360,11 @@  extern int sysctl_max_skb_frags;
  */
 #define GSO_BY_FRAGS	0xFFFF
 
-typedef struct bio_vec skb_frag_t;
+typedef struct skb_frag {
+	netmem_ref netmem;
+	unsigned int len;
+	unsigned int offset;
+} skb_frag_t;
 
 /**
  * skb_frag_size() - Returns the size of a skb fragment
@@ -367,7 +372,7 @@  typedef struct bio_vec skb_frag_t;
  */
 static inline unsigned int skb_frag_size(const skb_frag_t *frag)
 {
-	return frag->bv_len;
+	return frag->len;
 }
 
 /**
@@ -377,7 +382,7 @@  static inline unsigned int skb_frag_size(const skb_frag_t *frag)
  */
 static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
 {
-	frag->bv_len = size;
+	frag->len = size;
 }
 
 /**
@@ -387,7 +392,7 @@  static inline void skb_frag_size_set(skb_frag_t *frag, unsigned int size)
  */
 static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
 {
-	frag->bv_len += delta;
+	frag->len += delta;
 }
 
 /**
@@ -397,7 +402,7 @@  static inline void skb_frag_size_add(skb_frag_t *frag, int delta)
  */
 static inline void skb_frag_size_sub(skb_frag_t *frag, int delta)
 {
-	frag->bv_len -= delta;
+	frag->len -= delta;
 }
 
 /**
@@ -417,7 +422,7 @@  static inline bool skb_frag_must_loop(struct page *p)
  *	skb_frag_foreach_page - loop over pages in a fragment
  *
  *	@f:		skb frag to operate on
- *	@f_off:		offset from start of f->bv_page
+ *	@f_off:		offset from start of f->netmem
  *	@f_len:		length from f_off to loop over
  *	@p:		(temp var) current page
  *	@p_off:		(temp var) offset from start of current page,
@@ -2431,22 +2436,37 @@  static inline unsigned int skb_pagelen(const struct sk_buff *skb)
 	return skb_headlen(skb) + __skb_pagelen(skb);
 }
 
+static inline void skb_frag_fill_netmem_desc(skb_frag_t *frag,
+					     netmem_ref netmem, int off,
+					     int size)
+{
+	frag->netmem = netmem;
+	frag->offset = off;
+	skb_frag_size_set(frag, size);
+}
+
 static inline void skb_frag_fill_page_desc(skb_frag_t *frag,
 					   struct page *page,
 					   int off, int size)
 {
-	frag->bv_page = page;
-	frag->bv_offset = off;
-	skb_frag_size_set(frag, size);
+	skb_frag_fill_netmem_desc(frag, page_to_netmem(page), off, size);
+}
+
+static inline void __skb_fill_netmem_desc_noacc(struct skb_shared_info *shinfo,
+						int i, netmem_ref netmem,
+						int off, int size)
+{
+	skb_frag_t *frag = &shinfo->frags[i];
+
+	skb_frag_fill_netmem_desc(frag, netmem, off, size);
 }
 
 static inline void __skb_fill_page_desc_noacc(struct skb_shared_info *shinfo,
 					      int i, struct page *page,
 					      int off, int size)
 {
-	skb_frag_t *frag = &shinfo->frags[i];
-
-	skb_frag_fill_page_desc(frag, page, off, size);
+	__skb_fill_netmem_desc_noacc(shinfo, i, page_to_netmem(page), off,
+				     size);
 }
 
 /**
@@ -2462,10 +2482,10 @@  static inline void skb_len_add(struct sk_buff *skb, int delta)
 }
 
 /**
- * __skb_fill_page_desc - initialise a paged fragment in an skb
+ * __skb_fill_netmem_desc - initialise a fragment in an skb
  * @skb: buffer containing fragment to be initialised
- * @i: paged fragment index to initialise
- * @page: the page to use for this fragment
+ * @i: fragment index to initialise
+ * @netmem: the netmem to use for this fragment
  * @off: the offset to the data with @page
  * @size: the length of the data
  *
@@ -2474,10 +2494,13 @@  static inline void skb_len_add(struct sk_buff *skb, int delta)
  *
  * Does not take any additional reference on the fragment.
  */
-static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
-					struct page *page, int off, int size)
+static inline void __skb_fill_netmem_desc(struct sk_buff *skb, int i,
+					  netmem_ref netmem, int off,
+					  int size)
 {
-	__skb_fill_page_desc_noacc(skb_shinfo(skb), i, page, off, size);
+	struct page *page = netmem_to_page(netmem);
+
+	__skb_fill_netmem_desc_noacc(skb_shinfo(skb), i, netmem, off, size);
 
 	/* Propagate page pfmemalloc to the skb if we can. The problem is
 	 * that not all callers have unique ownership of the page but rely
@@ -2485,7 +2508,21 @@  static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
 	 */
 	page = compound_head(page);
 	if (page_is_pfmemalloc(page))
-		skb->pfmemalloc	= true;
+		skb->pfmemalloc = true;
+}
+
+static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
+					struct page *page, int off, int size)
+{
+	__skb_fill_netmem_desc(skb, i, page_to_netmem(page), off, size);
+}
+
+static inline void skb_fill_netmem_desc(struct sk_buff *skb, int i,
+					netmem_ref netmem, int off,
+					int size)
+{
+	__skb_fill_netmem_desc(skb, i, netmem, off, size);
+	skb_shinfo(skb)->nr_frags = i + 1;
 }
 
 /**
@@ -2505,8 +2542,7 @@  static inline void __skb_fill_page_desc(struct sk_buff *skb, int i,
 static inline void skb_fill_page_desc(struct sk_buff *skb, int i,
 				      struct page *page, int off, int size)
 {
-	__skb_fill_page_desc(skb, i, page, off, size);
-	skb_shinfo(skb)->nr_frags = i + 1;
+	skb_fill_netmem_desc(skb, i, page_to_netmem(page), off, size);
 }
 
 /**
@@ -2532,6 +2568,8 @@  static inline void skb_fill_page_desc_noacc(struct sk_buff *skb, int i,
 
 void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
 		     int size, unsigned int truesize);
+void skb_add_rx_frag_netmem(struct sk_buff *skb, int i, netmem_ref netmem,
+			    int off, int size, unsigned int truesize);
 
 void skb_coalesce_rx_frag(struct sk_buff *skb, int i, int size,
 			  unsigned int truesize);
@@ -3380,7 +3418,7 @@  static inline void skb_propagate_pfmemalloc(const struct page *page,
  */
 static inline unsigned int skb_frag_off(const skb_frag_t *frag)
 {
-	return frag->bv_offset;
+	return frag->offset;
 }
 
 /**
@@ -3390,7 +3428,7 @@  static inline unsigned int skb_frag_off(const skb_frag_t *frag)
  */
 static inline void skb_frag_off_add(skb_frag_t *frag, int delta)
 {
-	frag->bv_offset += delta;
+	frag->offset += delta;
 }
 
 /**
@@ -3400,7 +3438,7 @@  static inline void skb_frag_off_add(skb_frag_t *frag, int delta)
  */
 static inline void skb_frag_off_set(skb_frag_t *frag, unsigned int offset)
 {
-	frag->bv_offset = offset;
+	frag->offset = offset;
 }
 
 /**
@@ -3411,7 +3449,7 @@  static inline void skb_frag_off_set(skb_frag_t *frag, unsigned int offset)
 static inline void skb_frag_off_copy(skb_frag_t *fragto,
 				     const skb_frag_t *fragfrom)
 {
-	fragto->bv_offset = fragfrom->bv_offset;
+	fragto->offset = fragfrom->offset;
 }
 
 /**
@@ -3422,7 +3460,7 @@  static inline void skb_frag_off_copy(skb_frag_t *fragto,
  */
 static inline struct page *skb_frag_page(const skb_frag_t *frag)
 {
-	return frag->bv_page;
+	return netmem_to_page(frag->netmem);
 }
 
 /**
@@ -3526,7 +3564,7 @@  static inline void *skb_frag_address_safe(const skb_frag_t *frag)
 static inline void skb_frag_page_copy(skb_frag_t *fragto,
 				      const skb_frag_t *fragfrom)
 {
-	fragto->bv_page = fragfrom->bv_page;
+	fragto->netmem = fragfrom->netmem;
 }
 
 bool skb_page_frag_refill(unsigned int sz, struct page_frag *pfrag, gfp_t prio);
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index 4d4b11b0a83d..8b55e927bbe9 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -845,16 +845,24 @@  struct sk_buff *__napi_alloc_skb(struct napi_struct *napi, unsigned int len,
 }
 EXPORT_SYMBOL(__napi_alloc_skb);
 
-void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
-		     int size, unsigned int truesize)
+void skb_add_rx_frag_netmem(struct sk_buff *skb, int i, netmem_ref netmem,
+			    int off, int size, unsigned int truesize)
 {
 	DEBUG_NET_WARN_ON_ONCE(size > truesize);
 
-	skb_fill_page_desc(skb, i, page, off, size);
+	skb_fill_netmem_desc(skb, i, netmem, off, size);
 	skb->len += size;
 	skb->data_len += size;
 	skb->truesize += truesize;
 }
+EXPORT_SYMBOL(skb_add_rx_frag_netmem);
+
+void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
+		     int size, unsigned int truesize)
+{
+	skb_add_rx_frag_netmem(skb, i, page_to_netmem(page), off, size,
+			       truesize);
+}
 EXPORT_SYMBOL(skb_add_rx_frag);
 
 void skb_coalesce_rx_frag(struct sk_buff *skb, int i, int size,
@@ -1904,10 +1912,11 @@  int skb_copy_ubufs(struct sk_buff *skb, gfp_t gfp_mask)
 
 	/* skb frags point to kernel buffers */
 	for (i = 0; i < new_frags - 1; i++) {
-		__skb_fill_page_desc(skb, i, head, 0, psize);
+		__skb_fill_netmem_desc(skb, i, page_to_netmem(head), 0, psize);
 		head = (struct page *)page_private(head);
 	}
-	__skb_fill_page_desc(skb, new_frags - 1, head, 0, d_off);
+	__skb_fill_netmem_desc(skb, new_frags - 1, page_to_netmem(head), 0,
+			       d_off);
 	skb_shinfo(skb)->nr_frags = new_frags;
 
 release:
@@ -3645,7 +3654,8 @@  skb_zerocopy(struct sk_buff *to, struct sk_buff *from, int len, int hlen)
 		if (plen) {
 			page = virt_to_head_page(from->head);
 			offset = from->data - (unsigned char *)page_address(page);
-			__skb_fill_page_desc(to, 0, page, offset, plen);
+			__skb_fill_netmem_desc(to, 0, page_to_netmem(page),
+					       offset, plen);
 			get_page(page);
 			j = 1;
 			len -= plen;
diff --git a/net/kcm/kcmsock.c b/net/kcm/kcmsock.c
index 65d1f6755f98..3180a54b2c68 100644
--- a/net/kcm/kcmsock.c
+++ b/net/kcm/kcmsock.c
@@ -636,9 +636,15 @@  static int kcm_write_msgs(struct kcm_sock *kcm)
 		for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
 			msize += skb_shinfo(skb)->frags[i].bv_len;
 
+		/* The cast to struct bio_vec* here assumes the frags are
+		 * struct page based. WARN if there is no page in this skb.
+		 */
+		DEBUG_NET_WARN_ON_ONCE(
+			!skb_frag_page(&skb_shinfo(skb)->frags[0]));
+
 		iov_iter_bvec(&msg.msg_iter, ITER_SOURCE,
-			      skb_shinfo(skb)->frags, skb_shinfo(skb)->nr_frags,
-			      msize);
+			      (const struct bio_vec *)skb_shinfo(skb)->frags,
+			      skb_shinfo(skb)->nr_frags, msize);
 		iov_iter_advance(&msg.msg_iter, txm->frag_offset);
 
 		do {