diff --git a/kernel/bpf/devmap.c b/kernel/bpf/devmap.c index 3867864..45b22a5 100644 --- a/kernel/bpf/devmap.c +++ b/kernel/bpf/devmap.c @@ -685,6 +685,14 @@ static int __dev_map_hash_update_elem(struct net *net, struct bpf_map *map, if (old_dev) call_rcu(&old_dev->rcu, __dev_map_entry_free); + /* Use call_rcu() here to ensure rcu critical sections have completed + * Remembering the driver side flush operation will happen before the + * net device is removed. + */ + old_dev = xchg(&dtab->netdev_map[idx], dev); + if (old_dev) + call_rcu(&old_dev->rcu, __dev_map_entry_free); + return 0; out_err: