Message ID | 20231220214505.2303297-4-almasrymina@google.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | Abstract page from net stack | expand |
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; | ~~~~~~~~~~~~~~~~~~~~~~~~~ ^
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 >
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 >
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
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
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
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 {
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(-)