Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1619599 > unrolled thread

[PATCH] dm-verity-fec: don't check for failure from mempool_alloc(GFP_NOIO)

Started byNeilBrown <neilb@suse.com>
First post2017-04-10 04:20 +0200
Last post2017-04-10 04:20 +0200
Articles 1 — 1 participant

Back to article view | Back to linux.kernel


Contents

  [PATCH] dm-verity-fec: don't check for failure from mempool_alloc(GFP_NOIO) NeilBrown <neilb@suse.com> - 2017-04-10 04:20 +0200

#1619599 — [PATCH] dm-verity-fec: don't check for failure from mempool_alloc(GFP_NOIO)

FromNeilBrown <neilb@suse.com>
Date2017-04-10 04:20 +0200
Subject[PATCH] dm-verity-fec: don't check for failure from mempool_alloc(GFP_NOIO)
Message-ID<tux5T-2WR-7@gated-at.bofh.it>

[Multipart message — attachments visible in raw view] — view raw

mempool_alloc() cannot fail for GFP_NOIO allocation,
so there is no point testing for failure.

One place the code tested for failure was passing "0" as the GFP
flags.  This is most unusually and is probably meant to be GFP_NOIO,
so that is changed.

Allocation from ->extra_pool and ->prealloc_pool are repeated before
releasing the previous allocation.  This can deadlock if the code is
servicing a write under high memory pressure.  To avoid deadlocks,
change these to use GFP_NOWAIT and leave the error handling in place.

Signed-off-by: NeilBrown <neilb@suse.com>
---
 drivers/md/dm-verity-fec.c | 21 +++++----------------
 1 file changed, 5 insertions(+), 16 deletions(-)

diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c
index 78f36012eaca..16e224fbd356 100644
--- a/drivers/md/dm-verity-fec.c
+++ b/drivers/md/dm-verity-fec.c
@@ -308,19 +308,14 @@ static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio)
 {
 	unsigned n;
 
-	if (!fio->rs) {
-		fio->rs = mempool_alloc(v->fec->rs_pool, 0);
-		if (unlikely(!fio->rs)) {
-			DMERR("failed to allocate RS");
-			return -ENOMEM;
-		}
-	}
+	if (!fio->rs)
+		fio->rs = mempool_alloc(v->fec->rs_pool, GFP_NOIO);
 
 	fec_for_each_prealloc_buffer(n) {
 		if (fio->bufs[n])
 			continue;
 
-		fio->bufs[n] = mempool_alloc(v->fec->prealloc_pool, GFP_NOIO);
+		fio->bufs[n] = mempool_alloc(v->fec->prealloc_pool, GFP_NOWAIT);
 		if (unlikely(!fio->bufs[n])) {
 			DMERR("failed to allocate FEC buffer");
 			return -ENOMEM;
@@ -332,22 +327,16 @@ static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio)
 		if (fio->bufs[n])
 			continue;
 
-		fio->bufs[n] = mempool_alloc(v->fec->extra_pool, GFP_NOIO);
+		fio->bufs[n] = mempool_alloc(v->fec->extra_pool, GFP_NOWAIT);
 		/* we can manage with even one buffer if necessary */
 		if (unlikely(!fio->bufs[n]))
 			break;
 	}
 	fio->nbufs = n;
 
-	if (!fio->output) {
+	if (!fio->output)
 		fio->output = mempool_alloc(v->fec->output_pool, GFP_NOIO);
 
-		if (!fio->output) {
-			DMERR("failed to allocate FEC page");
-			return -ENOMEM;
-		}
-	}
-
 	return 0;
 }
 
-- 
2.12.2

[toc] | [standalone]


Back to top | Article view | linux.kernel


csiph-web