• Magnus Karlsson's avatar
    xsk: Fix umem cleanup bug at socket destruct · 537cf4e3
    Magnus Karlsson authored
    Fix a bug that is triggered when a partially setup socket is
    destroyed. For a fully setup socket, a socket that has been bound to a
    device, the cleanup of the umem is performed at the end of the buffer
    pool's cleanup work queue item. This has to be performed in a work
    queue, and not in RCU cleanup, as it is doing a vunmap that cannot
    execute in interrupt context. However, when a socket has only been
    partially set up so that a umem has been created but the buffer pool
    has not, the code erroneously directly calls the umem cleanup function
    instead of using a work queue, and this leads to a BUG_ON() in
    vunmap().
    
    As there in this case is no buffer pool, we cannot use its work queue,
    so we need to introduce a work queue for the umem and schedule this for
    the cleanup. So in the case there is no pool, we are going to use the
    umem's own work queue to schedule the cleanup. But if there is a
    pool, the cleanup of the umem is still being performed by the pool's
    work queue, as it is important that the umem is cleaned up after the
    pool.
    
    Fixes: e5e1a4bc ("xsk: Fix possible memory leak at socket close")
    Reported-by: default avatarMarek Majtyka <marekx.majtyka@intel.com>
    Signed-off-by: default avatarMagnus Karlsson <magnus.karlsson@intel.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Tested-by: default avatarMarek Majtyka <marekx.majtyka@intel.com>
    Link: https://lore.kernel.org/bpf/1605873219-21629-1-git-send-email-magnus.karlsson@gmail.com
    537cf4e3
xdp_umem.c 5.37 KB