netdev_alloc_skb(9)
π netdev_alloc_skb β kernel API manual, but make it make sense β¨
okay bestie, welcome to the netdev_alloc_skb(9) page, straight out of the kernel API manual. this one's a little function with a big job and honestly she's iconic for it π
πΈ NAME πΈ
netdev_alloc_skb β allocate an skbuff for rx on a specific device
like, you're grabbing a fresh sk_buff specifically to receive stuff on one particular network device. that's the whole vibe. no cap π
π¦ SYNOPSIS π¦
struct sk_buff * netdev_alloc_skb (struct net_device *dev , unsigned int
length );
copy it exactly, don't be cute with the signature, she is who she is π«Ά
β¨ ARGUMENTS β¨
devβ the network device you're receiving on. your main character interface, basically πlengthβ the length to allocate. how much room you're asking for, fr fr
π DESCRIPTION π
so here's the tea π β this function allocates a brand new sk_buff and assigns it a usage count of one. that's your starting refcount, periodt.
here's the part that trips people up though: the buffer has unspecified headroom built in. like, unspecified. you don't get to know. π so if you're a user of this function, you should go ahead and allocate the headroom you think you need β without accounting for that built-in space. the built-in space exists purely for optimisations, so don't go counting it like it's yours, bestie.
and ngl, NULL is returned if there's no free memory. that's your out-of-memory signal, so check for it, okay? π
also this is lowkey the coolest part: even though this function allocates memory, it can be called from an interrupt. yeah. she works in interrupt context. slay π₯
β SEE ALSO β
the whole friend group π«Ά β kernel file ./include/linux/skbuff.h, plus:
skb checksums(9)skb_frag_size(9)skb_frag_size_set(9)skb_frag_size_add(9)skb_frag_size_sub(9)skb_frag_must_loop(9)skb_frag_foreach_page(9)struct skb_shared_hwtstamps(9)dataref and headerless skbs(9)Basic sk_buff geometry(9)struct sk_buff(9)skb_pfmemalloc(9)skb_dst(9)skb_dstref_steal(9)skb_dstref_restore(9)skb_dst_set(9)skb_dst_set_noref(9)skb_dst_is_noref(9)skb_napi_id(9)skb_unref(9)kfree_skb(9)alloc_skb(9)skb_fclone_busy(9)alloc_skb_fclone(9)skb_pad(9)skb_queue_empty(9)skb_queue_empty_lockless(9)skb_queue_is_last(9)skb_queue_is_first(9)skb_queue_next(9)skb_queue_prev(9)skb_get(9)skb_cloned(9)skb_header_cloned(9)__skb_header_release(9)skb_shared(9)skb_share_check(9)skb_unshare(9)skb_peek(9)__skb_peek(9)skb_peek_next(9)skb_peek_tail(9)skb_queue_len(9)skb_queue_len_lockless(9)__skb_queue_head_init(9)skb_queue_splice(9)skb_queue_splice_init(9)skb_queue_splice_tail(9)skb_queue_splice_tail_init(9)__skb_queue_after(9)__skb_queue_head(9)__skb_queue_tail(9)__skb_dequeue(9)__skb_dequeue_tail(9)skb_len_add(9)__skb_fill_netmem_desc(9)skb_fill_page_desc(9)skb_fill_page_desc_noacc(9)skb_headroom(9)skb_tailroom(9)skb_availroom(9)skb_reserve(9)skb_tailroom_reserve(9)skb_reset_transport_header_careful(9)skb_set_transport_header_careful(9)pskb_trim_unique(9)skb_orphan(9)skb_orphan_frags(9)__skb_queue_purge_reason(9)netdev_alloc_frag(9)__dev_alloc_pages(9)__dev_alloc_page(9)dev_page_is_reusable(9)skb_propagate_pfmemalloc(9)skb_frag_off(9)skb_frag_off_add(9)skb_frag_off_set(9)skb_frag_off_copy(9)skb_frag_net_iov(9)skb_frag_page(9)skb_frag_netmem(9)skb_frag_address(9)skb_frag_address_safe(9)skb_frag_phys(9)skb_frag_page_copy(9)__skb_frag_dma_map(9)skb_clone_writable(9)skb_cow(9)skb_cow_head(9)skb_padto(9)__skb_put_padto(9)skb_put_padto(9)skb_linearize(9)skb_has_shared_frag(9)skb_linearize_cow(9)skb_postpull_rcsum(9)skb_postpush_rcsum(9)skb_push_rcsum(9)pskb_trim_rcsum(9)skb_needs_linearize(9)skb_get_timestamp(9)skb_data_move(9)skb_postpull_data_move(9)skb_postpush_data_move(9)skb_complete_tx_timestamp(9)skb_tstamp_tx(9)skb_tx_timestamp(9)skb_complete_wifi_ack(9)skb_checksum_complete(9)struct skb_ext(9)skb_checksum_none_assert(9)skb_head_is_locked(9)
that's a lot of links and yes i typed every single one of them, you're welcome π went through them all, no skips, no shortcuts π§
π real talk though: that unspecified headroom thing is not a suggestion. don't assume built-in space is your space. allocate what you need yourself and let the built-in stuff do its optimisation thing in peace.
π the cute sign-off π
this page lives over in ./include/linux, and she's dated October 2026. anyway ily, go check your NULL returns, and remember: allocate your own headroom, 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