• Mikulas Patocka's avatar
    dm crypt: avoid deadlock in mempools · 7145c241
    Mikulas Patocka authored
    Fix a theoretical deadlock introduced in the previous commit ("dm crypt:
    don't allocate pages for a partial request").
    
    The function crypt_alloc_buffer may be called concurrently.  If we allocate
    from the mempool concurrently, there is a possibility of deadlock.  For
    example, if we have mempool of 256 pages, two processes, each wanting
    256, pages allocate from the mempool concurrently, it may deadlock in a
    situation where both processes have allocated 128 pages and the mempool
    is exhausted.
    
    To avoid such a scenario we allocate the pages under a mutex.  In order
    to not degrade performance with excessive locking, we try non-blocking
    allocations without a mutex first and if that fails, we fallback to a
    blocking allocations with a mutex.
    Signed-off-by: default avatarMikulas Patocka <mpatocka@redhat.com>
    Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
    7145c241
dm-crypt.c 47.2 KB