__libeth_xdp_xmit_do_bulk(9)
π
__libeth_xdp_xmit_do_bulk(9) β it's giving Kernel API Manual energy β¨
okay bestie, so we're in the Linux kernel API manual (section 9, the (9) is part of the vibe, not a typo π«Ά) and today's main character is __libeth_xdp_xmit_do_bulk β the internal function that does the actual heavy lifting behind .ndo_xdp_xmit(). yes, the underscore-prefixed one. the private one. the "not for you, but actually for you" one. π
πΈ NAME πΈ
__libeth_xdp_xmit_do_bulk β the internal function that implements .ndo_xdp_xmit(). that's it, that's the whole name section, she's concise π
β¨ SYNOPSIS β¨
int __libeth_xdp_xmit_do_bulk (struct libeth_xdp_tx_bulk *bq , struct
xdp_frame **frames , u32 n , u32 flags , bool (*flush_bulk)(struct
libeth_xdp_tx_bulk *bq, u32 flags) , void (*finalize)(void *xdpsq, bool
sent, bool flush) );
look at that signature. the way she takes six whole arguments and one of them is a function pointer and another one is also a function pointer π she's highkey doing the most and honestly? iconic.
π ARGUMENTS π
bqβ the XDP Tx bulk you're queuing frames onto. this is home base, the group chat where all the frames get dropped off. πframesβ the XDP frames, handed over by the stack. they're not yours, you're just batching them, bestie. πnβ number of frames. literally just the count. respect the count fr fr π’flagsβ flags passed by the stack. keep them exactly as given, do not improvise, we don't do that here π©flush_bulkβ driver callback to flush an XDP xmit bulk. it's a function pointer:bool (*flush_bulk)(struct libeth_xdp_tx_bulk *bq, u32 flags). the driver supplies it, you call it π₯finalizeβ driver callback to finalize sending XDP Tx frames on the queue. also a function pointer:void (*finalize)(void *xdpsq, bool sent, bool flush). the closing ceremony, the credits, the final bow π
π¦ DESCRIPTION π¦
so what does she actually do? okay, step by step, no cap:
- Perform the common checks β
- Map the frags πΊοΈ
- Queue them to the bulk π₯
- Then flush the bulk to the XDPSQ πΏ
and if the stack requests it β finalize the queue. that's the whole flow. she's a pipeline and she knows it β¨
this is the internal implementation, remember. the do-bulk behind the do-bulk. libeth_xdp_xmit_do_bulk(9) is the public-facing one; this one has the two underscores of destiny. π
π RETURN π
she returns the number of frames sent, or -errno on error. that's it. success = a count, failure = that little minus sign and an errno. no ambiguity, she's not mysterious π
β SEE ALSO β
the friend group π«Ά β and yes, we are listing every single one, because nobody gets left behind:
- Kernel file
./include/net/libeth/xdp.hβ the header where it all lives. go read it, iykyk π struct libeth_xdp_buff(9),__LIBETH_XDP_ONSTACK_BUFF(9),LIBETH_XDP_ONSTACK_BUFF(9)libeth_xdpsq_num(9),libeth_xdpsq_shared(9),libeth_xdpsq_id(9),libeth_xdpsq_get(9),libeth_xdpsq_put(9),libeth_xdpsq_lock(9),libeth_xdpsq_unlock(9),libeth_xdpsq_deinit_timer(9),libeth_xdpsq_queue_timer(9),libeth_xdpsq_run_timer(9)enum (anonymous)(9),enum (anonymous)(9)β yes, twice, both anonymous, both listed, we don't skip πstruct libeth_xdp_tx_frame(9),struct libeth_xdp_tx_bulk(9),LIBETH_XDP_ONSTACK_BULK(9),struct libeth_xdpsq(9),struct libeth_xdp_tx_desc(9)libeth_xdp_ptr_to_priv(9),libeth_xdp_priv_to_ptr(9)libeth_xdp_tx_xmit_bulk(9),libeth_xdp_tx_queue_head(9),libeth_xdp_tx_queue_frag(9),libeth_xdp_tx_queue_bulk(9),libeth_xdp_tx_fill_stats(9),libeth_xdp_tx_fill_buf(9),__libeth_xdp_tx_flush_bulk(9),libeth_xdp_tx_flush_bulk(9)libeth_xdp_xmit_init_bulk(9),libeth_xdp_xmit_frame_dma(9),libeth_xdp_xmit_queue_head(9),libeth_xdp_xmit_queue_frag(9),libeth_xdp_xmit_queue_bulk(9),libeth_xdp_xmit_fill_buf(9),libeth_xdp_xmit_flush_bulk(9),libeth_xdp_xmit_do_bulk(9)libeth_xdp_tx_init_bulk(9),libeth_xdp_init_buff(9),libeth_xdp_save_buff(9),libeth_xdp_return_stash(9),libeth_xdp_return_buff(9),libeth_xdp_prepare_buff(9),libeth_xdp_process_buff(9),libeth_xdp_buff_stats_frags(9)__libeth_xdp_run_prog(9),__libeth_xdp_run_flush(9),libeth_xdp_run_prog(9),__libeth_xdp_run_pass(9),libeth_xdp_run_pass(9),libeth_xdp_finalize_rx(9)LIBETH_XDP_DEFINE_TIMER(9),LIBETH_XDP_DEFINE_FLUSH_TX(9),LIBETH_XDP_DEFINE_FLUSH_XMIT(9),LIBETH_XDP_DEFINE_RUN_PROG(9),LIBETH_XDP_DEFINE_RUN_PASS(9),LIBETH_XDP_DEFINE_RUN(9),LIBETH_XDP_DEFINE_FINALIZE(9)libeth_xdp_buff_to_rq(9),libeth_xdpmo_rx_hash(9),__libeth_xdp_complete_tx(9),libeth_xdp_set_features(9),libeth_xdp_set_features_noredir(9)
that's the whole squad, all sixty-something of them, ate and left no crumbs π
and that's the page, bestie π§ source is ./include/net/libeth, dated October 2026, and she's filed under __libeth_xdp_xmit_do_bulk(9) β go forth, batch your frames, flush responsibly, and remember: the underscore prefix means internal, so act like you know πβ¨π
π¦ 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