Re: [PATCH bpf-next v4 1/3] bpf: support input xdp_md context in BPF_PROG_TEST_RUN

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jun 05, 2021 at 08:17:00PM -0700, Yonghong Song wrote:
> 
> 
> On 6/4/21 3:02 PM, Zvi Effron wrote:
> > Support passing a xdp_md via ctx_in/ctx_out in bpf_attr for
> > BPF_PROG_TEST_RUN.
> > 
> > The intended use case is to pass some XDP meta data to the test runs of
> > XDP programs that are used as tail calls.
> > 
> > For programs that use bpf_prog_test_run_xdp, support xdp_md input and
> > output. Unlike with an actual xdp_md during a non-test run, data_meta must
> > be 0 because it must point to the start of the provided user data. From
> > the initial xdp_md, use data and data_end to adjust the pointers in the
> > generated xdp_buff. All other non-zero fields are prohibited (with
> > EINVAL). If the user has set ctx_out/ctx_size_out, copy the (potentially
> > different) xdp_md back to the userspace.
> > 
> > We require all fields of input xdp_md except the ones we explicitly
> > support to be set to zero. The expectation is that in the future we might
> > add support for more fields and we want to fail explicitly if the user
> > runs the program on the kernel where we don't yet support them.
> > 
> > Co-developed-by: Cody Haas <chaas@xxxxxxxxxxxxx>
> > Signed-off-by: Cody Haas <chaas@xxxxxxxxxxxxx>
> > Co-developed-by: Lisa Watanabe <lwatanabe@xxxxxxxxxxxxx>
> > Signed-off-by: Lisa Watanabe <lwatanabe@xxxxxxxxxxxxx>
> > Signed-off-by: Zvi Effron <zeffron@xxxxxxxxxxxxx>
> > ---
> >   include/uapi/linux/bpf.h |  3 --
> >   net/bpf/test_run.c       | 77 ++++++++++++++++++++++++++++++++++++----
> >   2 files changed, 70 insertions(+), 10 deletions(-)
> > 
> > diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
> > index 2c1ba70abbf1..a9dcf3d8c85a 100644
> > --- a/include/uapi/linux/bpf.h
> > +++ b/include/uapi/linux/bpf.h
> > @@ -324,9 +324,6 @@ union bpf_iter_link_info {
> >    *		**BPF_PROG_TYPE_SK_LOOKUP**
> >    *			*data_in* and *data_out* must be NULL.
> >    *
> > - *		**BPF_PROG_TYPE_XDP**
> > - *			*ctx_in* and *ctx_out* must be NULL.
> > - *
> >    *		**BPF_PROG_TYPE_RAW_TRACEPOINT**,
> >    *		**BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE**
> >    *
> > diff --git a/net/bpf/test_run.c b/net/bpf/test_run.c
> > index aa47af349ba8..698618f2b27e 100644
> > --- a/net/bpf/test_run.c
> > +++ b/net/bpf/test_run.c
> > @@ -687,6 +687,38 @@ int bpf_prog_test_run_skb(struct bpf_prog *prog, const union bpf_attr *kattr,
> >   	return ret;
> >   }
> > +static int xdp_convert_md_to_buff(struct xdp_buff *xdp, struct xdp_md *xdp_md)
> 
> Should the order of parameters be switched to (xdp_md, xdp)?
> This will follow the convention of below function xdp_convert_buff_to_md().
> 
> > +{
> > +	void *data;
> > +
> > +	if (!xdp_md)
> > +		return 0;
> > +
> > +	if (xdp_md->egress_ifindex != 0)
> > +		return -EINVAL;
> > +
> > +	if (xdp_md->data > xdp_md->data_end)
> > +		return -EINVAL;
> > +
> > +	xdp->data = xdp->data_meta + xdp_md->data;
> > +
> > +	if (xdp_md->ingress_ifindex != 0 || xdp_md->rx_queue_index != 0)
> > +		return -EINVAL;
> 
> It would be good if you did all error checking before doing xdp->data
> assignment. Also looks like xdp_md error checking happens here and
> bpf_prog_test_run_xdp(). If it is hard to put all error checking
> in bpf_prog_test_run_xdp(), at least put "xdp_md->data > xdp_md->data_end)
> in bpf_prog_test_run_xdp(),
+1 on at least all data_meta/data/data_end checks should be in one place
in bpf_prog_test_run_xdp().

> so this function only
> checks *_ifindex and rx_queue_index?
> 
> 
> > +
> > +	return 0;
> > +}
> > +
> > +static void xdp_convert_buff_to_md(struct xdp_buff *xdp, struct xdp_md *xdp_md)
> > +{
> > +	if (!xdp_md)
> > +		return;
> > +
> > +	/* xdp_md->data_meta must always point to the start of the out buffer */
> > +	xdp_md->data_meta = 0;
Is this necessary?  data_meta should not have been changed.

> > +	xdp_md->data = xdp->data - xdp->data_meta;
> > +	xdp_md->data_end = xdp->data_end - xdp->data_meta;
> > +}
> > +



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux