Re: [PATCH bpf-next v4 5/8] libbpf: Add helper macro to clear opts structs

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

 



On 7/11/23 6:02 AM, Andrii Nakryiko wrote:
On Mon, Jul 10, 2023 at 1:12 PM Daniel Borkmann <daniel@xxxxxxxxxxxxx> wrote:

Add a small and generic LIBBPF_OPTS_CLEAR() helper macros which clears
an opts structure and reinitializes its .sz member to place the structure
size. I found this very useful when developing selftests, but it is also
generic enough as a macro next to the existing LIBBPF_OPTS() which hides
the .sz initialization, too.

Signed-off-by: Daniel Borkmann <daniel@xxxxxxxxxxxxx>
---
  tools/lib/bpf/libbpf_common.h | 11 +++++++++++
  1 file changed, 11 insertions(+)

diff --git a/tools/lib/bpf/libbpf_common.h b/tools/lib/bpf/libbpf_common.h
index 9a7937f339df..eb180023aa97 100644
--- a/tools/lib/bpf/libbpf_common.h
+++ b/tools/lib/bpf/libbpf_common.h
@@ -70,4 +70,15 @@
                 };                                                          \
         })

+/* Helper macro to clear a libbpf options struct
+ *
+ * Small helper macro to reset all fields and to reinitialize the common
+ * structure size member.
+ */
+#define LIBBPF_OPTS_CLEAR(NAME)                                                    \
+       do {                                                                \
+               memset(&NAME, 0, sizeof(NAME));                             \
+               NAME.sz = sizeof(NAME);                                     \
+       } while (0)
+

This is fine, but I think you can go a half-step further and have
something even more universal and useful. Something like this:


#define LIBBPF_OPTS_RESET(NAME, ...)
     do {
         memset(&NAME, 0, sizeof(NAME));
         NAME = (typeof(NAME)) {
             .sz = sizeof(struct TYPE),
             __VA_ARGS__
         };
      while (0);

I actually haven't tried if that typeof() trick works, but I hope it does :)

It does, I've used this in BPF code for Cilium, too. ;)

Then your LIBBPF_OPTS_CLEAR() is just LIBBPF_OPTS_RESET(x). But you
can also re-initialize:

LIBBPF_OPTS_RESET(x, .flags = 123, .prog_fd = 456);

It's more in line with LIBBPF_OPTS() itself in capabilities, except it
works on existing variable.

Agree, changed into ...

/* Helper macro to clear and optionally reinitialize libbpf options struct
 *
 * Small helper macro to reset all fields and to reinitialize the common
 * structure size member. Values provided by users in struct initializer-
 * syntax as varargs can be provided as well to reinitialize options struct
 * specific members.
 */
#define LIBBPF_OPTS_RESET(NAME, ...)                                        \
        do {                                                                \
                memset(&NAME, 0, sizeof(NAME));                             \
                NAME = (typeof(NAME)) {                                     \
                        .sz = sizeof(NAME),                                 \
                        __VA_ARGS__                                         \
                };                                                          \
        } while (0)

... and updated all the test cases.

Thanks,
Daniel




[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