On Sun, Apr 26, 2020 at 6:08 PM Jesse DuMond <suttonshiredev@xxxxxxxxx> wrote: > > Hi there, > > I am writing some test code that tries repeatedly to create a umem > and socket and then deletes them both. I'm using the libbpf function > xsk_umem__create/delete and xsk_socket__create/xsk_socket__delete. I > am getting an EBUSY from xsk_socket__create when trying to create a > socket after deleting a socket on the same interface and queue number. > The attached program reproduces the error. > > I've traced the EBUSY error to this call to xdp_umem_assign_dev in the > kernel: https://github.com/torvalds/linux/blob/v5.3/net/xdp/xsk.c#L500 > That call is made during the bind call in xsk_socket__create. As far > as I can tell this error is because the work of xdp_umem_clear_dev is > actually called asynchronously after xsk_socket__delete. Putting a > sleep between xsk_socket__delete and xsk_socket__create makes this > code succeed. > > Am I trying to do something that is not supposed to be supported? No, you are doing everything correctly. The tear down of a socket is unfortunately asynchronous due to legacy reasons that are not true anymore. We do have a item in the backlog to make this synchronous, but have not gotten around to it yet. So sorry, we have to live with this for a while more. /Magnus