On Wed, 7 Jun 2023 21:26:20 +0200 Daniel Borkmann wrote: > + dev = dev_get_by_index(net, attr->link_create.target_ifindex); > + if (!dev) > + return -EINVAL; > + link = kzalloc(sizeof(*link), GFP_USER); > + if (!link) { > + err = -ENOMEM; > + goto out_put; > + } > + > + bpf_link_init(&link->link, BPF_LINK_TYPE_TCX, &tcx_link_lops, prog); > + link->location = attr->link_create.attach_type; > + link->flags = attr->link_create.flags & (BPF_F_FIRST | BPF_F_LAST); > + link->dev = dev; > + > + err = bpf_link_prime(&link->link, &link_primer); > + if (err) { > + kfree(link); > + goto out_put; > + } > + rtnl_lock(); How does this work vs device unregistering? Best I can tell (and it is a large patch :() the device may have passed dev_tcx_uninstall() by the time we take the lock. > + err = tcx_link_prog_attach(&link->link, attr->link_create.flags, > + attr->link_create.tcx.relative_fd, > + attr->link_create.tcx.expected_revision); > + if (!err) > + fd = bpf_link_settle(&link_primer); > + rtnl_unlock();