From: "Toke Høiland-Jørgensen" <toke@redhat.com>
To: Daniel Borkmann <daniel@iogearbox.net>
Cc: Alexei Starovoitov <ast@kernel.org>,
Martin KaFai Lau <kafai@fb.com>, Song Liu <songliubraving@fb.com>,
Yonghong Song <yhs@fb.com>,
Marek Majkowski <marek@cloudflare.com>,
Lorenz Bauer <lmb@cloudflare.com>,
David Miller <davem@davemloft.net>,
Jesper Dangaard Brouer <brouer@redhat.com>,
netdev@vger.kernel.org, bpf@vger.kernel.org
Subject: [PATCH bpf-next 1/9] hashtab: Add new bpf_map_fd_put_value op
Date: Wed, 02 Oct 2019 15:30:25 +0200 [thread overview]
Message-ID: <157002302565.1302756.3212597038181844705.stgit@alrua-x1> (raw)
In-Reply-To: <157002302448.1302756.5727756706334050763.stgit@alrua-x1>
From: Toke Høiland-Jørgensen <toke@redhat.com>
The fd type maps all resolve the fd into a pointer to the underlying object
when it is inserted into the map, and stores that pointer as the real array
value. The htab code assumes that the map value is this single pointer, and
dereferences it before passing it to the map fd_put_ptr() op.
For xdp chain maps we want to be able to store multiple pointers, so we
need to get the pointer to the map value store, not the dereferenced
pointer to the actual object. So add a new more general
bpf_map_fd_put_value() op that takes the map value instead of the
dereferenced pointer, and use this on map element free.
Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
---
include/linux/bpf.h | 1 +
kernel/bpf/hashtab.c | 16 ++++++----------
kernel/bpf/map_in_map.c | 7 +++++++
kernel/bpf/map_in_map.h | 1 +
4 files changed, 15 insertions(+), 10 deletions(-)
diff --git a/include/linux/bpf.h b/include/linux/bpf.h
index 5b9d22338606..be3e9e9109c7 100644
--- a/include/linux/bpf.h
+++ b/include/linux/bpf.h
@@ -50,6 +50,7 @@ struct bpf_map_ops {
void *(*map_fd_get_ptr)(struct bpf_map *map, struct file *map_file,
int fd);
void (*map_fd_put_ptr)(void *ptr);
+ void (*map_fd_put_value)(void *value);
u32 (*map_gen_lookup)(struct bpf_map *map, struct bpf_insn *insn_buf);
u32 (*map_fd_sys_lookup_elem)(void *ptr);
void (*map_seq_show_elem)(struct bpf_map *map, void *key,
diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index 22066a62c8c9..113e1286e184 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -87,11 +87,6 @@ static inline void __percpu *htab_elem_get_ptr(struct htab_elem *l, u32 key_size
return *(void __percpu **)(l->key + key_size);
}
-static void *fd_htab_map_get_ptr(const struct bpf_map *map, struct htab_elem *l)
-{
- return *(void **)(l->key + roundup(map->key_size, 8));
-}
-
static struct htab_elem *get_htab_elem(struct bpf_htab *htab, int i)
{
return (struct htab_elem *) (htab->elems + i * htab->elem_size);
@@ -679,10 +674,10 @@ static void free_htab_elem(struct bpf_htab *htab, struct htab_elem *l)
{
struct bpf_map *map = &htab->map;
- if (map->ops->map_fd_put_ptr) {
- void *ptr = fd_htab_map_get_ptr(map, l);
+ if (map->ops->map_fd_put_value) {
+ void *value = l->key + round_up(map->key_size, 8);
- map->ops->map_fd_put_ptr(ptr);
+ map->ops->map_fd_put_value(value);
}
if (htab_is_prealloc(htab)) {
@@ -1400,9 +1395,9 @@ static void fd_htab_map_free(struct bpf_map *map)
head = select_bucket(htab, i);
hlist_nulls_for_each_entry_safe(l, n, head, hash_node) {
- void *ptr = fd_htab_map_get_ptr(map, l);
+ void *value = l->key + round_up(map->key_size, 8);
- map->ops->map_fd_put_ptr(ptr);
+ map->ops->map_fd_put_value(value);
}
}
@@ -1510,6 +1505,7 @@ const struct bpf_map_ops htab_of_maps_map_ops = {
.map_delete_elem = htab_map_delete_elem,
.map_fd_get_ptr = bpf_map_fd_get_ptr,
.map_fd_put_ptr = bpf_map_fd_put_ptr,
+ .map_fd_put_value = bpf_map_fd_put_value,
.map_fd_sys_lookup_elem = bpf_map_fd_sys_lookup_elem,
.map_gen_lookup = htab_of_map_gen_lookup,
.map_check_btf = map_check_no_btf,
diff --git a/kernel/bpf/map_in_map.c b/kernel/bpf/map_in_map.c
index fab4fb134547..1b4e8b6da777 100644
--- a/kernel/bpf/map_in_map.c
+++ b/kernel/bpf/map_in_map.c
@@ -114,6 +114,13 @@ void bpf_map_fd_put_ptr(void *ptr)
bpf_map_put(ptr);
}
+void bpf_map_fd_put_value(void *value)
+{
+ void **ptr = value;
+
+ bpf_map_fd_put_ptr(*ptr);
+}
+
u32 bpf_map_fd_sys_lookup_elem(void *ptr)
{
return ((struct bpf_map *)ptr)->id;
diff --git a/kernel/bpf/map_in_map.h b/kernel/bpf/map_in_map.h
index a507bf6ef8b9..68d1a52e1757 100644
--- a/kernel/bpf/map_in_map.h
+++ b/kernel/bpf/map_in_map.h
@@ -16,6 +16,7 @@ bool bpf_map_meta_equal(const struct bpf_map *meta0,
void *bpf_map_fd_get_ptr(struct bpf_map *map, struct file *map_file,
int ufd);
void bpf_map_fd_put_ptr(void *ptr);
+void bpf_map_fd_put_value(void *value);
u32 bpf_map_fd_sys_lookup_elem(void *ptr);
#endif
next prev parent reply other threads:[~2019-10-02 13:30 UTC|newest]
Thread overview: 53+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-02 13:30 [PATCH bpf-next 0/9] xdp: Support multiple programs on a single interface through chain calls Toke Høiland-Jørgensen
2019-10-02 13:30 ` Toke Høiland-Jørgensen [this message]
2019-10-02 13:30 ` [PATCH bpf-next 2/9] xdp: Add new xdp_chain_map type for specifying XDP call sequences Toke Høiland-Jørgensen
2019-10-02 15:50 ` Lorenz Bauer
2019-10-02 18:25 ` Toke Høiland-Jørgensen
2019-10-02 13:30 ` [PATCH bpf-next 3/9] xdp: Support setting and getting device chain map Toke Høiland-Jørgensen
2019-10-02 15:50 ` Lorenz Bauer
2019-10-02 18:32 ` Toke Høiland-Jørgensen
2019-10-02 18:07 ` kbuild test robot
2019-10-02 18:29 ` kbuild test robot
2019-10-02 13:30 ` [PATCH bpf-next 4/9] xdp: Implement chain call logic to support multiple programs on one interface Toke Høiland-Jørgensen
2019-10-02 17:33 ` kbuild test robot
2019-10-02 17:53 ` kbuild test robot
2019-10-02 13:30 ` [PATCH bpf-next 5/9] tools/include/uapi: Add XDP chain map definitions Toke Høiland-Jørgensen
2019-10-02 13:30 ` [PATCH bpf-next 6/9] tools/libbpf_probes: Add support for xdp_chain map type Toke Høiland-Jørgensen
2019-10-02 13:30 ` [PATCH bpf-next 7/9] bpftool: Add definitions " Toke Høiland-Jørgensen
2019-10-02 13:30 ` [PATCH bpf-next 8/9] libbpf: Add support for setting and getting XDP chain maps Toke Høiland-Jørgensen
2019-10-02 13:30 ` [PATCH bpf-next 9/9] selftests: Add tests for XDP chain calls Toke Høiland-Jørgensen
2019-10-02 15:10 ` [PATCH bpf-next 0/9] xdp: Support multiple programs on a single interface through " Alan Maguire
2019-10-02 15:33 ` Toke Høiland-Jørgensen
2019-10-02 16:34 ` John Fastabend
2019-10-02 18:33 ` Toke Høiland-Jørgensen
2019-10-02 20:34 ` John Fastabend
2019-10-03 7:48 ` Toke Høiland-Jørgensen
2019-10-03 10:09 ` Jesper Dangaard Brouer
2019-10-03 19:45 ` John Fastabend
2019-10-02 16:35 ` Lorenz Bauer
2019-10-02 18:54 ` Toke Høiland-Jørgensen
2019-10-02 16:43 ` John Fastabend
2019-10-02 19:09 ` Toke Høiland-Jørgensen
2019-10-02 19:15 ` Daniel Borkmann
2019-10-02 19:29 ` Toke Høiland-Jørgensen
2019-10-02 19:46 ` Alexei Starovoitov
2019-10-03 7:58 ` Toke Høiland-Jørgensen
2019-10-02 18:38 ` Song Liu
2019-10-02 18:54 ` Song Liu
2019-10-02 19:25 ` Toke Høiland-Jørgensen
2019-10-03 8:53 ` Jesper Dangaard Brouer
2019-10-03 14:03 ` Alexei Starovoitov
2019-10-03 14:33 ` Toke Høiland-Jørgensen
2019-10-03 14:53 ` Edward Cree
2019-10-03 18:49 ` Jesper Dangaard Brouer
2019-10-03 19:35 ` John Fastabend
2019-10-04 8:09 ` Toke Høiland-Jørgensen
2019-10-04 10:34 ` Edward Cree
2019-10-04 15:58 ` Lorenz Bauer
2019-10-07 16:43 ` Edward Cree
2019-10-07 17:12 ` Lorenz Bauer
2019-10-07 19:21 ` Edward Cree
2019-10-07 21:01 ` Alexei Starovoitov
2019-10-02 19:23 ` Toke Høiland-Jørgensen
2019-10-02 19:49 ` Song Liu
2019-10-03 7:59 ` Toke Høiland-Jørgensen
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=157002302565.1302756.3212597038181844705.stgit@alrua-x1 \
--to=toke@redhat.com \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=brouer@redhat.com \
--cc=daniel@iogearbox.net \
--cc=davem@davemloft.net \
--cc=kafai@fb.com \
--cc=lmb@cloudflare.com \
--cc=marek@cloudflare.com \
--cc=netdev@vger.kernel.org \
--cc=songliubraving@fb.com \
--cc=yhs@fb.com \
/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;
as well as URLs for NNTP newsgroup(s).