Messages in this thread Patch in this message | | | Date | Wed, 30 Nov 2011 14:14:32 +0100 | From | Jerome Marchand <> | Subject | [PATCH 1/2] Staging: zram: Turn lockdep off during zram_init_device() |
| |
zram->init_lock can be hold over an allocation that may try to reclaim memory in zram_init_device(). The same lock can later be taken from a reclaim context in zram_make_request(), thus triggering a lockdep warning. However, memory can not be reclaimed to an uninitialized zram device. Therefore, this warning is a false positive. To prevent the warning to occur, we turn lockdep off during while the device is initialized.
Signed-off-by: Jerome Marchand <jmarchan@redhat.com> Reported-by: Witold Baryluk <baryluk@smp.if.uj.edu.pl> --- zram_drv.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c index 09de99f..34f4b96 100644 --- a/drivers/staging/zram/zram_drv.c +++ b/drivers/staging/zram/zram_drv.c @@ -637,10 +637,22 @@ int zram_init_device(struct zram *zram) int ret; size_t num_pages; + /* + * Here we hold init_lock over allocations that may try to reclaim + * memory. The same lock is also taken from a reclaim context in + * zram_make_request(). That end up in a lockdep warning. + * Moreover the table can be quite big an it wouldn't be reasonable to + * use kmalloc(GFP_NOFS,...) to allocate it. + * Fortunately, memory can not be reclaimed to an uninitialized zram + * device, so this warning is a false positive. Therefore, to prevent + * the warning, we turn lockdep off here. + */ + lockdep_off(); down_write(&zram->init_lock); if (zram->init_done) { up_write(&zram->init_lock); + lockdep_on(); return 0; } @@ -682,6 +694,7 @@ int zram_init_device(struct zram *zram) zram->init_done = 1; up_write(&zram->init_lock); + lockdep_on(); pr_debug("Initialization done!\n"); return 0; @@ -692,6 +705,7 @@ fail_no_table: fail: __zram_reset_device(zram); up_write(&zram->init_lock); + lockdep_on(); pr_err("Initialization failed: err=%d\n", ret); return ret; }
| |