On Mon, Oct 31, 2022 at 03:27:55PM -0500, Bob Pearson wrote: > +int rxe_add_frag(struct sk_buff *skb, struct rxe_phys_buf *buf, > + int length, int offset) > +{ > + int nr_frags = skb_shinfo(skb)->nr_frags; > + skb_frag_t *frag = &skb_shinfo(skb)->frags[nr_frags]; > + > + if (nr_frags >= MAX_SKB_FRAGS) { > + pr_debug("%s: nr_frags (%d) >= MAX_SKB_FRAGS\n", > + __func__, nr_frags); > + return -EINVAL; > + } > + > + frag->bv_len = length; > + frag->bv_offset = offset; > + frag->bv_page = virt_to_page(buf->addr); Assuming this is even OK to do, then please do the xarray conversion I sketched first: https://lore.kernel.org/linux-rdma/Y3gvZr6%2FNCii9Avy@xxxxxxxxxx/ And this operation is basically a xa_for_each loop taking 'struct page *' off of the MR's xarray, slicing it, then stuffing into the skb. Don't call virt_to_page() *However* I have no idea if it is even safe to stuff unstable pages into a skb. Are there other examples doing this? Eg zero copy tcp? Jason