On Mon, 20 Sept 2021 at 23:46, Toke Høiland-Jørgensen <toke@xxxxxxxxxx> wrote: > > The draft API was: > > > > void *xdp_mb_pointer_flush(struct xdp_buff *xdp_md, u32 flags, > > u32 offset, u32 len, void *stack_buf) > > > > Which does not take the ptr returned by header_pointer(), but that's > > easy to add (well, easy other than the fact it'd be the 6th arg). > > I guess we could play some trickery with stuffing offset/len/flags into > one or two u64s to save an argument or two? Adding another pointer arg seems really hard to explain as an API. What happens if I pass the "wrong" ptr? What happens if I pass NULL? How about this: instead of taking stack_ptr, take the return value from header_pointer as an argument. Then use the already existing (right ;P) inlining to do the following: if (md->ptr + args->off != ret_ptr) __pointer_flush(...) This means that __pointer_flush has to deal with aliased memory though, so it would always have to memmove. Probably OK for the "slow" path? Lorenz -- Lorenz Bauer | Systems Engineer 6th Floor, County Hall/The Riverside Building, SE1 7PB, UK www.cloudflare.com