-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libbpf: Extract common user-facing helpers
LIBBPF_API and DECLARE_LIBBPF_OPTS are needed in many public libbpf API headers. Extract them into libbpf_common.h to avoid unnecessary interdependency between btf.h, libbpf.h, and bpf.h or code duplication. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20191214014341.3442258-6-andriin@fb.com
- Loading branch information
Andrii Nakryiko
authored and
Alexei Starovoitov
committed
Dec 15, 2019
1 parent
917f6b7
commit 544402d
Showing
4 changed files
with
44 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ | ||
|
||
/* | ||
* Common user-facing libbpf helpers. | ||
* | ||
* Copyright (c) 2019 Facebook | ||
*/ | ||
|
||
#ifndef __LIBBPF_LIBBPF_COMMON_H | ||
#define __LIBBPF_LIBBPF_COMMON_H | ||
|
||
#ifndef LIBBPF_API | ||
#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__ \ | ||
}; \ | ||
}) | ||
|
||
#endif /* __LIBBPF_LIBBPF_COMMON_H */ |