On Fri, Jul 12, 2019 at 6:57 AM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote: > > On 07/12/2019 09:53 AM, Krzesimir Nowak wrote: > > On Thu, Jul 11, 2019 at 4:43 PM Andrii Nakryiko > > <andrii.nakryiko@xxxxxxxxx> wrote: > >> > >> On Thu, Jul 11, 2019 at 5:13 AM Krzesimir Nowak <krzesimir@xxxxxxxxxx> wrote: > >>> > >>> On Thu, Jul 11, 2019 at 3:08 AM Andrii Nakryiko <andriin@xxxxxx> wrote: > >>>> > >>>> test_verifier tests can specify single- and multi-runs tests. Internally > >>>> logic of handling them is duplicated. Get rid of it by making single run > >>>> retval specification to be a first retvals spec. > >>>> > >>>> Cc: Krzesimir Nowak <krzesimir@xxxxxxxxxx> > >>>> Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> > >>> > >>> Looks good, one nit below. > >>> > >>> Acked-by: Krzesimir Nowak <krzesimir@xxxxxxxxxx> > >>> > >>>> --- > >>>> tools/testing/selftests/bpf/test_verifier.c | 37 ++++++++++----------- > >>>> 1 file changed, 18 insertions(+), 19 deletions(-) > >>>> > >>>> diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c > >>>> index b0773291012a..120ecdf4a7db 100644 > >>>> --- a/tools/testing/selftests/bpf/test_verifier.c > >>>> +++ b/tools/testing/selftests/bpf/test_verifier.c > >>>> @@ -86,7 +86,7 @@ struct bpf_test { > >>>> int fixup_sk_storage_map[MAX_FIXUPS]; > >>>> const char *errstr; > >>>> const char *errstr_unpriv; > >>>> - uint32_t retval, retval_unpriv, insn_processed; > >>>> + uint32_t insn_processed; > >>>> int prog_len; > >>>> enum { > >>>> UNDEF, > >>>> @@ -95,16 +95,24 @@ struct bpf_test { > >>>> } result, result_unpriv; > >>>> enum bpf_prog_type prog_type; > >>>> uint8_t flags; > >>>> - __u8 data[TEST_DATA_LEN]; > >>>> void (*fill_helper)(struct bpf_test *self); > >>>> uint8_t runs; > >>>> - struct { > >>>> - uint32_t retval, retval_unpriv; > >>>> - union { > >>>> - __u8 data[TEST_DATA_LEN]; > >>>> - __u64 data64[TEST_DATA_LEN / 8]; > >>>> + union { > >>>> + struct { > >>> > >>> Maybe consider moving the struct definition outside to further the > >>> removal of the duplication? > >> > >> Can't do that because then retval/retval_unpriv/data won't be > >> accessible as a normal field of struct bpf_test. It has to be in > >> anonymous structs/unions, unfortunately. > >> > > > > Ah, right. > > > > Meh. > > > > I tried something like this: > > > > #define BPF_DATA_STRUCT \ > > struct { \ > > uint32_t retval, retval_unpriv; \ > > union { \ > > __u8 data[TEST_DATA_LEN]; \ > > __u64 data64[TEST_DATA_LEN / 8]; \ > > }; \ > > } > > > > and then: > > > > union { > > BPF_DATA_STRUCT; > > BPF_DATA_STRUCT retvals[MAX_TEST_RUNS]; > > }; > > > > And that seems to compile at least. But question is: is this > > acceptably ugly or unacceptably ugly? :) > > Both a bit ugly, but I'd have a slight preference towards the above, > perhaps a bit more readable like: Heh, I had slight preference the other way :) I'll update diff with macro, though. > > #define bpf_testdata_struct_t \ > struct { \ > uint32_t retval, retval_unpriv; \ > union { \ > __u8 data[TEST_DATA_LEN]; \ > __u64 data64[TEST_DATA_LEN / 8]; \ > }; \ > } > union { > bpf_testdata_struct_t; > bpf_testdata_struct_t retvals[MAX_TEST_RUNS]; > }; > > Thanks, > Daniel