• A
    bpf: introduce BPF_MAP_TYPE_PERCPU_HASH map · 824bd0ce
    Alexei Starovoitov 提交于
    Introduce BPF_MAP_TYPE_PERCPU_HASH map type which is used to do
    accurate counters without need to use BPF_XADD instruction which turned
    out to be too costly for high-performance network monitoring.
    In the typical use case the 'key' is the flow tuple or other long
    living object that sees a lot of events per second.
    
    bpf_map_lookup_elem() returns per-cpu area.
    Example:
    struct {
      u32 packets;
      u32 bytes;
    } * ptr = bpf_map_lookup_elem(&map, &key);
    /* ptr points to this_cpu area of the value, so the following
     * increments will not collide with other cpus
     */
    ptr->packets ++;
    ptr->bytes += skb->len;
    
    bpf_update_elem() atomically creates a new element where all per-cpu
    values are zero initialized and this_cpu value is populated with
    given 'value'.
    Note that non-per-cpu hash map always allocates new element
    and then deletes old after rcu grace period to maintain atomicity
    of update. Per-cpu hash map updates element values in-place.
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: NDavid S. Miller <davem@davemloft.net>
    824bd0ce
hashtab.c 14.2 KB