Skip to content

Helper function bpf_map_update_elem

v3.18

The update map element helper call is used to write values from maps.

Note

This helper function is only callable from eBPF, but has the same name as the bpf_map_update_elem userspace library function, which can only be used from userspace programs.

Definition

Copyright (c) 2015 The Libbpf Authors. All rights reserved.

static long (* const bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2;

Usage

Arguments of this helper are map which is a pointer to a map definition, key which is a pointer to the key you wish to write to, value which is a pointer to the value you wish to write to the map, and flags which are described below.

The flags argument can be one of the following values:

  • BPF_NOEXIST - If set the update will only happen if the key doesn't exist yet, to prevent overwriting existing data.
  • BPF_EXIST - If set the update will only happen if the key exists, to ensure an update and no new key creation.
  • BPF_ANY - It doesn't matter, an update will be attempted in both cases.

Info

BPF_NOEXIST isn't supported for array type maps since all keys always exist.

The return value will be 0 on success or a negative valued error number indicating a failure.

Program types

This helper call can be used in the following program types:

Map types

This helper call can be used with the following map types:

Example

#include "vmlinux.h"
#include <bpf/bpf_helpers.h>

struct {
    __uint(type, BPF_MAP_TYPE_ARRAY);
    __type(key, u32);
    __type(value, u32);
    __uint(max_entries, 1);
} cnt_map SEC(".maps");

SEC("tracepoint/syscalls/sys_enter_openat")
int bpf_prog1(void* ctx)
{
    const char fmt_str[] = "Hello, world! number of openat calls total %d\n";
    u32 key = 0, init_val=0;
    u32 *cnt = bpf_map_lookup_elem(&cnt_map, &key);
    if(cnt) {
        __sync_fetch_and_add(cnt, 1);
    } else {
        bpf_map_update_elem(&cnt_map, &key, &init_val, BPF_ANY);
        return 0;
    }
    bpf_trace_printk(fmt_str, sizeof(fmt_str), *cnt);
    return 0;
}

char LICENSE[] SEC("license") = "GPL";