DECLARE_LIBBPF_OPTS is the way to use option structures in a backward compatible and extensible way. It's available only in libbpf.h. Though public interfaces in bpf.h have the same requirement to accept options in a way that can be simply extended w/o introducing new xattr-functions every time. libbpf.c depends on bpf.h, hence to share the macros a couple of options exist: * either a common header should be introduced; * or the macro can be moved to bpf.h and used by libbpf.h from there; The former seems to be an overkill, so do the latter: * move DECLARE_LIBBPF_OPTS from libbpf.h to bpf.h; * move `#include "bpf.h"` from libbpf.c to libbpf.h not to break users of the macro who already include only libbpf.h. That makes the macro available to use in bpf.{h,c} and should not break those who already use it. Signed-off-by: Andrey Ignatov <rdna@xxxxxx> --- tools/lib/bpf/bpf.h | 22 ++++++++++++++++++++++ tools/lib/bpf/libbpf.c | 1 - tools/lib/bpf/libbpf.h | 24 ++---------------------- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h index 3c791fa8e68e..5cfe6e0a1aef 100644 --- a/tools/lib/bpf/bpf.h +++ b/tools/lib/bpf/bpf.h @@ -36,6 +36,28 @@ extern "C" { #define LIBBPF_API __attribute__((visibility("default"))) #endif +/* Helper macro to declare and initialize libbpf options struct + * + * This dance with uninitialized declaration, followed by memset to zero, + * followed by assignment using compound literal syntax is done to preserve + * ability to use a nice struct field initialization syntax and **hopefully** + * have all the padding bytes initialized to zero. It's not guaranteed though, + * when copying literal, that compiler won't copy garbage in literal's padding + * bytes, but that's the best way I've found and it seems to work in practice. + * + * Macro declares opts struct of given type and name, zero-initializes, + * including any extra padding, it with memset() and then assigns initial + * values provided by users in struct initializer-syntax as varargs. + */ +#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \ + struct TYPE NAME = ({ \ + memset(&NAME, 0, sizeof(struct TYPE)); \ + (struct TYPE) { \ + .sz = sizeof(struct TYPE), \ + __VA_ARGS__ \ + }; \ + }) + struct bpf_create_map_attr { const char *name; enum bpf_map_type map_type; diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 920d4e06a5f9..9d788c1b9874 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -46,7 +46,6 @@ #include <gelf.h> #include "libbpf.h" -#include "bpf.h" #include "btf.h" #include "str_error.h" #include "libbpf_internal.h" diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 0dbf4bfba0c4..03189880d99e 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -17,6 +17,8 @@ #include <sys/types.h> // for size_t #include <linux/bpf.h> +#include "bpf.h" + #ifdef __cplusplus extern "C" { #endif @@ -67,28 +69,6 @@ struct bpf_object_open_attr { enum bpf_prog_type prog_type; }; -/* Helper macro to declare and initialize libbpf options struct - * - * This dance with uninitialized declaration, followed by memset to zero, - * followed by assignment using compound literal syntax is done to preserve - * ability to use a nice struct field initialization syntax and **hopefully** - * have all the padding bytes initialized to zero. It's not guaranteed though, - * when copying literal, that compiler won't copy garbage in literal's padding - * bytes, but that's the best way I've found and it seems to work in practice. - * - * Macro declares opts struct of given type and name, zero-initializes, - * including any extra padding, it with memset() and then assigns initial - * values provided by users in struct initializer-syntax as varargs. - */ -#define DECLARE_LIBBPF_OPTS(TYPE, NAME, ...) \ - struct TYPE NAME = ({ \ - memset(&NAME, 0, sizeof(struct TYPE)); \ - (struct TYPE) { \ - .sz = sizeof(struct TYPE), \ - __VA_ARGS__ \ - }; \ - }) - struct bpf_object_open_opts { /* size of this struct, for forward/backward compatiblity */ size_t sz; -- 2.17.1