On Fri, Jun 16, 2023 at 05:12:44PM +0100, David Howells wrote: ... > +/** > + * alloc_skb_frag - Allocate a page fragment for using in a socket > + * @fragsz: The size of fragment required > + * @gfp: Allocation flags > + */ > +void *alloc_skb_frag(size_t fragsz, gfp_t gfp) > +{ > + struct skb_splice_frag_cache *cache; > + struct folio *folio, *spare = NULL; > + size_t offset, fsize; > + void *p; > + > + if (WARN_ON_ONCE(fragsz == 0)) > + fragsz = 1; > + > + cache = get_cpu_ptr(&skb_splice_frag_cache); > +reload: > + folio = cache->folio; > + offset = cache->offset; > +try_again: > + if (fragsz > offset) > + goto insufficient_space; > + > + /* Make the allocation. */ > + cache->pagecnt_bias--; > + offset = ALIGN_DOWN(offset - fragsz, SMP_CACHE_BYTES); > + cache->offset = offset; > + p = cache->virt + offset; > + put_cpu_ptr(skb_splice_frag_cache); Hi David, I don't think it makes any difference at run-time. But to keep Sparse happy, perhaps this ought to be put_cpu_var() ...