skb_pp_cow_data(9)
π skb_pp_cow_data(9) β the Kernel API Manual, bestie edition π
okay so real quick β this is a page from the Kernel API Manual, and it's about one tiny little function that's lowkey doing iconic work under the hood. let's get into it β¨
πΈ NAME πΈ
skb_pp_cow_data β copy skb data into page-pool backed storage
like, it takes your skb's data and copies it into storage that lives in a page pool. copy-on-write energy, but make it pool. π
π¦ SYNOPSIS π¦
int skb_pp_cow_data (struct page_pool *pool , struct sk_buff **pskb ,
unsigned int headroom );
that's the whole signature, no cap. three args, returns an int. slay. π
β ARGUMENTS β
poolβ the page pool you're allocating from, bestie. that's where the new storage comes from π«Άpskbβ a pointer to the skb pointer. on success, it gets replaced with the copied skb. so yeah, it's pointer-to-a-pointer, it's giving inception but it works πheadroomβ how much headroom to reserve in the copied skb. that's it, that's the vibe β¨
π§ DESCRIPTION π§
so here's the tea: skb_copy_bits handles both frags[] and frag_list input. the way that it just Does Both? obsessed.
and if the copied skb stays non-linear (iykyk), it uses frags[] β which is literally the representation used by XDP multi-buffer. so if you're in XDP multi-buffer land, you already know. π
π₯ RETURN π₯
0on success π- a negative errno on failure π
that's it. zero or sad. no in between.
π SEE ALSO π
okay this list is LONG, so buckle up. it's the kernel file ./net/core/skbuff.c, and then every one of these bad boys β all (9), all iconic:
drop_reasons_register_subsys(9)drop_reasons_unregister_subsys(9)skb_panic(9)napi_skb_cache_get_bulk(9)__build_skb(9)build_skb_around(9)__napi_build_skb(9)napi_build_skb(9)__alloc_skb(9)__netdev_alloc_skb(9)napi_alloc_skb(9)skb_pp_frag_ref(9)__kfree_skb(9)sk_skb_reason_drop(9)skb_tx_error(9)consume_skb(9)__consume_stateless_skb(9)napi_consume_skb(9)alloc_skb_for_msg(9)skb_morph(9)skb_copy_ubufs(9)skb_clone(9)skb_copy(9)__pskb_copy_fclone(9)pskb_expand_head(9)skb_expand_head(9)skb_copy_expand(9)__skb_pad(9)pskb_put(9)skb_put(9)skb_push(9)skb_pull(9)skb_pull_data(9)skb_trim(9)__pskb_pull_tail(9)skb_copy_bits(9)skb_store_bits(9)skb_zerocopy(9)skb_dequeue(9)skb_dequeue_tail(9)skb_queue_purge_reason(9)skb_rbtree_purge(9)skb_queue_head(9)skb_queue_tail(9)skb_unlink(9)skb_append(9)skb_split(9)skb_shift(9)skb_prepare_seq_read(9)skb_seq_read(9)skb_abort_seq_read(9)skb_copy_seq_read(9)skb_find_text(9)skb_pull_rcsum(9)skb_segment(9)skb_to_sgvec(9)skb_cow_data(9)skb_clone_sk(9)skb_partial_csum_set(9)skb_checksum_setup(9)skb_checksum_maybe_trim(9)skb_checksum_trimmed(9)skb_try_coalesce(9)skb_scrub_packet(9)skb_eth_pop(9)skb_eth_push(9)skb_mpls_push(9)skb_mpls_pop(9)skb_mpls_update_lse(9)skb_mpls_dec_ttl(9)alloc_skb_with_frags(9)skb_condense(9)__skb_ext_alloc(9)__skb_ext_set(9)skb_ext_add(9)skb_attempt_defer_free(9)skb_splice_from_iter(9)
fr fr that's all of them, every single one, don't come for me ππ«Ά
ngl this page is short but the SEE ALSO section is carrying the entire group chat. read them, bestie. they're all in ./net/core/skbuff.c and they're all doing main character work. πβ¨
and that's the whole page!! π written from ./net/core, dated October 2026, in the Kernel API Manual β catch you on the next one, bestie ππβ
π¦ where this page comes from
- nixpkgs unstable: linux-manual 7.3.1
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms