Thread (3 messages) flat view 3 messages, 2 authors, 2019-10-19

Re: [PATCH bpf v3] xdp: Handle device unregister for devmap_hash map type

From: Toke Høiland-Jørgensen <hidden>
Date: 2019-10-19 11:16:36
Also in: bpf

Martin Lau [off-list ref] writes:
On Fri, Oct 18, 2019 at 09:44:18PM +0200, Toke Høiland-Jørgensen wrote:
quoted
It seems I forgot to add handling of devmap_hash type maps to the device
unregister hook for devmaps. This omission causes devices to not be
properly released, which causes hangs.

Fix this by adding the missing handler.

Fixes: 6f9d451ab1a3 ("xdp: Add devmap_hash map type for looking up devices by hashed index")
Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Toke Høiland-Jørgensen <redacted>
---
v3:
  - Use u32 for loop iterator variable
  - Since we're holding the lock we can just iterate with hlist_for_each_entry_safe()
v2:
  - Grab the update lock while walking the map and removing entries.

 kernel/bpf/devmap.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)
diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c
index c0a48f336997..012dbfb0f54b 100644
--- a/kernel/bpf/devmap.c
+++ b/kernel/bpf/devmap.c
@@ -719,6 +719,31 @@ const struct bpf_map_ops dev_map_hash_ops = {
 	.map_check_btf = map_check_no_btf,
 };
 
+static void dev_map_hash_remove_netdev(struct bpf_dtab *dtab,
+				       struct net_device *netdev)
+{
+	unsigned long flags;
+	u32 i;
+
+	spin_lock_irqsave(&dtab->index_lock, flags);
+	for (i = 0; i < dtab->n_buckets; i++) {
+		struct bpf_dtab_netdev *dev;
+		struct hlist_head *head;
+		struct hlist_node *next;
+
+		head = dev_map_index_hash(dtab, i);
+
+		hlist_for_each_entry_safe(dev, next, head, index_hlist) {
+			if (netdev != dev->dev)
+				continue;
+
+			hlist_del_rcu(&dev->index_hlist);
There is another issue...
"dtab->items--;"
Right, of course. Thanks for your diligence in spotting my silly
mistakes! Will send a v4 :)

-Toke
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help