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.