Skip to content

Helper function bpf_map_update_elem

v3.18

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

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";