diff options
author | Sergey Senozhatsky <sergey.senozhatsky@gmail.com> | 2014-04-07 18:38:19 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-07 19:36:02 -0400 |
commit | d61f98c70e8b0d324e8e83be2ed546d6295e63f3 (patch) | |
tree | ef4c07ad1d867c0ad97d0478decd78ba209a9387 /drivers/block/zram | |
parent | 6e76668e415adf799839f0ab205142ad7002d260 (diff) |
zram: move comp allocation out of init_lock
While fixing lockdep spew of ->init_lock reported by Sasha Levin [1],
Minchan Kim noted [2] that it's better to move compression backend
allocation (using GPF_KERNEL) out of the ->init_lock lock, same way as
with zram_meta_alloc(), in order to prevent the same lockdep spew.
[1] https://lkml.org/lkml/2014/2/27/337
[2] https://lkml.org/lkml/2014/3/3/32
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Reported-by: Minchan Kim <minchan@kernel.org>
Acked-by: Minchan Kim <minchan@kernel.org>
Cc: Sasha Levin <sasha.levin@oracle.com>
Acked-by: Jerome Marchand <jmarchan@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/block/zram')
-rw-r--r-- | drivers/block/zram/zram_drv.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 15d46f2e158c..e4d536b485e6 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
@@ -580,9 +580,10 @@ static ssize_t disksize_store(struct device *dev, | |||
580 | struct device_attribute *attr, const char *buf, size_t len) | 580 | struct device_attribute *attr, const char *buf, size_t len) |
581 | { | 581 | { |
582 | u64 disksize; | 582 | u64 disksize; |
583 | struct zcomp *comp; | ||
583 | struct zram_meta *meta; | 584 | struct zram_meta *meta; |
584 | struct zram *zram = dev_to_zram(dev); | 585 | struct zram *zram = dev_to_zram(dev); |
585 | int err; | 586 | int err = -EINVAL; |
586 | 587 | ||
587 | disksize = memparse(buf, NULL); | 588 | disksize = memparse(buf, NULL); |
588 | if (!disksize) | 589 | if (!disksize) |
@@ -593,30 +594,32 @@ static ssize_t disksize_store(struct device *dev, | |||
593 | if (!meta) | 594 | if (!meta) |
594 | return -ENOMEM; | 595 | return -ENOMEM; |
595 | 596 | ||
597 | comp = zcomp_create(zram->compressor, zram->max_comp_streams); | ||
598 | if (!comp) { | ||
599 | pr_info("Cannot initialise %s compressing backend\n", | ||
600 | zram->compressor); | ||
601 | goto out_cleanup; | ||
602 | } | ||
603 | |||
596 | down_write(&zram->init_lock); | 604 | down_write(&zram->init_lock); |
597 | if (init_done(zram)) { | 605 | if (init_done(zram)) { |
606 | up_write(&zram->init_lock); | ||
598 | pr_info("Cannot change disksize for initialized device\n"); | 607 | pr_info("Cannot change disksize for initialized device\n"); |
599 | err = -EBUSY; | 608 | err = -EBUSY; |
600 | goto out_free_meta; | 609 | goto out_cleanup; |
601 | } | ||
602 | |||
603 | zram->comp = zcomp_create(zram->compressor, zram->max_comp_streams); | ||
604 | if (!zram->comp) { | ||
605 | pr_info("Cannot initialise %s compressing backend\n", | ||
606 | zram->compressor); | ||
607 | err = -EINVAL; | ||
608 | goto out_free_meta; | ||
609 | } | 610 | } |
610 | 611 | ||
611 | zram->meta = meta; | 612 | zram->meta = meta; |
613 | zram->comp = comp; | ||
612 | zram->disksize = disksize; | 614 | zram->disksize = disksize; |
613 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); | 615 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); |
614 | up_write(&zram->init_lock); | 616 | up_write(&zram->init_lock); |
615 | 617 | ||
616 | return len; | 618 | return len; |
617 | 619 | ||
618 | out_free_meta: | 620 | out_cleanup: |
619 | up_write(&zram->init_lock); | 621 | if (comp) |
622 | zcomp_destroy(comp); | ||
620 | zram_meta_free(meta); | 623 | zram_meta_free(meta); |
621 | return err; | 624 | return err; |
622 | } | 625 | } |