All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <20130204035809.GG2688@blaptop>

diff --git a/a/1.txt b/N1/1.txt
index 490fd5f..1f4fb90 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -40,3 +40,472 @@ On Sun, Feb 03, 2013 at 07:50:13PM -0800, Greg Kroah-Hartman wrote:
 > acks to the previous patches already.
 
 Thanks!
+
+>From 4dec70e42324379730e6b4b6e41fc17f21a44917 Mon Sep 17 00:00:00 2001
+From: Minchan Kim <minchan@kernel.org>
+Date: Mon, 4 Feb 2013 08:41:24 +0900
+Subject: [PATCH v7 4/4] zram: get rid of lockdep warning
+
+Lockdep complains about recursive deadlock of zram->init_lock.
+[1] made it false positive because we can't request IO to zram
+before setting disksize. Anyway, we should shut lockdep up to
+avoid many reporting from user.
+
+[1] : zram: force disksize setting before using zram
+
+Acked-by: Jerome Marchand <jmarchan@redhat.com>
+Signed-off-by: Minchan Kim <minchan@kernel.org>
+---
+ drivers/staging/zram/zram_drv.c   |  189 +++++++++++++++++++------------------
+ drivers/staging/zram/zram_drv.h   |   12 ++-
+ drivers/staging/zram/zram_sysfs.c |   11 ++-
+ 3 files changed, 116 insertions(+), 96 deletions(-)
+
+diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c
+index 85055c4..56e3203 100644
+--- a/drivers/staging/zram/zram_drv.c
++++ b/drivers/staging/zram/zram_drv.c
+@@ -61,22 +61,22 @@ static void zram_stat64_inc(struct zram *zram, u64 *v)
+ 	zram_stat64_add(zram, v, 1);
+ }
+ 
+-static int zram_test_flag(struct zram *zram, u32 index,
++static int zram_test_flag(struct zram_meta *meta, u32 index,
+ 			enum zram_pageflags flag)
+ {
+-	return zram->table[index].flags & BIT(flag);
++	return meta->table[index].flags & BIT(flag);
+ }
+ 
+-static void zram_set_flag(struct zram *zram, u32 index,
++static void zram_set_flag(struct zram_meta *meta, u32 index,
+ 			enum zram_pageflags flag)
+ {
+-	zram->table[index].flags |= BIT(flag);
++	meta->table[index].flags |= BIT(flag);
+ }
+ 
+-static void zram_clear_flag(struct zram *zram, u32 index,
++static void zram_clear_flag(struct zram_meta *meta, u32 index,
+ 			enum zram_pageflags flag)
+ {
+-	zram->table[index].flags &= ~BIT(flag);
++	meta->table[index].flags &= ~BIT(flag);
+ }
+ 
+ static int page_zero_filled(void *ptr)
+@@ -96,16 +96,17 @@ static int page_zero_filled(void *ptr)
+ 
+ static void zram_free_page(struct zram *zram, size_t index)
+ {
+-	unsigned long handle = zram->table[index].handle;
+-	u16 size = zram->table[index].size;
++	struct zram_meta *meta = zram->meta;
++	unsigned long handle = meta->table[index].handle;
++	u16 size = meta->table[index].size;
+ 
+ 	if (unlikely(!handle)) {
+ 		/*
+ 		 * No memory is allocated for zero filled pages.
+ 		 * Simply clear zero page flag.
+ 		 */
+-		if (zram_test_flag(zram, index, ZRAM_ZERO)) {
+-			zram_clear_flag(zram, index, ZRAM_ZERO);
++		if (zram_test_flag(meta, index, ZRAM_ZERO)) {
++			zram_clear_flag(meta, index, ZRAM_ZERO);
+ 			zram->stats.pages_zero--;
+ 		}
+ 		return;
+@@ -114,17 +115,17 @@ static void zram_free_page(struct zram *zram, size_t index)
+ 	if (unlikely(size > max_zpage_size))
+ 		zram->stats.bad_compress--;
+ 
+-	zs_free(zram->mem_pool, handle);
++	zs_free(meta->mem_pool, handle);
+ 
+ 	if (size <= PAGE_SIZE / 2)
+ 		zram->stats.good_compress--;
+ 
+ 	zram_stat64_sub(zram, &zram->stats.compr_size,
+-			zram->table[index].size);
++			meta->table[index].size);
+ 	zram->stats.pages_stored--;
+ 
+-	zram->table[index].handle = 0;
+-	zram->table[index].size = 0;
++	meta->table[index].handle = 0;
++	meta->table[index].size = 0;
+ }
+ 
+ static void handle_zero_page(struct bio_vec *bvec)
+@@ -149,20 +150,21 @@ static int zram_decompress_page(struct zram *zram, char *mem, u32 index)
+ 	int ret = LZO_E_OK;
+ 	size_t clen = PAGE_SIZE;
+ 	unsigned char *cmem;
+-	unsigned long handle = zram->table[index].handle;
++	struct zram_meta *meta = zram->meta;
++	unsigned long handle = meta->table[index].handle;
+ 
+-	if (!handle || zram_test_flag(zram, index, ZRAM_ZERO)) {
++	if (!handle || zram_test_flag(meta, index, ZRAM_ZERO)) {
+ 		memset(mem, 0, PAGE_SIZE);
+ 		return 0;
+ 	}
+ 
+-	cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);
+-	if (zram->table[index].size == PAGE_SIZE)
++	cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_RO);
++	if (meta->table[index].size == PAGE_SIZE)
+ 		memcpy(mem, cmem, PAGE_SIZE);
+ 	else
+-		ret = lzo1x_decompress_safe(cmem, zram->table[index].size,
++		ret = lzo1x_decompress_safe(cmem, meta->table[index].size,
+ 						mem, &clen);
+-	zs_unmap_object(zram->mem_pool, handle);
++	zs_unmap_object(meta->mem_pool, handle);
+ 
+ 	/* Should NEVER happen. Return bio error if it does. */
+ 	if (unlikely(ret != LZO_E_OK)) {
+@@ -180,11 +182,11 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec,
+ 	int ret;
+ 	struct page *page;
+ 	unsigned char *user_mem, *uncmem = NULL;
+-
++	struct zram_meta *meta = zram->meta;
+ 	page = bvec->bv_page;
+ 
+-	if (unlikely(!zram->table[index].handle) ||
+-			zram_test_flag(zram, index, ZRAM_ZERO)) {
++	if (unlikely(!meta->table[index].handle) ||
++			zram_test_flag(meta, index, ZRAM_ZERO)) {
+ 		handle_zero_page(bvec);
+ 		return 0;
+ 	}
+@@ -232,9 +234,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
+ 	unsigned long handle;
+ 	struct page *page;
+ 	unsigned char *user_mem, *cmem, *src, *uncmem = NULL;
++	struct zram_meta *meta = zram->meta;
+ 
+ 	page = bvec->bv_page;
+-	src = zram->compress_buffer;
++	src = meta->compress_buffer;
+ 
+ 	if (is_partial_io(bvec)) {
+ 		/*
+@@ -256,8 +259,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
+ 	 * System overwrites unused sectors. Free memory associated
+ 	 * with this sector now.
+ 	 */
+-	if (zram->table[index].handle ||
+-	    zram_test_flag(zram, index, ZRAM_ZERO))
++	if (meta->table[index].handle ||
++	    zram_test_flag(meta, index, ZRAM_ZERO))
+ 		zram_free_page(zram, index);
+ 
+ 	user_mem = kmap_atomic(page);
+@@ -276,13 +279,13 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
+ 		if (is_partial_io(bvec))
+ 			kfree(uncmem);
+ 		zram->stats.pages_zero++;
+-		zram_set_flag(zram, index, ZRAM_ZERO);
++		zram_set_flag(meta, index, ZRAM_ZERO);
+ 		ret = 0;
+ 		goto out;
+ 	}
+ 
+ 	ret = lzo1x_1_compress(uncmem, PAGE_SIZE, src, &clen,
+-			       zram->compress_workmem);
++			       meta->compress_workmem);
+ 
+ 	if (!is_partial_io(bvec)) {
+ 		kunmap_atomic(user_mem);
+@@ -303,14 +306,14 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
+ 			src = uncmem;
+ 	}
+ 
+-	handle = zs_malloc(zram->mem_pool, clen);
++	handle = zs_malloc(meta->mem_pool, clen);
+ 	if (!handle) {
+ 		pr_info("Error allocating memory for compressed "
+ 			"page: %u, size=%zu\n", index, clen);
+ 		ret = -ENOMEM;
+ 		goto out;
+ 	}
+-	cmem = zs_map_object(zram->mem_pool, handle, ZS_MM_WO);
++	cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO);
+ 
+ 	if ((clen == PAGE_SIZE) && !is_partial_io(bvec))
+ 		src = kmap_atomic(page);
+@@ -318,10 +321,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,
+ 	if ((clen == PAGE_SIZE) && !is_partial_io(bvec))
+ 		kunmap_atomic(src);
+ 
+-	zs_unmap_object(zram->mem_pool, handle);
++	zs_unmap_object(meta->mem_pool, handle);
+ 
+-	zram->table[index].handle = handle;
+-	zram->table[index].size = clen;
++	meta->table[index].handle = handle;
++	meta->table[index].size = clen;
+ 
+ 	/* Update stats */
+ 	zram_stat64_add(zram, &zram->stats.compr_size, clen);
+@@ -464,34 +467,25 @@ error:
+ void __zram_reset_device(struct zram *zram)
+ {
+ 	size_t index;
++	struct zram_meta *meta;
+ 
+ 	if (!zram->init_done)
+ 		return;
+ 
++	meta = zram->meta;
+ 	zram->init_done = 0;
+ 
+-	/* Free various per-device buffers */
+-	kfree(zram->compress_workmem);
+-	free_pages((unsigned long)zram->compress_buffer, 1);
+-
+-	zram->compress_workmem = NULL;
+-	zram->compress_buffer = NULL;
+-
+ 	/* Free all pages that are still in this zram device */
+ 	for (index = 0; index < zram->disksize >> PAGE_SHIFT; index++) {
+-		unsigned long handle = zram->table[index].handle;
++		unsigned long handle = meta->table[index].handle;
+ 		if (!handle)
+ 			continue;
+ 
+-		zs_free(zram->mem_pool, handle);
++		zs_free(meta->mem_pool, handle);
+ 	}
+ 
+-	vfree(zram->table);
+-	zram->table = NULL;
+-
+-	zs_destroy_pool(zram->mem_pool);
+-	zram->mem_pool = NULL;
+-
++	zram_meta_free(zram->meta);
++	zram->meta = NULL;
+ 	/* Reset stats */
+ 	memset(&zram->stats, 0, sizeof(zram->stats));
+ 
+@@ -506,12 +500,65 @@ void zram_reset_device(struct zram *zram)
+ 	up_write(&zram->init_lock);
+ }
+ 
+-/* zram->init_lock should be held */
+-int zram_init_device(struct zram *zram)
++void zram_meta_free(struct zram_meta *meta)
++{
++	zs_destroy_pool(meta->mem_pool);
++	kfree(meta->compress_workmem);
++	free_pages((unsigned long)meta->compress_buffer, 1);
++	vfree(meta->table);
++	kfree(meta);
++}
++
++struct zram_meta *zram_meta_alloc(u64 disksize)
+ {
+-	int ret;
+ 	size_t num_pages;
++	struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL);
++	if (!meta)
++		goto out;
++
++	meta->compress_workmem = kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
++	if (!meta->compress_workmem) {
++		pr_err("Error allocating compressor working memory!\n");
++		goto free_meta;
++	}
++
++	meta->compress_buffer =
++		(void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);
++	if (!meta->compress_buffer) {
++		pr_err("Error allocating compressor buffer space\n");
++		goto free_workmem;
++	}
++
++	num_pages = disksize >> PAGE_SHIFT;
++	meta->table = vzalloc(num_pages * sizeof(*meta->table));
++	if (!meta->table) {
++		pr_err("Error allocating zram address table\n");
++		goto free_buffer;
++	}
++
++	meta->mem_pool = zs_create_pool(GFP_NOIO | __GFP_HIGHMEM);
++	if (!meta->mem_pool) {
++		pr_err("Error creating memory pool\n");
++		goto free_table;
++	}
++
++	return meta;
++
++free_table:
++	vfree(meta->table);
++free_buffer:
++	free_pages((unsigned long)meta->compress_buffer, 1);
++free_workmem:
++	kfree(meta->compress_workmem);
++free_meta:
++	kfree(meta);
++	meta = NULL;
++out:
++	return meta;
++}
+ 
++void zram_init_device(struct zram *zram, struct zram_meta *meta)
++{
+ 	if (zram->disksize > 2 * (totalram_pages << PAGE_SHIFT)) {
+ 		pr_info(
+ 		"There is little point creating a zram of greater than "
+@@ -526,51 +573,13 @@ int zram_init_device(struct zram *zram)
+ 		);
+ 	}
+ 
+-	zram->compress_workmem = kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);
+-	if (!zram->compress_workmem) {
+-		pr_err("Error allocating compressor working memory!\n");
+-		ret = -ENOMEM;
+-		goto fail_no_table;
+-	}
+-
+-	zram->compress_buffer =
+-		(void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);
+-	if (!zram->compress_buffer) {
+-		pr_err("Error allocating compressor buffer space\n");
+-		ret = -ENOMEM;
+-		goto fail_no_table;
+-	}
+-
+-	num_pages = zram->disksize >> PAGE_SHIFT;
+-	zram->table = vzalloc(num_pages * sizeof(*zram->table));
+-	if (!zram->table) {
+-		pr_err("Error allocating zram address table\n");
+-		ret = -ENOMEM;
+-		goto fail_no_table;
+-	}
+-
+ 	/* zram devices sort of resembles non-rotational disks */
+ 	queue_flag_set_unlocked(QUEUE_FLAG_NONROT, zram->disk->queue);
+ 
+-	zram->mem_pool = zs_create_pool(GFP_NOIO | __GFP_HIGHMEM);
+-	if (!zram->mem_pool) {
+-		pr_err("Error creating memory pool\n");
+-		ret = -ENOMEM;
+-		goto fail;
+-	}
+-
++	zram->meta = meta;
+ 	zram->init_done = 1;
+ 
+ 	pr_debug("Initialization done!\n");
+-	return 0;
+-
+-fail_no_table:
+-	/* To prevent accessing table entries during cleanup */
+-	zram->disksize = 0;
+-fail:
+-	__zram_reset_device(zram);
+-	pr_err("Initialization failed: err=%d\n", ret);
+-	return ret;
+ }
+ 
+ static void zram_slot_free_notify(struct block_device *bdev,
+diff --git a/drivers/staging/zram/zram_drv.h b/drivers/staging/zram/zram_drv.h
+index 5b671d1..2d1a3f1 100644
+--- a/drivers/staging/zram/zram_drv.h
++++ b/drivers/staging/zram/zram_drv.h
+@@ -83,11 +83,15 @@ struct zram_stats {
+ 	u32 bad_compress;	/* % of pages with compression ratio>=75% */
+ };
+ 
+-struct zram {
+-	struct zs_pool *mem_pool;
++struct zram_meta {
+ 	void *compress_workmem;
+ 	void *compress_buffer;
+ 	struct table *table;
++	struct zs_pool *mem_pool;
++};
++
++struct zram {
++	struct zram_meta *meta;
+ 	spinlock_t stat64_lock;	/* protect 64-bit stats */
+ 	struct rw_semaphore lock; /* protect compression buffers and table
+ 				   * against concurrent read and writes */
+@@ -111,7 +115,9 @@ unsigned int zram_get_num_devices(void);
+ extern struct attribute_group zram_disk_attr_group;
+ #endif
+ 
+-extern int zram_init_device(struct zram *zram);
+ extern void zram_reset_device(struct zram *zram);
++extern struct zram_meta *zram_meta_alloc(u64 disksize);
++extern void zram_meta_free(struct zram_meta *meta);
++extern void zram_init_device(struct zram *zram, struct zram_meta *meta);
+ 
+ #endif
+diff --git a/drivers/staging/zram/zram_sysfs.c b/drivers/staging/zram/zram_sysfs.c
+index 369db12..e6a929d 100644
+--- a/drivers/staging/zram/zram_sysfs.c
++++ b/drivers/staging/zram/zram_sysfs.c
+@@ -56,22 +56,26 @@ static ssize_t disksize_store(struct device *dev,
+ 		struct device_attribute *attr, const char *buf, size_t len)
+ {
+ 	u64 disksize;
++	struct zram_meta *meta;
+ 	struct zram *zram = dev_to_zram(dev);
+ 
+ 	disksize = memparse(buf, NULL);
+ 	if (!disksize)
+ 		return -EINVAL;
+ 
++	disksize = PAGE_ALIGN(disksize);
++	meta = zram_meta_alloc(disksize);
+ 	down_write(&zram->init_lock);
+ 	if (zram->init_done) {
+ 		up_write(&zram->init_lock);
++		zram_meta_free(meta);
+ 		pr_info("Cannot change disksize for initialized device\n");
+ 		return -EBUSY;
+ 	}
+ 
+-	zram->disksize = PAGE_ALIGN(disksize);
++	zram->disksize = disksize;
+ 	set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
+-	zram_init_device(zram);
++	zram_init_device(zram, meta);
+ 	up_write(&zram->init_lock);
+ 
+ 	return len;
+@@ -182,9 +186,10 @@ static ssize_t mem_used_total_show(struct device *dev,
+ {
+ 	u64 val = 0;
+ 	struct zram *zram = dev_to_zram(dev);
++	struct zram_meta *meta = zram->meta;
+ 
+ 	if (zram->init_done)
+-		val = zs_get_total_size_bytes(zram->mem_pool);
++		val = zs_get_total_size_bytes(meta->mem_pool);
+ 
+ 	return sprintf(buf, "%llu\n", val);
+ }
+-- 
+1.7.9.5
+
+> 
+> thanks,
+> 
+> greg k-h
+> 
+> --
+> To unsubscribe, send a message with 'unsubscribe linux-mm' in
+> the body to majordomo@kvack.org.  For more info on Linux MM,
+> see: http://www.linux-mm.org/ .
+> Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
+
+-- 
+Kind regards,
+Minchan Kim
diff --git a/a/content_digest b/N1/content_digest
index 7dbffb2..9936680 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -58,6 +58,475 @@
  "> Please just send the one patch I need to apply here, I added Jerome's\n"
  "> acks to the previous patches already.\n"
  "\n"
- Thanks!
+ "Thanks!\n"
+ "\n"
+ ">From 4dec70e42324379730e6b4b6e41fc17f21a44917 Mon Sep 17 00:00:00 2001\n"
+ "From: Minchan Kim <minchan@kernel.org>\n"
+ "Date: Mon, 4 Feb 2013 08:41:24 +0900\n"
+ "Subject: [PATCH v7 4/4] zram: get rid of lockdep warning\n"
+ "\n"
+ "Lockdep complains about recursive deadlock of zram->init_lock.\n"
+ "[1] made it false positive because we can't request IO to zram\n"
+ "before setting disksize. Anyway, we should shut lockdep up to\n"
+ "avoid many reporting from user.\n"
+ "\n"
+ "[1] : zram: force disksize setting before using zram\n"
+ "\n"
+ "Acked-by: Jerome Marchand <jmarchan@redhat.com>\n"
+ "Signed-off-by: Minchan Kim <minchan@kernel.org>\n"
+ "---\n"
+ " drivers/staging/zram/zram_drv.c   |  189 +++++++++++++++++++------------------\n"
+ " drivers/staging/zram/zram_drv.h   |   12 ++-\n"
+ " drivers/staging/zram/zram_sysfs.c |   11 ++-\n"
+ " 3 files changed, 116 insertions(+), 96 deletions(-)\n"
+ "\n"
+ "diff --git a/drivers/staging/zram/zram_drv.c b/drivers/staging/zram/zram_drv.c\n"
+ "index 85055c4..56e3203 100644\n"
+ "--- a/drivers/staging/zram/zram_drv.c\n"
+ "+++ b/drivers/staging/zram/zram_drv.c\n"
+ "@@ -61,22 +61,22 @@ static void zram_stat64_inc(struct zram *zram, u64 *v)\n"
+ " \tzram_stat64_add(zram, v, 1);\n"
+ " }\n"
+ " \n"
+ "-static int zram_test_flag(struct zram *zram, u32 index,\n"
+ "+static int zram_test_flag(struct zram_meta *meta, u32 index,\n"
+ " \t\t\tenum zram_pageflags flag)\n"
+ " {\n"
+ "-\treturn zram->table[index].flags & BIT(flag);\n"
+ "+\treturn meta->table[index].flags & BIT(flag);\n"
+ " }\n"
+ " \n"
+ "-static void zram_set_flag(struct zram *zram, u32 index,\n"
+ "+static void zram_set_flag(struct zram_meta *meta, u32 index,\n"
+ " \t\t\tenum zram_pageflags flag)\n"
+ " {\n"
+ "-\tzram->table[index].flags |= BIT(flag);\n"
+ "+\tmeta->table[index].flags |= BIT(flag);\n"
+ " }\n"
+ " \n"
+ "-static void zram_clear_flag(struct zram *zram, u32 index,\n"
+ "+static void zram_clear_flag(struct zram_meta *meta, u32 index,\n"
+ " \t\t\tenum zram_pageflags flag)\n"
+ " {\n"
+ "-\tzram->table[index].flags &= ~BIT(flag);\n"
+ "+\tmeta->table[index].flags &= ~BIT(flag);\n"
+ " }\n"
+ " \n"
+ " static int page_zero_filled(void *ptr)\n"
+ "@@ -96,16 +96,17 @@ static int page_zero_filled(void *ptr)\n"
+ " \n"
+ " static void zram_free_page(struct zram *zram, size_t index)\n"
+ " {\n"
+ "-\tunsigned long handle = zram->table[index].handle;\n"
+ "-\tu16 size = zram->table[index].size;\n"
+ "+\tstruct zram_meta *meta = zram->meta;\n"
+ "+\tunsigned long handle = meta->table[index].handle;\n"
+ "+\tu16 size = meta->table[index].size;\n"
+ " \n"
+ " \tif (unlikely(!handle)) {\n"
+ " \t\t/*\n"
+ " \t\t * No memory is allocated for zero filled pages.\n"
+ " \t\t * Simply clear zero page flag.\n"
+ " \t\t */\n"
+ "-\t\tif (zram_test_flag(zram, index, ZRAM_ZERO)) {\n"
+ "-\t\t\tzram_clear_flag(zram, index, ZRAM_ZERO);\n"
+ "+\t\tif (zram_test_flag(meta, index, ZRAM_ZERO)) {\n"
+ "+\t\t\tzram_clear_flag(meta, index, ZRAM_ZERO);\n"
+ " \t\t\tzram->stats.pages_zero--;\n"
+ " \t\t}\n"
+ " \t\treturn;\n"
+ "@@ -114,17 +115,17 @@ static void zram_free_page(struct zram *zram, size_t index)\n"
+ " \tif (unlikely(size > max_zpage_size))\n"
+ " \t\tzram->stats.bad_compress--;\n"
+ " \n"
+ "-\tzs_free(zram->mem_pool, handle);\n"
+ "+\tzs_free(meta->mem_pool, handle);\n"
+ " \n"
+ " \tif (size <= PAGE_SIZE / 2)\n"
+ " \t\tzram->stats.good_compress--;\n"
+ " \n"
+ " \tzram_stat64_sub(zram, &zram->stats.compr_size,\n"
+ "-\t\t\tzram->table[index].size);\n"
+ "+\t\t\tmeta->table[index].size);\n"
+ " \tzram->stats.pages_stored--;\n"
+ " \n"
+ "-\tzram->table[index].handle = 0;\n"
+ "-\tzram->table[index].size = 0;\n"
+ "+\tmeta->table[index].handle = 0;\n"
+ "+\tmeta->table[index].size = 0;\n"
+ " }\n"
+ " \n"
+ " static void handle_zero_page(struct bio_vec *bvec)\n"
+ "@@ -149,20 +150,21 @@ static int zram_decompress_page(struct zram *zram, char *mem, u32 index)\n"
+ " \tint ret = LZO_E_OK;\n"
+ " \tsize_t clen = PAGE_SIZE;\n"
+ " \tunsigned char *cmem;\n"
+ "-\tunsigned long handle = zram->table[index].handle;\n"
+ "+\tstruct zram_meta *meta = zram->meta;\n"
+ "+\tunsigned long handle = meta->table[index].handle;\n"
+ " \n"
+ "-\tif (!handle || zram_test_flag(zram, index, ZRAM_ZERO)) {\n"
+ "+\tif (!handle || zram_test_flag(meta, index, ZRAM_ZERO)) {\n"
+ " \t\tmemset(mem, 0, PAGE_SIZE);\n"
+ " \t\treturn 0;\n"
+ " \t}\n"
+ " \n"
+ "-\tcmem = zs_map_object(zram->mem_pool, handle, ZS_MM_RO);\n"
+ "-\tif (zram->table[index].size == PAGE_SIZE)\n"
+ "+\tcmem = zs_map_object(meta->mem_pool, handle, ZS_MM_RO);\n"
+ "+\tif (meta->table[index].size == PAGE_SIZE)\n"
+ " \t\tmemcpy(mem, cmem, PAGE_SIZE);\n"
+ " \telse\n"
+ "-\t\tret = lzo1x_decompress_safe(cmem, zram->table[index].size,\n"
+ "+\t\tret = lzo1x_decompress_safe(cmem, meta->table[index].size,\n"
+ " \t\t\t\t\t\tmem, &clen);\n"
+ "-\tzs_unmap_object(zram->mem_pool, handle);\n"
+ "+\tzs_unmap_object(meta->mem_pool, handle);\n"
+ " \n"
+ " \t/* Should NEVER happen. Return bio error if it does. */\n"
+ " \tif (unlikely(ret != LZO_E_OK)) {\n"
+ "@@ -180,11 +182,11 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec,\n"
+ " \tint ret;\n"
+ " \tstruct page *page;\n"
+ " \tunsigned char *user_mem, *uncmem = NULL;\n"
+ "-\n"
+ "+\tstruct zram_meta *meta = zram->meta;\n"
+ " \tpage = bvec->bv_page;\n"
+ " \n"
+ "-\tif (unlikely(!zram->table[index].handle) ||\n"
+ "-\t\t\tzram_test_flag(zram, index, ZRAM_ZERO)) {\n"
+ "+\tif (unlikely(!meta->table[index].handle) ||\n"
+ "+\t\t\tzram_test_flag(meta, index, ZRAM_ZERO)) {\n"
+ " \t\thandle_zero_page(bvec);\n"
+ " \t\treturn 0;\n"
+ " \t}\n"
+ "@@ -232,9 +234,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,\n"
+ " \tunsigned long handle;\n"
+ " \tstruct page *page;\n"
+ " \tunsigned char *user_mem, *cmem, *src, *uncmem = NULL;\n"
+ "+\tstruct zram_meta *meta = zram->meta;\n"
+ " \n"
+ " \tpage = bvec->bv_page;\n"
+ "-\tsrc = zram->compress_buffer;\n"
+ "+\tsrc = meta->compress_buffer;\n"
+ " \n"
+ " \tif (is_partial_io(bvec)) {\n"
+ " \t\t/*\n"
+ "@@ -256,8 +259,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,\n"
+ " \t * System overwrites unused sectors. Free memory associated\n"
+ " \t * with this sector now.\n"
+ " \t */\n"
+ "-\tif (zram->table[index].handle ||\n"
+ "-\t    zram_test_flag(zram, index, ZRAM_ZERO))\n"
+ "+\tif (meta->table[index].handle ||\n"
+ "+\t    zram_test_flag(meta, index, ZRAM_ZERO))\n"
+ " \t\tzram_free_page(zram, index);\n"
+ " \n"
+ " \tuser_mem = kmap_atomic(page);\n"
+ "@@ -276,13 +279,13 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,\n"
+ " \t\tif (is_partial_io(bvec))\n"
+ " \t\t\tkfree(uncmem);\n"
+ " \t\tzram->stats.pages_zero++;\n"
+ "-\t\tzram_set_flag(zram, index, ZRAM_ZERO);\n"
+ "+\t\tzram_set_flag(meta, index, ZRAM_ZERO);\n"
+ " \t\tret = 0;\n"
+ " \t\tgoto out;\n"
+ " \t}\n"
+ " \n"
+ " \tret = lzo1x_1_compress(uncmem, PAGE_SIZE, src, &clen,\n"
+ "-\t\t\t       zram->compress_workmem);\n"
+ "+\t\t\t       meta->compress_workmem);\n"
+ " \n"
+ " \tif (!is_partial_io(bvec)) {\n"
+ " \t\tkunmap_atomic(user_mem);\n"
+ "@@ -303,14 +306,14 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,\n"
+ " \t\t\tsrc = uncmem;\n"
+ " \t}\n"
+ " \n"
+ "-\thandle = zs_malloc(zram->mem_pool, clen);\n"
+ "+\thandle = zs_malloc(meta->mem_pool, clen);\n"
+ " \tif (!handle) {\n"
+ " \t\tpr_info(\"Error allocating memory for compressed \"\n"
+ " \t\t\t\"page: %u, size=%zu\\n\", index, clen);\n"
+ " \t\tret = -ENOMEM;\n"
+ " \t\tgoto out;\n"
+ " \t}\n"
+ "-\tcmem = zs_map_object(zram->mem_pool, handle, ZS_MM_WO);\n"
+ "+\tcmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO);\n"
+ " \n"
+ " \tif ((clen == PAGE_SIZE) && !is_partial_io(bvec))\n"
+ " \t\tsrc = kmap_atomic(page);\n"
+ "@@ -318,10 +321,10 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index,\n"
+ " \tif ((clen == PAGE_SIZE) && !is_partial_io(bvec))\n"
+ " \t\tkunmap_atomic(src);\n"
+ " \n"
+ "-\tzs_unmap_object(zram->mem_pool, handle);\n"
+ "+\tzs_unmap_object(meta->mem_pool, handle);\n"
+ " \n"
+ "-\tzram->table[index].handle = handle;\n"
+ "-\tzram->table[index].size = clen;\n"
+ "+\tmeta->table[index].handle = handle;\n"
+ "+\tmeta->table[index].size = clen;\n"
+ " \n"
+ " \t/* Update stats */\n"
+ " \tzram_stat64_add(zram, &zram->stats.compr_size, clen);\n"
+ "@@ -464,34 +467,25 @@ error:\n"
+ " void __zram_reset_device(struct zram *zram)\n"
+ " {\n"
+ " \tsize_t index;\n"
+ "+\tstruct zram_meta *meta;\n"
+ " \n"
+ " \tif (!zram->init_done)\n"
+ " \t\treturn;\n"
+ " \n"
+ "+\tmeta = zram->meta;\n"
+ " \tzram->init_done = 0;\n"
+ " \n"
+ "-\t/* Free various per-device buffers */\n"
+ "-\tkfree(zram->compress_workmem);\n"
+ "-\tfree_pages((unsigned long)zram->compress_buffer, 1);\n"
+ "-\n"
+ "-\tzram->compress_workmem = NULL;\n"
+ "-\tzram->compress_buffer = NULL;\n"
+ "-\n"
+ " \t/* Free all pages that are still in this zram device */\n"
+ " \tfor (index = 0; index < zram->disksize >> PAGE_SHIFT; index++) {\n"
+ "-\t\tunsigned long handle = zram->table[index].handle;\n"
+ "+\t\tunsigned long handle = meta->table[index].handle;\n"
+ " \t\tif (!handle)\n"
+ " \t\t\tcontinue;\n"
+ " \n"
+ "-\t\tzs_free(zram->mem_pool, handle);\n"
+ "+\t\tzs_free(meta->mem_pool, handle);\n"
+ " \t}\n"
+ " \n"
+ "-\tvfree(zram->table);\n"
+ "-\tzram->table = NULL;\n"
+ "-\n"
+ "-\tzs_destroy_pool(zram->mem_pool);\n"
+ "-\tzram->mem_pool = NULL;\n"
+ "-\n"
+ "+\tzram_meta_free(zram->meta);\n"
+ "+\tzram->meta = NULL;\n"
+ " \t/* Reset stats */\n"
+ " \tmemset(&zram->stats, 0, sizeof(zram->stats));\n"
+ " \n"
+ "@@ -506,12 +500,65 @@ void zram_reset_device(struct zram *zram)\n"
+ " \tup_write(&zram->init_lock);\n"
+ " }\n"
+ " \n"
+ "-/* zram->init_lock should be held */\n"
+ "-int zram_init_device(struct zram *zram)\n"
+ "+void zram_meta_free(struct zram_meta *meta)\n"
+ "+{\n"
+ "+\tzs_destroy_pool(meta->mem_pool);\n"
+ "+\tkfree(meta->compress_workmem);\n"
+ "+\tfree_pages((unsigned long)meta->compress_buffer, 1);\n"
+ "+\tvfree(meta->table);\n"
+ "+\tkfree(meta);\n"
+ "+}\n"
+ "+\n"
+ "+struct zram_meta *zram_meta_alloc(u64 disksize)\n"
+ " {\n"
+ "-\tint ret;\n"
+ " \tsize_t num_pages;\n"
+ "+\tstruct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL);\n"
+ "+\tif (!meta)\n"
+ "+\t\tgoto out;\n"
+ "+\n"
+ "+\tmeta->compress_workmem = kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);\n"
+ "+\tif (!meta->compress_workmem) {\n"
+ "+\t\tpr_err(\"Error allocating compressor working memory!\\n\");\n"
+ "+\t\tgoto free_meta;\n"
+ "+\t}\n"
+ "+\n"
+ "+\tmeta->compress_buffer =\n"
+ "+\t\t(void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);\n"
+ "+\tif (!meta->compress_buffer) {\n"
+ "+\t\tpr_err(\"Error allocating compressor buffer space\\n\");\n"
+ "+\t\tgoto free_workmem;\n"
+ "+\t}\n"
+ "+\n"
+ "+\tnum_pages = disksize >> PAGE_SHIFT;\n"
+ "+\tmeta->table = vzalloc(num_pages * sizeof(*meta->table));\n"
+ "+\tif (!meta->table) {\n"
+ "+\t\tpr_err(\"Error allocating zram address table\\n\");\n"
+ "+\t\tgoto free_buffer;\n"
+ "+\t}\n"
+ "+\n"
+ "+\tmeta->mem_pool = zs_create_pool(GFP_NOIO | __GFP_HIGHMEM);\n"
+ "+\tif (!meta->mem_pool) {\n"
+ "+\t\tpr_err(\"Error creating memory pool\\n\");\n"
+ "+\t\tgoto free_table;\n"
+ "+\t}\n"
+ "+\n"
+ "+\treturn meta;\n"
+ "+\n"
+ "+free_table:\n"
+ "+\tvfree(meta->table);\n"
+ "+free_buffer:\n"
+ "+\tfree_pages((unsigned long)meta->compress_buffer, 1);\n"
+ "+free_workmem:\n"
+ "+\tkfree(meta->compress_workmem);\n"
+ "+free_meta:\n"
+ "+\tkfree(meta);\n"
+ "+\tmeta = NULL;\n"
+ "+out:\n"
+ "+\treturn meta;\n"
+ "+}\n"
+ " \n"
+ "+void zram_init_device(struct zram *zram, struct zram_meta *meta)\n"
+ "+{\n"
+ " \tif (zram->disksize > 2 * (totalram_pages << PAGE_SHIFT)) {\n"
+ " \t\tpr_info(\n"
+ " \t\t\"There is little point creating a zram of greater than \"\n"
+ "@@ -526,51 +573,13 @@ int zram_init_device(struct zram *zram)\n"
+ " \t\t);\n"
+ " \t}\n"
+ " \n"
+ "-\tzram->compress_workmem = kzalloc(LZO1X_MEM_COMPRESS, GFP_KERNEL);\n"
+ "-\tif (!zram->compress_workmem) {\n"
+ "-\t\tpr_err(\"Error allocating compressor working memory!\\n\");\n"
+ "-\t\tret = -ENOMEM;\n"
+ "-\t\tgoto fail_no_table;\n"
+ "-\t}\n"
+ "-\n"
+ "-\tzram->compress_buffer =\n"
+ "-\t\t(void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);\n"
+ "-\tif (!zram->compress_buffer) {\n"
+ "-\t\tpr_err(\"Error allocating compressor buffer space\\n\");\n"
+ "-\t\tret = -ENOMEM;\n"
+ "-\t\tgoto fail_no_table;\n"
+ "-\t}\n"
+ "-\n"
+ "-\tnum_pages = zram->disksize >> PAGE_SHIFT;\n"
+ "-\tzram->table = vzalloc(num_pages * sizeof(*zram->table));\n"
+ "-\tif (!zram->table) {\n"
+ "-\t\tpr_err(\"Error allocating zram address table\\n\");\n"
+ "-\t\tret = -ENOMEM;\n"
+ "-\t\tgoto fail_no_table;\n"
+ "-\t}\n"
+ "-\n"
+ " \t/* zram devices sort of resembles non-rotational disks */\n"
+ " \tqueue_flag_set_unlocked(QUEUE_FLAG_NONROT, zram->disk->queue);\n"
+ " \n"
+ "-\tzram->mem_pool = zs_create_pool(GFP_NOIO | __GFP_HIGHMEM);\n"
+ "-\tif (!zram->mem_pool) {\n"
+ "-\t\tpr_err(\"Error creating memory pool\\n\");\n"
+ "-\t\tret = -ENOMEM;\n"
+ "-\t\tgoto fail;\n"
+ "-\t}\n"
+ "-\n"
+ "+\tzram->meta = meta;\n"
+ " \tzram->init_done = 1;\n"
+ " \n"
+ " \tpr_debug(\"Initialization done!\\n\");\n"
+ "-\treturn 0;\n"
+ "-\n"
+ "-fail_no_table:\n"
+ "-\t/* To prevent accessing table entries during cleanup */\n"
+ "-\tzram->disksize = 0;\n"
+ "-fail:\n"
+ "-\t__zram_reset_device(zram);\n"
+ "-\tpr_err(\"Initialization failed: err=%d\\n\", ret);\n"
+ "-\treturn ret;\n"
+ " }\n"
+ " \n"
+ " static void zram_slot_free_notify(struct block_device *bdev,\n"
+ "diff --git a/drivers/staging/zram/zram_drv.h b/drivers/staging/zram/zram_drv.h\n"
+ "index 5b671d1..2d1a3f1 100644\n"
+ "--- a/drivers/staging/zram/zram_drv.h\n"
+ "+++ b/drivers/staging/zram/zram_drv.h\n"
+ "@@ -83,11 +83,15 @@ struct zram_stats {\n"
+ " \tu32 bad_compress;\t/* % of pages with compression ratio>=75% */\n"
+ " };\n"
+ " \n"
+ "-struct zram {\n"
+ "-\tstruct zs_pool *mem_pool;\n"
+ "+struct zram_meta {\n"
+ " \tvoid *compress_workmem;\n"
+ " \tvoid *compress_buffer;\n"
+ " \tstruct table *table;\n"
+ "+\tstruct zs_pool *mem_pool;\n"
+ "+};\n"
+ "+\n"
+ "+struct zram {\n"
+ "+\tstruct zram_meta *meta;\n"
+ " \tspinlock_t stat64_lock;\t/* protect 64-bit stats */\n"
+ " \tstruct rw_semaphore lock; /* protect compression buffers and table\n"
+ " \t\t\t\t   * against concurrent read and writes */\n"
+ "@@ -111,7 +115,9 @@ unsigned int zram_get_num_devices(void);\n"
+ " extern struct attribute_group zram_disk_attr_group;\n"
+ " #endif\n"
+ " \n"
+ "-extern int zram_init_device(struct zram *zram);\n"
+ " extern void zram_reset_device(struct zram *zram);\n"
+ "+extern struct zram_meta *zram_meta_alloc(u64 disksize);\n"
+ "+extern void zram_meta_free(struct zram_meta *meta);\n"
+ "+extern void zram_init_device(struct zram *zram, struct zram_meta *meta);\n"
+ " \n"
+ " #endif\n"
+ "diff --git a/drivers/staging/zram/zram_sysfs.c b/drivers/staging/zram/zram_sysfs.c\n"
+ "index 369db12..e6a929d 100644\n"
+ "--- a/drivers/staging/zram/zram_sysfs.c\n"
+ "+++ b/drivers/staging/zram/zram_sysfs.c\n"
+ "@@ -56,22 +56,26 @@ static ssize_t disksize_store(struct device *dev,\n"
+ " \t\tstruct device_attribute *attr, const char *buf, size_t len)\n"
+ " {\n"
+ " \tu64 disksize;\n"
+ "+\tstruct zram_meta *meta;\n"
+ " \tstruct zram *zram = dev_to_zram(dev);\n"
+ " \n"
+ " \tdisksize = memparse(buf, NULL);\n"
+ " \tif (!disksize)\n"
+ " \t\treturn -EINVAL;\n"
+ " \n"
+ "+\tdisksize = PAGE_ALIGN(disksize);\n"
+ "+\tmeta = zram_meta_alloc(disksize);\n"
+ " \tdown_write(&zram->init_lock);\n"
+ " \tif (zram->init_done) {\n"
+ " \t\tup_write(&zram->init_lock);\n"
+ "+\t\tzram_meta_free(meta);\n"
+ " \t\tpr_info(\"Cannot change disksize for initialized device\\n\");\n"
+ " \t\treturn -EBUSY;\n"
+ " \t}\n"
+ " \n"
+ "-\tzram->disksize = PAGE_ALIGN(disksize);\n"
+ "+\tzram->disksize = disksize;\n"
+ " \tset_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);\n"
+ "-\tzram_init_device(zram);\n"
+ "+\tzram_init_device(zram, meta);\n"
+ " \tup_write(&zram->init_lock);\n"
+ " \n"
+ " \treturn len;\n"
+ "@@ -182,9 +186,10 @@ static ssize_t mem_used_total_show(struct device *dev,\n"
+ " {\n"
+ " \tu64 val = 0;\n"
+ " \tstruct zram *zram = dev_to_zram(dev);\n"
+ "+\tstruct zram_meta *meta = zram->meta;\n"
+ " \n"
+ " \tif (zram->init_done)\n"
+ "-\t\tval = zs_get_total_size_bytes(zram->mem_pool);\n"
+ "+\t\tval = zs_get_total_size_bytes(meta->mem_pool);\n"
+ " \n"
+ " \treturn sprintf(buf, \"%llu\\n\", val);\n"
+ " }\n"
+ "-- \n"
+ "1.7.9.5\n"
+ "\n"
+ "> \n"
+ "> thanks,\n"
+ "> \n"
+ "> greg k-h\n"
+ "> \n"
+ "> --\n"
+ "> To unsubscribe, send a message with 'unsubscribe linux-mm' in\n"
+ "> the body to majordomo@kvack.org.  For more info on Linux MM,\n"
+ "> see: http://www.linux-mm.org/ .\n"
+ "> Don't email: <a href=mailto:\"dont@kvack.org\"> email@kvack.org </a>\n"
+ "\n"
+ "-- \n"
+ "Kind regards,\n"
+ Minchan Kim
 
-213fdf5c0f0029f00d6db6f01f18249b2473c0802dc569e5130c1b0f8d8e41e8
+b91d09d81550081e21922117409b263494040636b3eb58b88efee5cba683ed2e

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.