Skip to content
  • Linus Torvalds's avatar
    vfs: Fix pathological performance case for __alloc_fd() · f3f86e33
    Linus Torvalds authored
    
    
    Al Viro points out that:
    > >     * [Linux-specific aside] our __alloc_fd() can degrade quite badly
    > > with some use patterns.  The cacheline pingpong in the bitmap is probably
    > > inevitable, unless we accept considerably heavier memory footprint,
    > > but we also have a case when alloc_fd() takes O(n) and it's _not_ hard
    > > to trigger - close(3);open(...); will have the next open() after that
    > > scanning the entire in-use bitmap.
    
    And Eric Dumazet has a somewhat realistic multithreaded microbenchmark
    that opens and closes a lot of sockets with minimal work per socket.
    
    This patch largely fixes it.  We keep a 2nd-level bitmap of the open
    file bitmaps, showing which words are already full.  So then we can
    traverse that second-level bitmap to efficiently skip already allocated
    file descriptors.
    
    On his benchmark, this improves performance by up to an order of
    magnitude, by avoiding the excessive open file bitmap scanning.
    
    Tested-and-acked-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f3f86e33