Re: [PATCH for-next v2 06/18] RDMA/rxe: Add rxe_add_frag() to rxe_mr.c

Jason Gunthorpe
2022-11-24T19:10:39Z

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@nvidia.com/

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