On 11/05, Mina Almasry wrote:
> For device memory TCP, we expect the skb headers to be available in host
> memory for access, and we expect the skb frags to be in device memory
> and unaccessible to the host. We expect there to be no mixing and
> matching of device memory frags (unaccessible) with host memory frags
> (accessible) in the same skb.
> 
> Add a skb->devmem flag which indicates whether the frags in this skb
> are device memory frags or not.
> 
> __skb_fill_page_desc() now checks frags added to skbs for page_pool_iovs,
> and marks the skb as skb->devmem accordingly.
> 
> Add checks through the network stack to avoid accessing the frags of
> devmem skbs and avoid coalescing devmem skbs with non devmem skbs.
> 
> Signed-off-by: Willem de Bruijn <will...@google.com>
> Signed-off-by: Kaiyuan Zhang <kaiyu...@google.com>
> Signed-off-by: Mina Almasry <almasrym...@google.com>

[..]
 
> -     snaplen = skb->len;
> +     snaplen = skb_frags_not_readable(skb) ? skb_headlen(skb) : skb->len;
>  
>       res = run_filter(skb, sk, snaplen);
>       if (!res)
> @@ -2279,7 +2279,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct 
> net_device *dev,
>               }
>       }
>  
> -     snaplen = skb->len;
> +     snaplen = skb_frags_not_readable(skb) ? skb_headlen(skb) : skb->len;
>  
>       res = run_filter(skb, sk, snaplen);
>       if (!res)

Not sure it covers 100% of bpf. We might need to double-check bpf_xdp_copy_buf
which is having its own, non-skb shinfo and frags. And in general, xdp
can reference those shinfo frags early... (xdp part happens
before we create an skb with all devmem association)

Reply via email to