From: Jesper Dangaard Brouer <brouer@redhat.com>
To: kafai@fb.com
Cc: netdev@vger.kernel.org, eric@regit.org,
Daniel Borkmann <borkmann@iogearbox.net>,
Alexei Starovoitov <alexei.starovoitov@gmail.com>,
Jesper Dangaard Brouer <brouer@redhat.com>
Subject: [net-next PATCH 3/4] samples/bpf: load_bpf.c make callback fixup more flexible
Date: Tue, 02 May 2017 14:32:01 +0200 [thread overview]
Message-ID: <149372832108.22268.4265414102730853145.stgit@firesoul> (raw)
In-Reply-To: <149372826543.22268.3617359219409721129.stgit@firesoul>
Do this change before others start to use this callback.
Change map_perf_test_user.c which seems to be the only user.
This patch extends capabilities of commit 9fd63d05f3e8 ("bpf:
Allow bpf sample programs (*_user.c) to change bpf_map_def").
Give fixup callback access to struct bpf_map_data, instead of
only stuct bpf_map_def. This add flexibility to allow userspace
to reassign the map file descriptor. This is very useful when
wanting to share maps between several bpf programs.
Signed-off-by: Jesper Dangaard Brouer <brouer@redhat.com>
---
samples/bpf/bpf_load.c | 17 ++++++++---------
samples/bpf/bpf_load.h | 10 ++++++++--
samples/bpf/map_perf_test_user.c | 14 +++++++-------
3 files changed, 23 insertions(+), 18 deletions(-)
diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c
index fedec29c7817..74456b3eb89a 100644
--- a/samples/bpf/bpf_load.c
+++ b/samples/bpf/bpf_load.c
@@ -39,13 +39,6 @@ int event_fd[MAX_PROGS];
int prog_cnt;
int prog_array_fd = -1;
-/* Keeping relevant info on maps */
-struct bpf_map_data {
- int fd;
- char *name;
- size_t elf_offset;
- struct bpf_map_def def;
-};
struct bpf_map_data map_data[MAX_MAPS];
int map_data_count = 0;
@@ -202,8 +195,14 @@ static int load_maps(struct bpf_map_data *maps, int nr_maps,
int i;
for (i = 0; i < nr_maps; i++) {
- if (fixup_map)
- fixup_map(&maps[i].def, maps[i].name, i);
+ if (fixup_map) {
+ fixup_map(&maps[i], i);
+ /* Allow userspace to assign map FD prior to creation */
+ if (maps[i].fd != -1) {
+ map_fd[i] = maps[i].fd;
+ continue;
+ }
+ }
if (maps[i].def.type == BPF_MAP_TYPE_ARRAY_OF_MAPS ||
maps[i].def.type == BPF_MAP_TYPE_HASH_OF_MAPS) {
diff --git a/samples/bpf/bpf_load.h b/samples/bpf/bpf_load.h
index 05822f83173a..4d4fd4678a64 100644
--- a/samples/bpf/bpf_load.h
+++ b/samples/bpf/bpf_load.h
@@ -15,8 +15,14 @@ struct bpf_map_def {
unsigned int inner_map_idx;
};
-typedef void (*fixup_map_cb)(struct bpf_map_def *map, const char *map_name,
- int idx);
+struct bpf_map_data {
+ int fd;
+ char *name;
+ size_t elf_offset;
+ struct bpf_map_def def;
+};
+
+typedef void (*fixup_map_cb)(struct bpf_map_data *map, int idx);
extern int map_fd[MAX_MAPS];
extern int prog_fd[MAX_PROGS];
diff --git a/samples/bpf/map_perf_test_user.c b/samples/bpf/map_perf_test_user.c
index 6ac778153315..1a8894b5ac51 100644
--- a/samples/bpf/map_perf_test_user.c
+++ b/samples/bpf/map_perf_test_user.c
@@ -320,21 +320,21 @@ static void fill_lpm_trie(void)
assert(!r);
}
-static void fixup_map(struct bpf_map_def *map, const char *name, int idx)
+static void fixup_map(struct bpf_map_data *map, int idx)
{
int i;
- if (!strcmp("inner_lru_hash_map", name)) {
+ if (!strcmp("inner_lru_hash_map", map->name)) {
inner_lru_hash_idx = idx;
- inner_lru_hash_size = map->max_entries;
+ inner_lru_hash_size = map->def.max_entries;
}
- if (!strcmp("array_of_lru_hashs", name)) {
+ if (!strcmp("array_of_lru_hashs", map->name)) {
if (inner_lru_hash_idx == -1) {
printf("inner_lru_hash_map must be defined before array_of_lru_hashs\n");
exit(1);
}
- map->inner_map_idx = inner_lru_hash_idx;
+ map->def.inner_map_idx = inner_lru_hash_idx;
array_of_lru_hashs_idx = idx;
}
@@ -345,9 +345,9 @@ static void fixup_map(struct bpf_map_def *map, const char *name, int idx)
/* Only change the max_entries for the enabled test(s) */
for (i = 0; i < NR_TESTS; i++) {
- if (!strcmp(test_map_names[i], name) &&
+ if (!strcmp(test_map_names[i], map->name) &&
(check_test_flags(i))) {
- map->max_entries = num_map_entries;
+ map->def.max_entries = num_map_entries;
}
}
}
next prev parent reply other threads:[~2017-05-02 12:32 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-02 12:31 [net-next PATCH 0/4] Improve bpf ELF-loader under samples/bpf Jesper Dangaard Brouer
2017-05-02 12:31 ` [net-next PATCH 1/4] samples/bpf: adjust rlimit RLIMIT_MEMLOCK for traceex2, tracex3 and tracex4 Jesper Dangaard Brouer
2017-05-03 0:53 ` Alexei Starovoitov
2017-05-03 8:12 ` Jesper Dangaard Brouer
2017-05-03 13:31 ` David Miller
2017-05-02 12:31 ` [net-next PATCH 2/4] samples/bpf: make bpf_load.c code compatible with ELF maps section changes Jesper Dangaard Brouer
2017-05-03 0:54 ` Alexei Starovoitov
2017-05-03 5:48 ` Jesper Dangaard Brouer
2017-05-02 12:32 ` Jesper Dangaard Brouer [this message]
2017-05-02 12:32 ` [net-next PATCH 4/4] samples/bpf: export map_data[] for more info on maps Jesper Dangaard Brouer
2017-05-02 19:40 ` [net-next PATCH 0/4] Improve bpf ELF-loader under samples/bpf David Miller
2017-05-02 20:30 ` Daniel Borkmann
2017-05-02 21:10 ` Daniel Borkmann
2017-05-03 6:16 ` Jesper Dangaard Brouer
2017-05-03 11:48 ` Daniel Borkmann
2017-05-03 13:30 ` David Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=149372832108.22268.4265414102730853145.stgit@firesoul \
--to=brouer@redhat.com \
--cc=alexei.starovoitov@gmail.com \
--cc=borkmann@iogearbox.net \
--cc=eric@regit.org \
--cc=kafai@fb.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox