bpf: allow map helpers access to map values directly
authorPaul Chaignon <paul.chaignon@orange.com>
Tue, 24 Apr 2018 13:07:54 +0000 (15:07 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Tue, 24 Apr 2018 20:39:13 +0000 (22:39 +0200)
commitd71962f3e627b5941804036755c844fabfb65ff5
treeb619bba706b401cc0c68b8aeb5f9e4ac887a5bae
parent0e25d14e5f0a3d4c32a1961e0cf58ae23b637681
bpf: allow map helpers access to map values directly

Helpers that expect ARG_PTR_TO_MAP_KEY and ARG_PTR_TO_MAP_VALUE can only
access stack and packet memory.  Allow these helpers to directly access
map values by passing registers of type PTR_TO_MAP_VALUE.

This change removes the need for an extra copy to the stack when using a
map value to perform a second map lookup, as in the following:

struct bpf_map_def SEC("maps") infobyreq = {
    .type = BPF_MAP_TYPE_HASHMAP,
    .key_size = sizeof(struct request *),
    .value_size = sizeof(struct info_t),
    .max_entries = 1024,
};
struct bpf_map_def SEC("maps") counts = {
    .type = BPF_MAP_TYPE_HASHMAP,
    .key_size = sizeof(struct info_t),
    .value_size = sizeof(u64),
    .max_entries = 1024,
};
SEC("kprobe/blk_account_io_start")
int bpf_blk_account_io_start(struct pt_regs *ctx)
{
    struct info_t *info = bpf_map_lookup_elem(&infobyreq, &ctx->di);
    u64 *count = bpf_map_lookup_elem(&counts, info);
    (*count)++;
}

Signed-off-by: Paul Chaignon <paul.chaignon@orange.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
kernel/bpf/verifier.c