Martin Lau <kafai@xxxxxx> writes: > On Fri, Oct 18, 2019 at 09:44:18PM +0200, Toke Høiland-Jørgensen wrote: >> 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@xxxxxxxxxxxxxxxxxxx> >> Signed-off-by: Toke Høiland-Jørgensen <toke@xxxxxxxxxx> >> --- >> 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