OSDN Git Service

dm crypt: avoid deadlock in mempools
authorMikulas Patocka <mpatocka@redhat.com>
Fri, 13 Feb 2015 13:24:41 +0000 (08:24 -0500)
committerMike Snitzer <snitzer@redhat.com>
Mon, 16 Feb 2015 16:11:13 +0000 (11:11 -0500)
commit7145c241a1bf2841952c3e297c4080b357b3e52d
tree12c9a8ffce670390ea5b518fbe6d9b64f90f05b9
parentcf2f1abfbd0dba701f7f16ef619e4d2485de3366
dm crypt: avoid deadlock in mempools

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: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-crypt.c