xskmap: Move non-standard list manipulation to helper
authorToke Høiland-Jørgensen <toke@redhat.com>
Fri, 28 Jun 2019 09:12:34 +0000 (11:12 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 28 Jun 2019 23:31:08 +0000 (01:31 +0200)
Add a helper in list.h for the non-standard way of clearing a list that is
used in xskmap. This makes it easier to reuse it in the other map types,
and also makes sure this usage is not forgotten in any list refactorings in
the future.

Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
include/linux/list.h
kernel/bpf/xskmap.c

index e951228db4b2c64f68a05f73bd6e058652699730..85c92555e31f85f019354e54d6efb8e79c2aee17 100644 (file)
@@ -106,6 +106,20 @@ static inline void __list_del(struct list_head * prev, struct list_head * next)
        WRITE_ONCE(prev->next, next);
 }
 
+/*
+ * Delete a list entry and clear the 'prev' pointer.
+ *
+ * This is a special-purpose list clearing method used in the networking code
+ * for lists allocated as per-cpu, where we don't want to incur the extra
+ * WRITE_ONCE() overhead of a regular list_del_init(). The code that uses this
+ * needs to check the node 'prev' pointer instead of calling list_empty().
+ */
+static inline void __list_del_clearprev(struct list_head *entry)
+{
+       __list_del(entry->prev, entry->next);
+       entry->prev = NULL;
+}
+
 /**
  * list_del - deletes entry from list.
  * @entry: the element to delete from the list.
index ef7338cebd18ebdc96222e5ffad4b6ff929804e3..9bb96ace9fa126762af4761cb556937cefe880bd 100644 (file)
@@ -145,8 +145,7 @@ void __xsk_map_flush(struct bpf_map *map)
 
        list_for_each_entry_safe(xs, tmp, flush_list, flush_node) {
                xsk_flush(xs);
-               __list_del(xs->flush_node.prev, xs->flush_node.next);
-               xs->flush_node.prev = NULL;
+               __list_del_clearprev(&xs->flush_node);
        }
 }