Message ID | 20220617073630.535914-13-chen.zhang@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Introduce QEMU userspace ebpf support | expand |
On 17/06/2022 09.36, Zhang Chen wrote: > TODO: This test case does not work. Need add ubpf.h header in qtest > compile "-I ../ubpf/vm -I ../ubpf/vm/inc". > I'm not sure if we need it in qtest. Because normal tests/qtest > not including external module test case like fdt. Or we just > need a qtest case for filter-ubpf module. > This test will load pre-compiled ebpf binary and run it in QEMU. > > Signed-off-by: Zhang Chen <chen.zhang@intel.com> > --- [...] > diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c > new file mode 100644 > index 0000000000..6e70a99320 > --- /dev/null > +++ b/tests/qtest/ubpf-test.c > @@ -0,0 +1,64 @@ > +/* > + * QEMU Userspace eBPF test case > + * > + * Copyright(C) 2022 Intel Corporation. > + * > + * Author: > + * Zhang Chen <chen.zhang@intel.com> > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#include "qemu/osdep.h" > +#include "libqtest.h" > +#include "ebpf/ubpf.h" > + > +/* > + * Demo userspace ebpf program > + * The test binary use clang to build this source code: > + * demo_ubpf.c > + * > + * #include <stdint.h> > + * > + * static uint32_t double_it(uint32_t a) > + * { > + * return (a * 2); > + * } > + * > + * uint32_t bpf_prog(int32_t *arg) { > + * uint32_t result = 0; > + * result = double_it(*arg); > + * > + * return result; > + * } > + * > + * Build the userspace ebpf program binary file: > + * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o > + * > + * The external terget source: > + * printf "%b" '\x05\x00\x00\x00' > integer_5.mem > + * > + */ > + > +int main(int argc, char **argc) > +{ > + UbpfState u_ebpf; > + char program_path[] = "demo_ubpf.o"; > + /* uBPF can read target from internal source or external source*/ > + char target_path[] = "integer_5.mem"; > + > + qemu_ubpf_init_jit(&u_ebpf, true); > + > + g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==, 0); > + > + g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path)); > + > + g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target, > + u_ebpf.target_len), ==, 10); > + > + ubpf_destroy(u_ebpf.vm); > + > + return 0; > +} Apart from the #include "libqtest.h" there is nothing related to qtest in here ... should this maybe rather go into test/unit/ instead? Thomas
> -----Original Message----- > From: Thomas Huth <thuth@redhat.com> > Sent: Friday, June 17, 2022 5:34 PM > To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang > <jasowang@redhat.com>; qemu-dev <qemu-devel@nongnu.org>; Paolo > Bonzini <pbonzini@redhat.com>; Daniel P. Berrangé > <berrange@redhat.com>; Eduardo Habkost <eduardo@habkost.net>; Eric > Blake <eblake@redhat.com>; Markus Armbruster <armbru@redhat.com> > Cc: Peter Maydell <peter.maydell@linaro.org>; Laurent Vivier > <lvivier@redhat.com>; Yuri Benditovich <yuri.benditovich@daynix.com>; > Andrew Melnychenko <andrew@daynix.com> > Subject: Re: [RFC PATCH 12/12] test/qtest: Add ubpf basic test case > > On 17/06/2022 09.36, Zhang Chen wrote: > > TODO: This test case does not work. Need add ubpf.h header in qtest > > compile "-I ../ubpf/vm -I ../ubpf/vm/inc". > > I'm not sure if we need it in qtest. Because normal tests/qtest not > > including external module test case like fdt. Or we just need a qtest > > case for filter-ubpf module. > > This test will load pre-compiled ebpf binary and run it in QEMU. > > > > Signed-off-by: Zhang Chen <chen.zhang@intel.com> > > --- > [...] > > diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c new > > file mode 100644 index 0000000000..6e70a99320 > > --- /dev/null > > +++ b/tests/qtest/ubpf-test.c > > @@ -0,0 +1,64 @@ > > +/* > > + * QEMU Userspace eBPF test case > > + * > > + * Copyright(C) 2022 Intel Corporation. > > + * > > + * Author: > > + * Zhang Chen <chen.zhang@intel.com> > > + * > > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > > + * See the COPYING file in the top-level directory. > > + * > > + */ > > + > > +#include "qemu/osdep.h" > > +#include "libqtest.h" > > +#include "ebpf/ubpf.h" > > + > > +/* > > + * Demo userspace ebpf program > > + * The test binary use clang to build this source code: > > + * demo_ubpf.c > > + * > > + * #include <stdint.h> > > + * > > + * static uint32_t double_it(uint32_t a) > > + * { > > + * return (a * 2); > > + * } > > + * > > + * uint32_t bpf_prog(int32_t *arg) { > > + * uint32_t result = 0; > > + * result = double_it(*arg); > > + * > > + * return result; > > + * } > > + * > > + * Build the userspace ebpf program binary file: > > + * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o > > + * > > + * The external terget source: > > + * printf "%b" '\x05\x00\x00\x00' > integer_5.mem > > + * > > + */ > > + > > +int main(int argc, char **argc) > > +{ > > + UbpfState u_ebpf; > > + char program_path[] = "demo_ubpf.o"; > > + /* uBPF can read target from internal source or external source*/ > > + char target_path[] = "integer_5.mem"; > > + > > + qemu_ubpf_init_jit(&u_ebpf, true); > > + > > + g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==, > > + 0); > > + > > + g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path)); > > + > > + g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target, > > + u_ebpf.target_len), ==, 10); > > + > > + ubpf_destroy(u_ebpf.vm); > > + > > + return 0; > > +} > > Apart from the #include "libqtest.h" there is nothing related to qtest in > here ... should this maybe rather go into test/unit/ instead? Rethink about it, I think you are right. The only issue is can we involve submodule's header file in tests/unit? I can't find meson/fdt/SLIRP test cases in the tests. Thanks Chen > > Thomas
On 20/06/2022 11.31, Zhang, Chen wrote: > >> -----Original Message----- >> From: Thomas Huth <thuth@redhat.com> >> Sent: Friday, June 17, 2022 5:34 PM >> To: Zhang, Chen <chen.zhang@intel.com>; Jason Wang >> <jasowang@redhat.com>; qemu-dev <qemu-devel@nongnu.org>; Paolo >> Bonzini <pbonzini@redhat.com>; Daniel P. Berrangé >> <berrange@redhat.com>; Eduardo Habkost <eduardo@habkost.net>; Eric >> Blake <eblake@redhat.com>; Markus Armbruster <armbru@redhat.com> >> Cc: Peter Maydell <peter.maydell@linaro.org>; Laurent Vivier >> <lvivier@redhat.com>; Yuri Benditovich <yuri.benditovich@daynix.com>; >> Andrew Melnychenko <andrew@daynix.com> >> Subject: Re: [RFC PATCH 12/12] test/qtest: Add ubpf basic test case >> >> On 17/06/2022 09.36, Zhang Chen wrote: >>> TODO: This test case does not work. Need add ubpf.h header in qtest >>> compile "-I ../ubpf/vm -I ../ubpf/vm/inc". >>> I'm not sure if we need it in qtest. Because normal tests/qtest not >>> including external module test case like fdt. Or we just need a qtest >>> case for filter-ubpf module. >>> This test will load pre-compiled ebpf binary and run it in QEMU. >>> >>> Signed-off-by: Zhang Chen <chen.zhang@intel.com> >>> --- [...] >> Apart from the #include "libqtest.h" there is nothing related to qtest in >> here ... should this maybe rather go into test/unit/ instead? > > Rethink about it, I think you are right. > The only issue is can we involve submodule's header file in tests/unit? > I can't find meson/fdt/SLIRP test cases in the tests. Well, the test should only be enabled in meson.build if the CONFIG_UBPF switch is also enabled, then you can be sure that the header files of ubpf are also available when it gets compiled. Thomas
diff --git a/tests/qtest/demo_ubpf.o b/tests/qtest/demo_ubpf.o new file mode 100644 index 0000000000000000000000000000000000000000..960a411c224348548db42d9ae2716ae3ef4ea249 GIT binary patch literal 544 zcmb<-^>JfjWMqH=MuzVU2p&w7f#Csy$>0EHJ20>URVE5RB+`KtNZ(Wl7bhtPlwo1` z_#a&XJ5WG~fe9`w0b}Wvq*jzLBo(B^7Zl~EGw9{yl;y@Jrlb@VXQnfh0>yPpQj1IU zk{R@hONvSolYn$(E{LWM&;lC6jK!!0P%$esIrOjt@j;jkO`QXj5BDdO&w-{66uitn o|MP)V1G3ZtWDbzc0_CIIZv+%agepQ)1eEE4qz|MHW<Shb0E~Jd)c^nh literal 0 HcmV?d00001 diff --git a/tests/qtest/integer_5.mem b/tests/qtest/integer_5.mem new file mode 100644 index 0000000000000000000000000000000000000000..a786e127004dd9e94e88fda7742d248237ad8885 GIT binary patch literal 4 LcmZQ&U|;|M02lxU literal 0 HcmV?d00001 diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build index 31287a9173..9cc629e22b 100644 --- a/tests/qtest/meson.build +++ b/tests/qtest/meson.build @@ -94,7 +94,8 @@ qtests_i386 = \ 'migration-test', 'test-x86-cpuid-compat', 'numa-test', - 'test-filter-redirector' + 'test-filter-redirector', + 'ubpf-test' ] if dbus_display diff --git a/tests/qtest/ubpf-test.c b/tests/qtest/ubpf-test.c new file mode 100644 index 0000000000..6e70a99320 --- /dev/null +++ b/tests/qtest/ubpf-test.c @@ -0,0 +1,64 @@ +/* + * QEMU Userspace eBPF test case + * + * Copyright(C) 2022 Intel Corporation. + * + * Author: + * Zhang Chen <chen.zhang@intel.com> + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "libqtest.h" +#include "ebpf/ubpf.h" + +/* + * Demo userspace ebpf program + * The test binary use clang to build this source code: + * demo_ubpf.c + * + * #include <stdint.h> + * + * static uint32_t double_it(uint32_t a) + * { + * return (a * 2); + * } + * + * uint32_t bpf_prog(int32_t *arg) { + * uint32_t result = 0; + * result = double_it(*arg); + * + * return result; + * } + * + * Build the userspace ebpf program binary file: + * clang -O2 -target bpf -c demo_ubpf.c -o demo_ubpf.o + * + * The external terget source: + * printf "%b" '\x05\x00\x00\x00' > integer_5.mem + * + */ + +int main(int argc, char **argc) +{ + UbpfState u_ebpf; + char program_path[] = "demo_ubpf.o"; + /* uBPF can read target from internal source or external source*/ + char target_path[] = "integer_5.mem"; + + qemu_ubpf_init_jit(&u_ebpf, true); + + g_assert_cmpuint(qemu_ubpf_prepare(&u_ebpf, program_path), ==, 0); + + g_assert_true(qemu_ubpf_read_target(&u_ebpf, target_path)); + + g_assert_cmpuint(qemu_run_ubpf_once(&u_ebpf, u_ebpf.target, + u_ebpf.target_len), ==, 10); + + ubpf_destroy(u_ebpf.vm); + + return 0; +}
TODO: This test case does not work. Need add ubpf.h header in qtest compile "-I ../ubpf/vm -I ../ubpf/vm/inc". I'm not sure if we need it in qtest. Because normal tests/qtest not including external module test case like fdt. Or we just need a qtest case for filter-ubpf module. This test will load pre-compiled ebpf binary and run it in QEMU. Signed-off-by: Zhang Chen <chen.zhang@intel.com> --- tests/qtest/demo_ubpf.o | Bin 0 -> 544 bytes tests/qtest/integer_5.mem | Bin 0 -> 4 bytes tests/qtest/meson.build | 3 +- tests/qtest/ubpf-test.c | 64 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 tests/qtest/demo_ubpf.o create mode 100644 tests/qtest/integer_5.mem create mode 100644 tests/qtest/ubpf-test.c