Skip to content



The program array map type is a specialized map type which holds pointers to other eBPF programs and is used to facilitate tail-calls.


Program array maps are used to perform tail-calls. Tail-calls allows one program to call into another, handing over flow control. In contrast to BPF-to-BPF function, tail calls do not return to the call site but instead run as if they were invoked by the kernel directly.

To perform a tail-call, a program should define a program array map. The loader should create the map and link it to program during the loading process. Afterwards the loader can load additional programs without attaching them to any kernel hooks. The loader can write the file descriptors of the programs as values to the program array map. The initial program can from then on use the bpf_tail_call helper call to perform the tail-call. Check out the page of the helper for details of tail-calls.


Both the key_size and value_size must be exactly 4 bytes. The key is a 32-bit unsigned integer since this is an array map type.

Syscall commands

The following syscall commands work with this map type:


When writing to the map, the file descriptor of a program is expected. However, BPF_MAP_LOOKUP_ELEM will return the ID of a program, which you can turn into a file descriptor using the BPF_PROG_GET_FD_BY_ID syscall command.

Helper functions


The following flags are supported by this map type.



When set, the numa_node attribute is respected during map creation.



Setting this flag will make it so the map can only be read via the syscall interface, but not written to.

For details please check the generic description.



Setting this flag will make it so the map can only be written to via the syscall interface, but not read from.