Commit d61f98c7 authored by Sergey Senozhatsky's avatar Sergey Senozhatsky Committed by Linus Torvalds
Browse files

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: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
Reported-by: default avatarMinchan Kim <minchan@kernel.org>
Acked-by: default avatarMinchan Kim <minchan@kernel.org>
Cc: Sasha Levin <sasha.levin@oracle.com>
Acked-by: default avatarJerome Marchand <jmarchan@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 6e76668e
Loading
Loading
Loading
Loading
+15 −12
Original line number Diff line number Diff line
@@ -580,9 +580,10 @@ static ssize_t disksize_store(struct device *dev,
		struct device_attribute *attr, const char *buf, size_t len)
{
	u64 disksize;
	struct zcomp *comp;
	struct zram_meta *meta;
	struct zram *zram = dev_to_zram(dev);
	int err;
	int err = -EINVAL;

	disksize = memparse(buf, NULL);
	if (!disksize)
@@ -593,30 +594,32 @@ static ssize_t disksize_store(struct device *dev,
	if (!meta)
		return -ENOMEM;

	comp = zcomp_create(zram->compressor, zram->max_comp_streams);
	if (!comp) {
		pr_info("Cannot initialise %s compressing backend\n",
				zram->compressor);
		goto out_cleanup;
	}

	down_write(&zram->init_lock);
	if (init_done(zram)) {
		up_write(&zram->init_lock);
		pr_info("Cannot change disksize for initialized device\n");
		err = -EBUSY;
		goto out_free_meta;
	}

	zram->comp = zcomp_create(zram->compressor, zram->max_comp_streams);
	if (!zram->comp) {
		pr_info("Cannot initialise %s compressing backend\n",
				zram->compressor);
		err = -EINVAL;
		goto out_free_meta;
		goto out_cleanup;
	}

	zram->meta = meta;
	zram->comp = comp;
	zram->disksize = disksize;
	set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
	up_write(&zram->init_lock);

	return len;

out_free_meta:
	up_write(&zram->init_lock);
out_cleanup:
	if (comp)
		zcomp_destroy(comp);
	zram_meta_free(meta);
	return err;
}