diff options
author | Minchan Kim <minchan@kernel.org> | 2017-05-03 17:55:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-03 18:52:11 -0400 |
commit | beb6602cf87abee547b2692031185111f625153a (patch) | |
tree | dceb4508ddb5ed80f7cd2ee25d00448f01bc9f98 /drivers/block | |
parent | 86c49814d449ebc51c7d455ac8e3d17b9fa702eb (diff) |
zram: remove zram_meta structure
It's redundant now. Instead, remove it and use zram structure directly.
Link: http://lkml.kernel.org/r/1492052365-16169-5-git-send-email-minchan@kernel.org
Signed-off-by: Minchan Kim <minchan@kernel.org>
Cc: Hannes Reinecke <hare@suse.com>
Cc: Johannes Thumshirn <jthumshirn@suse.de>
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/zram/zram_drv.c | 189 | ||||
-rw-r--r-- | drivers/block/zram/zram_drv.h | 6 |
2 files changed, 78 insertions, 117 deletions
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index aac48ff69618..c674d23539b1 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c | |||
@@ -58,46 +58,46 @@ static inline struct zram *dev_to_zram(struct device *dev) | |||
58 | } | 58 | } |
59 | 59 | ||
60 | /* flag operations require table entry bit_spin_lock() being held */ | 60 | /* flag operations require table entry bit_spin_lock() being held */ |
61 | static int zram_test_flag(struct zram_meta *meta, u32 index, | 61 | static int zram_test_flag(struct zram *zram, u32 index, |
62 | enum zram_pageflags flag) | 62 | enum zram_pageflags flag) |
63 | { | 63 | { |
64 | return meta->table[index].value & BIT(flag); | 64 | return zram->table[index].value & BIT(flag); |
65 | } | 65 | } |
66 | 66 | ||
67 | static void zram_set_flag(struct zram_meta *meta, u32 index, | 67 | static void zram_set_flag(struct zram *zram, u32 index, |
68 | enum zram_pageflags flag) | 68 | enum zram_pageflags flag) |
69 | { | 69 | { |
70 | meta->table[index].value |= BIT(flag); | 70 | zram->table[index].value |= BIT(flag); |
71 | } | 71 | } |
72 | 72 | ||
73 | static void zram_clear_flag(struct zram_meta *meta, u32 index, | 73 | static void zram_clear_flag(struct zram *zram, u32 index, |
74 | enum zram_pageflags flag) | 74 | enum zram_pageflags flag) |
75 | { | 75 | { |
76 | meta->table[index].value &= ~BIT(flag); | 76 | zram->table[index].value &= ~BIT(flag); |
77 | } | 77 | } |
78 | 78 | ||
79 | static inline void zram_set_element(struct zram_meta *meta, u32 index, | 79 | static inline void zram_set_element(struct zram *zram, u32 index, |
80 | unsigned long element) | 80 | unsigned long element) |
81 | { | 81 | { |
82 | meta->table[index].element = element; | 82 | zram->table[index].element = element; |
83 | } | 83 | } |
84 | 84 | ||
85 | static inline void zram_clear_element(struct zram_meta *meta, u32 index) | 85 | static inline void zram_clear_element(struct zram *zram, u32 index) |
86 | { | 86 | { |
87 | meta->table[index].element = 0; | 87 | zram->table[index].element = 0; |
88 | } | 88 | } |
89 | 89 | ||
90 | static size_t zram_get_obj_size(struct zram_meta *meta, u32 index) | 90 | static size_t zram_get_obj_size(struct zram *zram, u32 index) |
91 | { | 91 | { |
92 | return meta->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); | 92 | return zram->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); |
93 | } | 93 | } |
94 | 94 | ||
95 | static void zram_set_obj_size(struct zram_meta *meta, | 95 | static void zram_set_obj_size(struct zram *zram, |
96 | u32 index, size_t size) | 96 | u32 index, size_t size) |
97 | { | 97 | { |
98 | unsigned long flags = meta->table[index].value >> ZRAM_FLAG_SHIFT; | 98 | unsigned long flags = zram->table[index].value >> ZRAM_FLAG_SHIFT; |
99 | 99 | ||
100 | meta->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; | 100 | zram->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; |
101 | } | 101 | } |
102 | 102 | ||
103 | #if PAGE_SIZE != 4096 | 103 | #if PAGE_SIZE != 4096 |
@@ -250,9 +250,8 @@ static ssize_t mem_used_max_store(struct device *dev, | |||
250 | 250 | ||
251 | down_read(&zram->init_lock); | 251 | down_read(&zram->init_lock); |
252 | if (init_done(zram)) { | 252 | if (init_done(zram)) { |
253 | struct zram_meta *meta = zram->meta; | ||
254 | atomic_long_set(&zram->stats.max_used_pages, | 253 | atomic_long_set(&zram->stats.max_used_pages, |
255 | zs_get_total_pages(meta->mem_pool)); | 254 | zs_get_total_pages(zram->mem_pool)); |
256 | } | 255 | } |
257 | up_read(&zram->init_lock); | 256 | up_read(&zram->init_lock); |
258 | 257 | ||
@@ -325,7 +324,6 @@ static ssize_t compact_store(struct device *dev, | |||
325 | struct device_attribute *attr, const char *buf, size_t len) | 324 | struct device_attribute *attr, const char *buf, size_t len) |
326 | { | 325 | { |
327 | struct zram *zram = dev_to_zram(dev); | 326 | struct zram *zram = dev_to_zram(dev); |
328 | struct zram_meta *meta; | ||
329 | 327 | ||
330 | down_read(&zram->init_lock); | 328 | down_read(&zram->init_lock); |
331 | if (!init_done(zram)) { | 329 | if (!init_done(zram)) { |
@@ -333,8 +331,7 @@ static ssize_t compact_store(struct device *dev, | |||
333 | return -EINVAL; | 331 | return -EINVAL; |
334 | } | 332 | } |
335 | 333 | ||
336 | meta = zram->meta; | 334 | zs_compact(zram->mem_pool); |
337 | zs_compact(meta->mem_pool); | ||
338 | up_read(&zram->init_lock); | 335 | up_read(&zram->init_lock); |
339 | 336 | ||
340 | return len; | 337 | return len; |
@@ -371,8 +368,8 @@ static ssize_t mm_stat_show(struct device *dev, | |||
371 | 368 | ||
372 | down_read(&zram->init_lock); | 369 | down_read(&zram->init_lock); |
373 | if (init_done(zram)) { | 370 | if (init_done(zram)) { |
374 | mem_used = zs_get_total_pages(zram->meta->mem_pool); | 371 | mem_used = zs_get_total_pages(zram->mem_pool); |
375 | zs_pool_stats(zram->meta->mem_pool, &pool_stats); | 372 | zs_pool_stats(zram->mem_pool, &pool_stats); |
376 | } | 373 | } |
377 | 374 | ||
378 | orig_size = atomic64_read(&zram->stats.pages_stored); | 375 | orig_size = atomic64_read(&zram->stats.pages_stored); |
@@ -415,32 +412,26 @@ static DEVICE_ATTR_RO(debug_stat); | |||
415 | 412 | ||
416 | static void zram_slot_lock(struct zram *zram, u32 index) | 413 | static void zram_slot_lock(struct zram *zram, u32 index) |
417 | { | 414 | { |
418 | struct zram_meta *meta = zram->meta; | 415 | bit_spin_lock(ZRAM_ACCESS, &zram->table[index].value); |
419 | |||
420 | bit_spin_lock(ZRAM_ACCESS, &meta->table[index].value); | ||
421 | } | 416 | } |
422 | 417 | ||
423 | static void zram_slot_unlock(struct zram *zram, u32 index) | 418 | static void zram_slot_unlock(struct zram *zram, u32 index) |
424 | { | 419 | { |
425 | struct zram_meta *meta = zram->meta; | 420 | bit_spin_unlock(ZRAM_ACCESS, &zram->table[index].value); |
426 | |||
427 | bit_spin_unlock(ZRAM_ACCESS, &meta->table[index].value); | ||
428 | } | 421 | } |
429 | 422 | ||
430 | static bool zram_same_page_read(struct zram *zram, u32 index, | 423 | static bool zram_same_page_read(struct zram *zram, u32 index, |
431 | struct page *page, | 424 | struct page *page, |
432 | unsigned int offset, unsigned int len) | 425 | unsigned int offset, unsigned int len) |
433 | { | 426 | { |
434 | struct zram_meta *meta = zram->meta; | ||
435 | |||
436 | zram_slot_lock(zram, index); | 427 | zram_slot_lock(zram, index); |
437 | if (unlikely(!meta->table[index].handle) || | 428 | if (unlikely(!zram->table[index].handle) || |
438 | zram_test_flag(meta, index, ZRAM_SAME)) { | 429 | zram_test_flag(zram, index, ZRAM_SAME)) { |
439 | void *mem; | 430 | void *mem; |
440 | 431 | ||
441 | zram_slot_unlock(zram, index); | 432 | zram_slot_unlock(zram, index); |
442 | mem = kmap_atomic(page); | 433 | mem = kmap_atomic(page); |
443 | zram_fill_page(mem + offset, len, meta->table[index].element); | 434 | zram_fill_page(mem + offset, len, zram->table[index].element); |
444 | kunmap_atomic(mem); | 435 | kunmap_atomic(mem); |
445 | return true; | 436 | return true; |
446 | } | 437 | } |
@@ -456,14 +447,12 @@ static bool zram_same_page_write(struct zram *zram, u32 index, | |||
456 | void *mem = kmap_atomic(page); | 447 | void *mem = kmap_atomic(page); |
457 | 448 | ||
458 | if (page_same_filled(mem, &element)) { | 449 | if (page_same_filled(mem, &element)) { |
459 | struct zram_meta *meta = zram->meta; | ||
460 | |||
461 | kunmap_atomic(mem); | 450 | kunmap_atomic(mem); |
462 | /* Free memory associated with this sector now. */ | 451 | /* Free memory associated with this sector now. */ |
463 | zram_slot_lock(zram, index); | 452 | zram_slot_lock(zram, index); |
464 | zram_free_page(zram, index); | 453 | zram_free_page(zram, index); |
465 | zram_set_flag(meta, index, ZRAM_SAME); | 454 | zram_set_flag(zram, index, ZRAM_SAME); |
466 | zram_set_element(meta, index, element); | 455 | zram_set_element(zram, index, element); |
467 | zram_slot_unlock(zram, index); | 456 | zram_slot_unlock(zram, index); |
468 | 457 | ||
469 | atomic64_inc(&zram->stats.same_pages); | 458 | atomic64_inc(&zram->stats.same_pages); |
@@ -474,56 +463,44 @@ static bool zram_same_page_write(struct zram *zram, u32 index, | |||
474 | return false; | 463 | return false; |
475 | } | 464 | } |
476 | 465 | ||
477 | static void zram_meta_free(struct zram_meta *meta, u64 disksize) | 466 | static void zram_meta_free(struct zram *zram, u64 disksize) |
478 | { | 467 | { |
479 | size_t num_pages = disksize >> PAGE_SHIFT; | 468 | size_t num_pages = disksize >> PAGE_SHIFT; |
480 | size_t index; | 469 | size_t index; |
481 | 470 | ||
482 | /* Free all pages that are still in this zram device */ | 471 | /* Free all pages that are still in this zram device */ |
483 | for (index = 0; index < num_pages; index++) { | 472 | for (index = 0; index < num_pages; index++) { |
484 | unsigned long handle = meta->table[index].handle; | 473 | unsigned long handle = zram->table[index].handle; |
485 | /* | 474 | /* |
486 | * No memory is allocated for same element filled pages. | 475 | * No memory is allocated for same element filled pages. |
487 | * Simply clear same page flag. | 476 | * Simply clear same page flag. |
488 | */ | 477 | */ |
489 | if (!handle || zram_test_flag(meta, index, ZRAM_SAME)) | 478 | if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) |
490 | continue; | 479 | continue; |
491 | 480 | ||
492 | zs_free(meta->mem_pool, handle); | 481 | zs_free(zram->mem_pool, handle); |
493 | } | 482 | } |
494 | 483 | ||
495 | zs_destroy_pool(meta->mem_pool); | 484 | zs_destroy_pool(zram->mem_pool); |
496 | vfree(meta->table); | 485 | vfree(zram->table); |
497 | kfree(meta); | ||
498 | } | 486 | } |
499 | 487 | ||
500 | static struct zram_meta *zram_meta_alloc(char *pool_name, u64 disksize) | 488 | static bool zram_meta_alloc(struct zram *zram, u64 disksize) |
501 | { | 489 | { |
502 | size_t num_pages; | 490 | size_t num_pages; |
503 | struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL); | ||
504 | |||
505 | if (!meta) | ||
506 | return NULL; | ||
507 | 491 | ||
508 | num_pages = disksize >> PAGE_SHIFT; | 492 | num_pages = disksize >> PAGE_SHIFT; |
509 | meta->table = vzalloc(num_pages * sizeof(*meta->table)); | 493 | zram->table = vzalloc(num_pages * sizeof(*zram->table)); |
510 | if (!meta->table) { | 494 | if (!zram->table) |
511 | pr_err("Error allocating zram address table\n"); | 495 | return false; |
512 | goto out_error; | ||
513 | } | ||
514 | 496 | ||
515 | meta->mem_pool = zs_create_pool(pool_name); | 497 | zram->mem_pool = zs_create_pool(zram->disk->disk_name); |
516 | if (!meta->mem_pool) { | 498 | if (!zram->mem_pool) { |
517 | pr_err("Error creating memory pool\n"); | 499 | vfree(zram->table); |
518 | goto out_error; | 500 | return false; |
519 | } | 501 | } |
520 | 502 | ||
521 | return meta; | 503 | return true; |
522 | |||
523 | out_error: | ||
524 | vfree(meta->table); | ||
525 | kfree(meta); | ||
526 | return NULL; | ||
527 | } | 504 | } |
528 | 505 | ||
529 | /* | 506 | /* |
@@ -533,16 +510,15 @@ out_error: | |||
533 | */ | 510 | */ |
534 | static void zram_free_page(struct zram *zram, size_t index) | 511 | static void zram_free_page(struct zram *zram, size_t index) |
535 | { | 512 | { |
536 | struct zram_meta *meta = zram->meta; | 513 | unsigned long handle = zram->table[index].handle; |
537 | unsigned long handle = meta->table[index].handle; | ||
538 | 514 | ||
539 | /* | 515 | /* |
540 | * No memory is allocated for same element filled pages. | 516 | * No memory is allocated for same element filled pages. |
541 | * Simply clear same page flag. | 517 | * Simply clear same page flag. |
542 | */ | 518 | */ |
543 | if (zram_test_flag(meta, index, ZRAM_SAME)) { | 519 | if (zram_test_flag(zram, index, ZRAM_SAME)) { |
544 | zram_clear_flag(meta, index, ZRAM_SAME); | 520 | zram_clear_flag(zram, index, ZRAM_SAME); |
545 | zram_clear_element(meta, index); | 521 | zram_clear_element(zram, index); |
546 | atomic64_dec(&zram->stats.same_pages); | 522 | atomic64_dec(&zram->stats.same_pages); |
547 | return; | 523 | return; |
548 | } | 524 | } |
@@ -550,14 +526,14 @@ static void zram_free_page(struct zram *zram, size_t index) | |||
550 | if (!handle) | 526 | if (!handle) |
551 | return; | 527 | return; |
552 | 528 | ||
553 | zs_free(meta->mem_pool, handle); | 529 | zs_free(zram->mem_pool, handle); |
554 | 530 | ||
555 | atomic64_sub(zram_get_obj_size(meta, index), | 531 | atomic64_sub(zram_get_obj_size(zram, index), |
556 | &zram->stats.compr_data_size); | 532 | &zram->stats.compr_data_size); |
557 | atomic64_dec(&zram->stats.pages_stored); | 533 | atomic64_dec(&zram->stats.pages_stored); |
558 | 534 | ||
559 | meta->table[index].handle = 0; | 535 | zram->table[index].handle = 0; |
560 | zram_set_obj_size(meta, index, 0); | 536 | zram_set_obj_size(zram, index, 0); |
561 | } | 537 | } |
562 | 538 | ||
563 | static int zram_decompress_page(struct zram *zram, struct page *page, u32 index) | 539 | static int zram_decompress_page(struct zram *zram, struct page *page, u32 index) |
@@ -566,16 +542,15 @@ static int zram_decompress_page(struct zram *zram, struct page *page, u32 index) | |||
566 | unsigned long handle; | 542 | unsigned long handle; |
567 | unsigned int size; | 543 | unsigned int size; |
568 | void *src, *dst; | 544 | void *src, *dst; |
569 | struct zram_meta *meta = zram->meta; | ||
570 | 545 | ||
571 | if (zram_same_page_read(zram, index, page, 0, PAGE_SIZE)) | 546 | if (zram_same_page_read(zram, index, page, 0, PAGE_SIZE)) |
572 | return 0; | 547 | return 0; |
573 | 548 | ||
574 | zram_slot_lock(zram, index); | 549 | zram_slot_lock(zram, index); |
575 | handle = meta->table[index].handle; | 550 | handle = zram->table[index].handle; |
576 | size = zram_get_obj_size(meta, index); | 551 | size = zram_get_obj_size(zram, index); |
577 | 552 | ||
578 | src = zs_map_object(meta->mem_pool, handle, ZS_MM_RO); | 553 | src = zs_map_object(zram->mem_pool, handle, ZS_MM_RO); |
579 | if (size == PAGE_SIZE) { | 554 | if (size == PAGE_SIZE) { |
580 | dst = kmap_atomic(page); | 555 | dst = kmap_atomic(page); |
581 | memcpy(dst, src, PAGE_SIZE); | 556 | memcpy(dst, src, PAGE_SIZE); |
@@ -589,7 +564,7 @@ static int zram_decompress_page(struct zram *zram, struct page *page, u32 index) | |||
589 | kunmap_atomic(dst); | 564 | kunmap_atomic(dst); |
590 | zcomp_stream_put(zram->comp); | 565 | zcomp_stream_put(zram->comp); |
591 | } | 566 | } |
592 | zs_unmap_object(meta->mem_pool, handle); | 567 | zs_unmap_object(zram->mem_pool, handle); |
593 | zram_slot_unlock(zram, index); | 568 | zram_slot_unlock(zram, index); |
594 | 569 | ||
595 | /* Should NEVER happen. Return bio error if it does. */ | 570 | /* Should NEVER happen. Return bio error if it does. */ |
@@ -641,7 +616,6 @@ static int zram_compress(struct zram *zram, struct zcomp_strm **zstrm, | |||
641 | void *src; | 616 | void *src; |
642 | unsigned long alloced_pages; | 617 | unsigned long alloced_pages; |
643 | unsigned long handle = 0; | 618 | unsigned long handle = 0; |
644 | struct zram_meta *meta = zram->meta; | ||
645 | 619 | ||
646 | compress_again: | 620 | compress_again: |
647 | src = kmap_atomic(page); | 621 | src = kmap_atomic(page); |
@@ -651,7 +625,7 @@ compress_again: | |||
651 | if (unlikely(ret)) { | 625 | if (unlikely(ret)) { |
652 | pr_err("Compression failed! err=%d\n", ret); | 626 | pr_err("Compression failed! err=%d\n", ret); |
653 | if (handle) | 627 | if (handle) |
654 | zs_free(meta->mem_pool, handle); | 628 | zs_free(zram->mem_pool, handle); |
655 | return ret; | 629 | return ret; |
656 | } | 630 | } |
657 | 631 | ||
@@ -672,7 +646,7 @@ compress_again: | |||
672 | * from the slow path and handle has already been allocated. | 646 | * from the slow path and handle has already been allocated. |
673 | */ | 647 | */ |
674 | if (!handle) | 648 | if (!handle) |
675 | handle = zs_malloc(meta->mem_pool, comp_len, | 649 | handle = zs_malloc(zram->mem_pool, comp_len, |
676 | __GFP_KSWAPD_RECLAIM | | 650 | __GFP_KSWAPD_RECLAIM | |
677 | __GFP_NOWARN | | 651 | __GFP_NOWARN | |
678 | __GFP_HIGHMEM | | 652 | __GFP_HIGHMEM | |
@@ -680,7 +654,7 @@ compress_again: | |||
680 | if (!handle) { | 654 | if (!handle) { |
681 | zcomp_stream_put(zram->comp); | 655 | zcomp_stream_put(zram->comp); |
682 | atomic64_inc(&zram->stats.writestall); | 656 | atomic64_inc(&zram->stats.writestall); |
683 | handle = zs_malloc(meta->mem_pool, comp_len, | 657 | handle = zs_malloc(zram->mem_pool, comp_len, |
684 | GFP_NOIO | __GFP_HIGHMEM | | 658 | GFP_NOIO | __GFP_HIGHMEM | |
685 | __GFP_MOVABLE); | 659 | __GFP_MOVABLE); |
686 | *zstrm = zcomp_stream_get(zram->comp); | 660 | *zstrm = zcomp_stream_get(zram->comp); |
@@ -689,11 +663,11 @@ compress_again: | |||
689 | return -ENOMEM; | 663 | return -ENOMEM; |
690 | } | 664 | } |
691 | 665 | ||
692 | alloced_pages = zs_get_total_pages(meta->mem_pool); | 666 | alloced_pages = zs_get_total_pages(zram->mem_pool); |
693 | update_used_max(zram, alloced_pages); | 667 | update_used_max(zram, alloced_pages); |
694 | 668 | ||
695 | if (zram->limit_pages && alloced_pages > zram->limit_pages) { | 669 | if (zram->limit_pages && alloced_pages > zram->limit_pages) { |
696 | zs_free(meta->mem_pool, handle); | 670 | zs_free(zram->mem_pool, handle); |
697 | return -ENOMEM; | 671 | return -ENOMEM; |
698 | } | 672 | } |
699 | 673 | ||
@@ -709,7 +683,6 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index) | |||
709 | unsigned int comp_len; | 683 | unsigned int comp_len; |
710 | void *src, *dst; | 684 | void *src, *dst; |
711 | struct zcomp_strm *zstrm; | 685 | struct zcomp_strm *zstrm; |
712 | struct zram_meta *meta = zram->meta; | ||
713 | struct page *page = bvec->bv_page; | 686 | struct page *page = bvec->bv_page; |
714 | 687 | ||
715 | if (zram_same_page_write(zram, index, page)) | 688 | if (zram_same_page_write(zram, index, page)) |
@@ -722,8 +695,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index) | |||
722 | return ret; | 695 | return ret; |
723 | } | 696 | } |
724 | 697 | ||
725 | 698 | dst = zs_map_object(zram->mem_pool, handle, ZS_MM_WO); | |
726 | dst = zs_map_object(meta->mem_pool, handle, ZS_MM_WO); | ||
727 | 699 | ||
728 | src = zstrm->buffer; | 700 | src = zstrm->buffer; |
729 | if (comp_len == PAGE_SIZE) | 701 | if (comp_len == PAGE_SIZE) |
@@ -733,7 +705,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index) | |||
733 | kunmap_atomic(src); | 705 | kunmap_atomic(src); |
734 | 706 | ||
735 | zcomp_stream_put(zram->comp); | 707 | zcomp_stream_put(zram->comp); |
736 | zs_unmap_object(meta->mem_pool, handle); | 708 | zs_unmap_object(zram->mem_pool, handle); |
737 | 709 | ||
738 | /* | 710 | /* |
739 | * Free memory associated with this sector | 711 | * Free memory associated with this sector |
@@ -741,8 +713,8 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index) | |||
741 | */ | 713 | */ |
742 | zram_slot_lock(zram, index); | 714 | zram_slot_lock(zram, index); |
743 | zram_free_page(zram, index); | 715 | zram_free_page(zram, index); |
744 | meta->table[index].handle = handle; | 716 | zram->table[index].handle = handle; |
745 | zram_set_obj_size(meta, index, comp_len); | 717 | zram_set_obj_size(zram, index, comp_len); |
746 | zram_slot_unlock(zram, index); | 718 | zram_slot_unlock(zram, index); |
747 | 719 | ||
748 | /* Update stats */ | 720 | /* Update stats */ |
@@ -932,10 +904,8 @@ static void zram_slot_free_notify(struct block_device *bdev, | |||
932 | unsigned long index) | 904 | unsigned long index) |
933 | { | 905 | { |
934 | struct zram *zram; | 906 | struct zram *zram; |
935 | struct zram_meta *meta; | ||
936 | 907 | ||
937 | zram = bdev->bd_disk->private_data; | 908 | zram = bdev->bd_disk->private_data; |
938 | meta = zram->meta; | ||
939 | 909 | ||
940 | zram_slot_lock(zram, index); | 910 | zram_slot_lock(zram, index); |
941 | zram_free_page(zram, index); | 911 | zram_free_page(zram, index); |
@@ -983,7 +953,6 @@ out: | |||
983 | 953 | ||
984 | static void zram_reset_device(struct zram *zram) | 954 | static void zram_reset_device(struct zram *zram) |
985 | { | 955 | { |
986 | struct zram_meta *meta; | ||
987 | struct zcomp *comp; | 956 | struct zcomp *comp; |
988 | u64 disksize; | 957 | u64 disksize; |
989 | 958 | ||
@@ -996,7 +965,6 @@ static void zram_reset_device(struct zram *zram) | |||
996 | return; | 965 | return; |
997 | } | 966 | } |
998 | 967 | ||
999 | meta = zram->meta; | ||
1000 | comp = zram->comp; | 968 | comp = zram->comp; |
1001 | disksize = zram->disksize; | 969 | disksize = zram->disksize; |
1002 | 970 | ||
@@ -1009,7 +977,7 @@ static void zram_reset_device(struct zram *zram) | |||
1009 | 977 | ||
1010 | up_write(&zram->init_lock); | 978 | up_write(&zram->init_lock); |
1011 | /* I/O operation under all of CPU are done so let's free */ | 979 | /* I/O operation under all of CPU are done so let's free */ |
1012 | zram_meta_free(meta, disksize); | 980 | zram_meta_free(zram, disksize); |
1013 | zcomp_destroy(comp); | 981 | zcomp_destroy(comp); |
1014 | } | 982 | } |
1015 | 983 | ||
@@ -1018,7 +986,6 @@ static ssize_t disksize_store(struct device *dev, | |||
1018 | { | 986 | { |
1019 | u64 disksize; | 987 | u64 disksize; |
1020 | struct zcomp *comp; | 988 | struct zcomp *comp; |
1021 | struct zram_meta *meta; | ||
1022 | struct zram *zram = dev_to_zram(dev); | 989 | struct zram *zram = dev_to_zram(dev); |
1023 | int err; | 990 | int err; |
1024 | 991 | ||
@@ -1026,10 +993,18 @@ static ssize_t disksize_store(struct device *dev, | |||
1026 | if (!disksize) | 993 | if (!disksize) |
1027 | return -EINVAL; | 994 | return -EINVAL; |
1028 | 995 | ||
996 | down_write(&zram->init_lock); | ||
997 | if (init_done(zram)) { | ||
998 | pr_info("Cannot change disksize for initialized device\n"); | ||
999 | err = -EBUSY; | ||
1000 | goto out_unlock; | ||
1001 | } | ||
1002 | |||
1029 | disksize = PAGE_ALIGN(disksize); | 1003 | disksize = PAGE_ALIGN(disksize); |
1030 | meta = zram_meta_alloc(zram->disk->disk_name, disksize); | 1004 | if (!zram_meta_alloc(zram, disksize)) { |
1031 | if (!meta) | 1005 | err = -ENOMEM; |
1032 | return -ENOMEM; | 1006 | goto out_unlock; |
1007 | } | ||
1033 | 1008 | ||
1034 | comp = zcomp_create(zram->compressor); | 1009 | comp = zcomp_create(zram->compressor); |
1035 | if (IS_ERR(comp)) { | 1010 | if (IS_ERR(comp)) { |
@@ -1039,14 +1014,6 @@ static ssize_t disksize_store(struct device *dev, | |||
1039 | goto out_free_meta; | 1014 | goto out_free_meta; |
1040 | } | 1015 | } |
1041 | 1016 | ||
1042 | down_write(&zram->init_lock); | ||
1043 | if (init_done(zram)) { | ||
1044 | pr_info("Cannot change disksize for initialized device\n"); | ||
1045 | err = -EBUSY; | ||
1046 | goto out_destroy_comp; | ||
1047 | } | ||
1048 | |||
1049 | zram->meta = meta; | ||
1050 | zram->comp = comp; | 1017 | zram->comp = comp; |
1051 | zram->disksize = disksize; | 1018 | zram->disksize = disksize; |
1052 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); | 1019 | set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); |
@@ -1055,11 +1022,10 @@ static ssize_t disksize_store(struct device *dev, | |||
1055 | 1022 | ||
1056 | return len; | 1023 | return len; |
1057 | 1024 | ||
1058 | out_destroy_comp: | ||
1059 | up_write(&zram->init_lock); | ||
1060 | zcomp_destroy(comp); | ||
1061 | out_free_meta: | 1025 | out_free_meta: |
1062 | zram_meta_free(meta, disksize); | 1026 | zram_meta_free(zram, disksize); |
1027 | out_unlock: | ||
1028 | up_write(&zram->init_lock); | ||
1063 | return err; | 1029 | return err; |
1064 | } | 1030 | } |
1065 | 1031 | ||
@@ -1245,7 +1211,6 @@ static int zram_add(void) | |||
1245 | goto out_free_disk; | 1211 | goto out_free_disk; |
1246 | } | 1212 | } |
1247 | strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); | 1213 | strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); |
1248 | zram->meta = NULL; | ||
1249 | 1214 | ||
1250 | pr_info("Added device: %s\n", zram->disk->disk_name); | 1215 | pr_info("Added device: %s\n", zram->disk->disk_name); |
1251 | return device_id; | 1216 | return device_id; |
diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index caeff51f1571..e34e44d02e3e 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h | |||
@@ -92,13 +92,9 @@ struct zram_stats { | |||
92 | atomic64_t writestall; /* no. of write slow paths */ | 92 | atomic64_t writestall; /* no. of write slow paths */ |
93 | }; | 93 | }; |
94 | 94 | ||
95 | struct zram_meta { | 95 | struct zram { |
96 | struct zram_table_entry *table; | 96 | struct zram_table_entry *table; |
97 | struct zs_pool *mem_pool; | 97 | struct zs_pool *mem_pool; |
98 | }; | ||
99 | |||
100 | struct zram { | ||
101 | struct zram_meta *meta; | ||
102 | struct zcomp *comp; | 98 | struct zcomp *comp; |
103 | struct gendisk *disk; | 99 | struct gendisk *disk; |
104 | /* Prevent concurrent execution of device init */ | 100 | /* Prevent concurrent execution of device init */ |