dm bufio: drop the lock when doing GFP_NOIO allocation
commit 41c73a49df31151f4ff868f28fe4f129f113fa2c upstream. If the first allocation attempt using GFP_NOWAIT fails, drop the lock and retry using GFP_NOIO allocation (lock is dropped because the allocation can take some time). Note that we won't do GFP_NOIO allocation when we loop for the second time, because the lock shouldn't be dropped between __wait_for_free_buffer and __get_unclaimed_buffer. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7396cb30cb
commit
3ce44cad02
1 changed files with 10 additions and 0 deletions
|
@ -813,6 +813,7 @@ enum new_flag {
|
||||||
static struct dm_buffer *__alloc_buffer_wait_no_callback(struct dm_bufio_client *c, enum new_flag nf)
|
static struct dm_buffer *__alloc_buffer_wait_no_callback(struct dm_bufio_client *c, enum new_flag nf)
|
||||||
{
|
{
|
||||||
struct dm_buffer *b;
|
struct dm_buffer *b;
|
||||||
|
bool tried_noio_alloc = false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* dm-bufio is resistant to allocation failures (it just keeps
|
* dm-bufio is resistant to allocation failures (it just keeps
|
||||||
|
@ -837,6 +838,15 @@ static struct dm_buffer *__alloc_buffer_wait_no_callback(struct dm_bufio_client
|
||||||
if (nf == NF_PREFETCH)
|
if (nf == NF_PREFETCH)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (dm_bufio_cache_size_latch != 1 && !tried_noio_alloc) {
|
||||||
|
dm_bufio_unlock(c);
|
||||||
|
b = alloc_buffer(c, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
|
||||||
|
dm_bufio_lock(c);
|
||||||
|
if (b)
|
||||||
|
return b;
|
||||||
|
tried_noio_alloc = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!list_empty(&c->reserved_buffers)) {
|
if (!list_empty(&c->reserved_buffers)) {
|
||||||
b = list_entry(c->reserved_buffers.next,
|
b = list_entry(c->reserved_buffers.next,
|
||||||
struct dm_buffer, lru_list);
|
struct dm_buffer, lru_list);
|
||||||
|
|
Loading…
Add table
Reference in a new issue