• Wang Nan's avatar
    perf bpf: Add API to set values to map entries in a bpf object · 066dacbf
    Wang Nan authored
    bpf__config_obj() is introduced as a core API to config BPF object after
    loading. One configuration option of maps is introduced. After this
    patch BPF object can accept assignments like:
    
      map:my_map.value=1234
    
    (map.my_map.value looks pretty. However, there's a small but hard to fix
    problem related to flex's greedy matching. Please see [1].  Choose ':'
    to avoid it in a simpler way.)
    
    This patch is more complex than the work it does because the
    consideration of extension. In designing BPF map configuration, the
    following things should be considered:
    
     1. Array indices selection: perf should allow user setting different
        value for different slots in an array, with syntax like:
        map:my_map.value[0,3...6]=1234;
    
     2. A map should be set by different config terms, each for a part
        of it. For example, set each slot to the pid of a thread;
    
     3. Type of value: integer is not the only valid value type. A perf
        counter can also be put into a map after commit 35578d79
        ("bpf: Implement function bpf_perf_event_read() that get the
          selected hardware PMU counter")
    
     4. For a hash table, it should be possible to use a string or other
        value as a key;
    
     5. It is possible that map configuration is unable to be setup
        during parsing. A perf counter is an example.
    
    Therefore, this patch does the following:
    
     1. Instead of updating map element during parsing, this patch stores
        map config options in 'struct bpf_map_priv'. Following patches
        will apply those configs at an appropriate time;
    
     2. Link map operations in a list so a map can have multiple config
        terms attached, so different parts can be configured separately;
    
     3. Make 'struct bpf_map_priv' extensible so that the following patches
        can add new types of keys and operations;
    
     4. Use bpf_obj_config__map_funcs array to support more map config options.
    
    Since the patch changing the event parser to parse BPF object config is
    relative large, I've put it in another commit. Code in this patch can be
    tested after applying the next patch.
    
    [1] http://lkml.kernel.org/g/564ED621.4050500@huawei.comSigned-off-by: default avatarWang Nan <wangnan0@huawei.com>
    Cc: Adrian Hunter <adrian.hunter@intel.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
    Cc: Cody P Schafer <dev@codyps.com>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Jeremie Galarneau <jeremie.galarneau@efficios.com>
    Cc: Jiri Olsa <jolsa@kernel.org>
    Cc: Kirill Smelkov <kirr@nexedi.com>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1456132275-98875-4-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarHe Kuang <hekuang@huawei.com>
    [ Changes "maps:my_map.value" to "map:my_map.value", improved error messages ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    066dacbf
bpf-loader.c 25.1 KB