Re: [RFC PATCH v3 21/37] bpf tools: Create eBPF maps defined in an object file

From: Wangnan (F)
Date: Mon May 25 2015 - 05:26:48 EST




On 2015/5/19 2:48, Alexei Starovoitov wrote:
On 5/17/15 3:56 AM, Wang Nan wrote:
This patch creates maps based on 'map' section in object file using
bpf_create_map(), and store the fds into an array in
'struct bpf_object'. Since the byte order of the object may differ
from the host, swap map definition before processing.

This is the first patch in 'loading' phase. Previous patches parse ELF
object file and create needed data structure, but doesnnt play with
kernel. They belong to 'opening' phase.

Signed-off-by: Wang Nan <wangnan0@xxxxxxxxxx>
...
+ for (j = 0; j < i; j++) {
+ close(obj->maps_fds[j]);
+ obj->maps_fds[j] = -1;

this line is unnecessary, since you're freeing the whole array
at the line below:

+ }
+ free(obj->maps_fds);
+ obj->maps_fds = NULL;

...

void bpf_close_object(struct bpf_object *obj)
{
if (!obj)
return;

bpf_obj_clear_elf(obj);
+ bpf_unload_object(obj);

just realized that this API keeps elf file open for the whole
life time. I think that should be split up.
bpf_open_object() can do elf parsing, creation of maps and
bpf loading.
bpf_close_object() can unload programs, maps. That's fine,
but closing of elf file and freeing memory associated
with parsing sections should be a separate call.


Looks like I didn't describe the API of libbpf very clearly in patch 0/37.

There are two phases of the API: opening and loading. Opening phase
does ELF parsing, and records all related information info 'struct bpf_object'.
After that, ELF file itself is closed by bpf_obj_elf_finish(). See patch 19/37.
After that, caller will have a chance to adjust programs and maps (currently not
implemented). Caller should call bpf_load_object() to do real useful things with
kernel. bpf_unload_object() remove map and programs in the object from kernel. It
also calls bpf_obj_elf_finish(). However, if it has been called once, the 2nd call
doesn't take effect at all. Just in case.

Thank you.


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/