Skip to content

Commit

Permalink
tools/bpftool: Add bpftool support for bpf map element iterator
Browse files Browse the repository at this point in the history
The optional parameter "map MAP" can be added to "bpftool iter"
command to create a bpf iterator for map elements. For example,
  bpftool iter pin ./prog.o /sys/fs/bpf/p1 map id 333

For map element bpf iterator "map MAP" parameter is required.
Otherwise, bpf link creation will return an error.

Quentin Monnet kindly provided bash-completion implementation
for new "map MAP" option.

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20200723184119.590799-1-yhs@fb.com
  • Loading branch information
Yonghong Song authored and Alexei Starovoitov committed Jul 26, 2020
1 parent cd31039 commit d8793ac
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 7 deletions.
18 changes: 16 additions & 2 deletions tools/bpf/bpftool/Documentation/bpftool-iter.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,15 @@ SYNOPSIS
ITER COMMANDS
===================

| **bpftool** **iter pin** *OBJ* *PATH*
| **bpftool** **iter pin** *OBJ* *PATH* [**map** *MAP*]
| **bpftool** **iter help**
|
| *OBJ* := /a/file/of/bpf_iter_target.o
| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
DESCRIPTION
===========
**bpftool iter pin** *OBJ* *PATH*
**bpftool iter pin** *OBJ* *PATH* [**map** *MAP*]
A bpf iterator combines a kernel iterating of
particular kernel data (e.g., tasks, bpf_maps, etc.)
and a bpf program called for each kernel data object
Expand All @@ -37,6 +38,12 @@ DESCRIPTION
character ('.'), which is reserved for future extensions
of *bpffs*.

Map element bpf iterator requires an additional parameter
*MAP* so bpf program can iterate over map elements for
that map. User can have a bpf program in kernel to run
with each map element, do checking, filtering, aggregation,
etc. without copying data to user space.

User can then *cat PATH* to see the bpf iterator output.

**bpftool iter help**
Expand Down Expand Up @@ -64,6 +71,13 @@ EXAMPLES
Create a file-based bpf iterator from bpf_iter_netlink.o and pin it
to /sys/fs/bpf/my_netlink

**# bpftool iter pin bpf_iter_hashmap.o /sys/fs/bpf/my_hashmap map id 20**

::

Create a file-based bpf iterator from bpf_iter_hashmap.o and map with
id 20, and pin it to /sys/fs/bpf/my_hashmap

SEE ALSO
========
**bpf**\ (2),
Expand Down
18 changes: 17 additions & 1 deletion tools/bpf/bpftool/bash-completion/bpftool
Original file line number Diff line number Diff line change
Expand Up @@ -615,7 +615,23 @@ _bpftool()
iter)
case $command in
pin)
_filedir
case $prev in
$command)
_filedir
;;
id)
_bpftool_get_map_ids
;;
name)
_bpftool_get_map_names
;;
pinned)
_filedir
;;
*)
_bpftool_one_of_list $MAP_TYPE
;;
esac
return 0
;;
*)
Expand Down
33 changes: 29 additions & 4 deletions tools/bpf/bpftool/iter.c
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,47 @@
// Copyright (C) 2020 Facebook

#define _GNU_SOURCE
#include <unistd.h>
#include <linux/err.h>
#include <bpf/libbpf.h>

#include "main.h"

static int do_pin(int argc, char **argv)
{
DECLARE_LIBBPF_OPTS(bpf_iter_attach_opts, iter_opts);
const char *objfile, *path;
struct bpf_program *prog;
struct bpf_object *obj;
struct bpf_link *link;
int err;
int err = -1, map_fd = -1;

if (!REQ_ARGS(2))
usage();

objfile = GET_ARG();
path = GET_ARG();

/* optional arguments */
if (argc) {
if (is_prefix(*argv, "map")) {
NEXT_ARG();

if (!REQ_ARGS(2)) {
p_err("incorrect map spec");
return -1;
}

map_fd = map_parse_fd(&argc, &argv);
if (map_fd < 0)
return -1;
}
}

obj = bpf_object__open(objfile);
if (IS_ERR(obj)) {
p_err("can't open objfile %s", objfile);
return -1;
goto close_map_fd;
}

err = bpf_object__load(obj);
Expand All @@ -39,7 +57,10 @@ static int do_pin(int argc, char **argv)
goto close_obj;
}

link = bpf_program__attach_iter(prog, NULL);
if (map_fd >= 0)
iter_opts.map_fd = map_fd;

link = bpf_program__attach_iter(prog, &iter_opts);
if (IS_ERR(link)) {
err = PTR_ERR(link);
p_err("attach_iter failed for program %s",
Expand All @@ -62,14 +83,18 @@ static int do_pin(int argc, char **argv)
bpf_link__destroy(link);
close_obj:
bpf_object__close(obj);
close_map_fd:
if (map_fd >= 0)
close(map_fd);
return err;
}

static int do_help(int argc, char **argv)
{
fprintf(stderr,
"Usage: %1$s %2$s pin OBJ PATH\n"
"Usage: %1$s %2$s pin OBJ PATH [map MAP]\n"
" %1$s %2$s help\n"
" " HELP_SPEC_MAP "\n"
"",
bin_name, "iter");

Expand Down

0 comments on commit d8793ac

Please sign in to comment.