OSDN Git Service

xdp: Remove map_to_flush and map swap detection
authorBjörn Töpel <bjorn.topel@intel.com>
Thu, 19 Dec 2019 06:10:05 +0000 (07:10 +0100)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 20 Dec 2019 05:09:43 +0000 (21:09 -0800)
Now that all XDP maps that can be used with bpf_redirect_map() tracks
entries to be flushed in a global fashion, there is not need to track
that the map has changed and flush from xdp_do_generic_map()
anymore. All entries will be flushed in xdp_do_flush_map().

This means that the map_to_flush can be removed, and the corresponding
checks. Moving the flush logic to one place, xdp_do_flush_map(), give
a bulking behavior and performance boost.

Signed-off-by: Björn Töpel <bjorn.topel@intel.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: Toke Høiland-Jørgensen <toke@redhat.com>
Link: https://lore.kernel.org/bpf/20191219061006.21980-8-bjorn.topel@gmail.com
include/linux/filter.h
net/core/filter.c

index 37ac702..69d6706 100644 (file)
@@ -592,7 +592,6 @@ struct bpf_redirect_info {
        u32 tgt_index;
        void *tgt_value;
        struct bpf_map *map;
-       struct bpf_map *map_to_flush;
        u32 kern_flags;
 };
 
index c706325..d9caa3e 100644 (file)
@@ -3547,26 +3547,9 @@ static int __bpf_tx_xdp_map(struct net_device *dev_rx, void *fwd,
 
 void xdp_do_flush_map(void)
 {
-       struct bpf_redirect_info *ri = this_cpu_ptr(&bpf_redirect_info);
-       struct bpf_map *map = ri->map_to_flush;
-
-       ri->map_to_flush = NULL;
-       if (map) {
-               switch (map->map_type) {
-               case BPF_MAP_TYPE_DEVMAP:
-               case BPF_MAP_TYPE_DEVMAP_HASH:
-                       __dev_map_flush();
-                       break;
-               case BPF_MAP_TYPE_CPUMAP:
-                       __cpu_map_flush();
-                       break;
-               case BPF_MAP_TYPE_XSKMAP:
-                       __xsk_map_flush();
-                       break;
-               default:
-                       break;
-               }
-       }
+       __dev_map_flush();
+       __cpu_map_flush();
+       __xsk_map_flush();
 }
 EXPORT_SYMBOL_GPL(xdp_do_flush_map);
 
@@ -3615,14 +3598,10 @@ static int xdp_do_redirect_map(struct net_device *dev, struct xdp_buff *xdp,
        ri->tgt_value = NULL;
        WRITE_ONCE(ri->map, NULL);
 
-       if (ri->map_to_flush && unlikely(ri->map_to_flush != map))
-               xdp_do_flush_map();
-
        err = __bpf_tx_xdp_map(dev, fwd, map, xdp);
        if (unlikely(err))
                goto err;
 
-       ri->map_to_flush = map;
        _trace_xdp_redirect_map(dev, xdp_prog, fwd, map, index);
        return 0;
 err: