dm bufio: drop the lock when doing GFP_NOIO allocation
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>
This commit is contained in:
parent
d12067f428
commit
41c73a49df
@ -822,6 +822,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
|
||||||
@ -846,6 +847,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…
Reference in New Issue
Block a user