Messages in this thread Patch in this message |  | | From | NeilBrown <> | Date | Mon, 10 Apr 2017 12:11:06 +1000 | Subject | [PATCH] dm-region-hash: fix strange usage of mempool_alloc. |
| |
mempool_alloc() should only be called with GFP_ATOMIC when it is not safe to wait. Passing __GFP_NOFAIL to kmalloc() says that it is safe to wait indefinitely. So this code is inconsistent.
Clearly it is OK to wait indefinitely in this code, and mempool_alloc() is able to do that. So just use mempool_alloc, and allow it to sleep. If no memory is available it will wait for something to be returned to the pool, and will retry a normal allocation regularly.
Signed-off-by: NeilBrown <neilb@suse.com> --- drivers/md/dm-region-hash.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/drivers/md/dm-region-hash.c b/drivers/md/dm-region-hash.c index 85c32b22a420..a6279f5d779e 100644 --- a/drivers/md/dm-region-hash.c +++ b/drivers/md/dm-region-hash.c @@ -287,9 +287,7 @@ static struct dm_region *__rh_alloc(struct dm_region_hash *rh, region_t region) { struct dm_region *reg, *nreg; - nreg = mempool_alloc(rh->region_pool, GFP_ATOMIC); - if (unlikely(!nreg)) - nreg = kmalloc(sizeof(*nreg), GFP_NOIO | __GFP_NOFAIL); + nreg = mempool_alloc(rh->region_pool, GFP_NOIO); nreg->state = rh->log->type->in_sync(rh->log, region, 1) ? DM_RH_CLEAN : DM_RH_NOSYNC; -- 2.12.2 [unhandled content-type:application/pgp-signature]
|  |