linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 1/4] zram: Fix deadlock bug in partial read/write
@ 2013-02-03 23:46 Minchan Kim
  2013-02-03 23:46 ` [PATCH v7 2/4] zram: force disksize setting before using zram Minchan Kim
                   ` (3 more replies)
  0 siblings, 4 replies; 10+ messages in thread
From: Minchan Kim @ 2013-02-03 23:46 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: linux-mm, linux-kernel, Nitin Gupta, Seth Jennings,
	Konrad Rzeszutek Wilk, Dan Magenheimer, Pekka Enberg, jmarchan,
	Andrew Morton, Minchan Kim, stable, Pekka Enberg

Now zram allocates new page with GFP_KERNEL in zram I/O path
if IO is partial. Unfortunately, It may cause deadlock with
reclaim path like below.

write_page from fs
fs_lock
allocation(GFP_KERNEL)
reclaim
pageout
				write_page from fs
				fs_lock <-- deadlock

This patch fixes it by using GFP_NOIO.  In read path, we
reorganize code flow so that kmap_atomic is called after the
GFP_NOIO allocation.

Cc: stable@vger.kernel.org
Acked-by: Jerome Marchand <jmarchan@redhat.com>
Acked-by: Nitin Gupta <ngupta@vflare.org>
[ penberg@kernel.org: don't use GFP_ATOMIC ]
Signed-off-by: Pekka Enberg <penberg@kernel.org>
Signed-off-by: Minchan Kim <minchan@kernel.org>
---
 drivers/staging/zram/zram_drv.c |    9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
index 941b7c6..262265e 100644
--- a/drivers/staging/zram/zram_drv.c
+++ b/drivers/staging/zram/zram_drv.c
@@ -217,11 +217,12 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec,
 		return 0;
 	}
 
-	user_mem = kmap_atomic(page);
 	if (is_partial_io(bvec))
 		/* Use  a temporary buffer to decompress the page */
-		uncmem = kmalloc(PAGE_SIZE, GFP_KERNEL);
-	else
+		uncmem = kmalloc(PAGE_SIZE, GFP_NOIO);
+
+	user_mem = kmap_atomic(page);
+	if (!is_partial_io(bvec))
 		uncmem = user_mem;
 
 	if (!uncmem) {
@@ -268,7 +269,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
 		 * This is a partial IO. We need to read the full page
 		 * before to write the changes.
 		 */
-		uncmem = kmalloc(PAGE_SIZE, GFP_KERNEL);
+		uncmem = kmalloc(PAGE_SIZE, GFP_NOIO);
 		if (!uncmem) {
 			pr_info("Error allocating temp memory!\n");
 			ret = -ENOMEM;
-- 
1.7.9.5


^ permalink raw reply related	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-02-05  6:20 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-02-03 23:46 [PATCH v7 1/4] zram: Fix deadlock bug in partial read/write Minchan Kim
2013-02-03 23:46 ` [PATCH v7 2/4] zram: force disksize setting before using zram Minchan Kim
2013-02-04  7:33   ` Ric Mason
2013-02-05  5:58     ` Minchan Kim
2013-02-03 23:46 ` [PATCH v7 3/4] zram: give up lazy initialization of zram metadata Minchan Kim
2013-02-03 23:46 ` [PATCH v7 4/4] zram: get rid of lockdep warning Minchan Kim
2013-02-04  7:39   ` Ric Mason
2013-02-05  6:06     ` Minchan Kim
2013-02-05  6:19       ` Ric Mason
2013-02-03 23:50 ` [PATCH v7 1/4] zram: Fix deadlock bug in partial read/write Minchan Kim

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).