On 28.06.2019 1:04, Jonathan Lemon wrote: > On 27 Jun 2019, at 3:15, Ilya Maximets wrote: > >> Device that bound to XDP socket will not have zero refcount until the >> userspace application will not close it. This leads to hang inside >> 'netdev_wait_allrefs()' if device unregistering requested: >> >> # ip link del p1 >> < hang on recvmsg on netlink socket > >> >> # ps -x | grep ip >> 5126 pts/0 D+ 0:00 ip link del p1 >> >> # journalctl -b >> >> Jun 05 07:19:16 kernel: >> unregister_netdevice: waiting for p1 to become free. Usage count = 1 >> >> Jun 05 07:19:27 kernel: >> unregister_netdevice: waiting for p1 to become free. Usage count = 1 >> ... >> >> Fix that by implementing NETDEV_UNREGISTER event notification handler >> to properly clean up all the resources and unref device. >> >> This should also allow socket killing via ss(8) utility. >> >> Fixes: 965a99098443 ("xsk: add support for bind for Rx") >> Signed-off-by: Ilya Maximets <i.maximets@xxxxxxxxxxx> >> --- >> include/net/xdp_sock.h | 5 +++ >> net/xdp/xdp_umem.c | 10 ++--- >> net/xdp/xdp_umem.h | 1 + >> net/xdp/xsk.c | 87 ++++++++++++++++++++++++++++++++++++------ >> 4 files changed, 87 insertions(+), 16 deletions(-) >> >> diff --git a/include/net/xdp_sock.h b/include/net/xdp_sock.h >> index d074b6d60f8a..82d153a637c7 100644 >> --- a/include/net/xdp_sock.h >> +++ b/include/net/xdp_sock.h >> @@ -61,6 +61,11 @@ struct xdp_sock { >> struct xsk_queue *tx ____cacheline_aligned_in_smp; >> struct list_head list; >> bool zc; >> + enum { >> + XSK_UNINITIALIZED = 0, >> + XSK_BINDED, >> + XSK_UNBINDED, >> + } state; > > I'd prefer that these were named better, perhaps: > XSK_READY, > XSK_BOUND, > XSK_UNBOUND, Sure. Thanks for suggestion! > > Other than that: > Acked-by: Jonathan Lemon <jonathan.lemon@xxxxxxxxx> > I'll send a new version with the new state names keeping your ACK. Best regards, Ilya Maximets.