Skip to content

Commit 7e52928

Browse files
minchanktorvalds
authored andcommitted
zram: refactor flags and writeback stuff
Rename some variables and restructure some code for better readability in writeback and zs_free_page. Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Minchan Kim <[email protected]> Reviewed-by: Sergey Senozhatsky <[email protected]> Reviewed-by: Joey Pabalinas <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 5547932 commit 7e52928

File tree

2 files changed

+44
-69
lines changed

2 files changed

+44
-69
lines changed

drivers/block/zram/zram_drv.c

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,17 @@ static void zram_free_page(struct zram *zram, size_t index);
5555

5656
static int zram_slot_trylock(struct zram *zram, u32 index)
5757
{
58-
return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].value);
58+
return bit_spin_trylock(ZRAM_LOCK, &zram->table[index].flags);
5959
}
6060

6161
static void zram_slot_lock(struct zram *zram, u32 index)
6262
{
63-
bit_spin_lock(ZRAM_LOCK, &zram->table[index].value);
63+
bit_spin_lock(ZRAM_LOCK, &zram->table[index].flags);
6464
}
6565

6666
static void zram_slot_unlock(struct zram *zram, u32 index)
6767
{
68-
bit_spin_unlock(ZRAM_LOCK, &zram->table[index].value);
68+
bit_spin_unlock(ZRAM_LOCK, &zram->table[index].flags);
6969
}
7070

7171
static inline bool init_done(struct zram *zram)
@@ -76,7 +76,7 @@ static inline bool init_done(struct zram *zram)
7676
static inline bool zram_allocated(struct zram *zram, u32 index)
7777
{
7878

79-
return (zram->table[index].value >> (ZRAM_FLAG_SHIFT + 1)) ||
79+
return (zram->table[index].flags >> (ZRAM_FLAG_SHIFT + 1)) ||
8080
zram->table[index].handle;
8181
}
8282

@@ -99,19 +99,19 @@ static void zram_set_handle(struct zram *zram, u32 index, unsigned long handle)
9999
static bool zram_test_flag(struct zram *zram, u32 index,
100100
enum zram_pageflags flag)
101101
{
102-
return zram->table[index].value & BIT(flag);
102+
return zram->table[index].flags & BIT(flag);
103103
}
104104

105105
static void zram_set_flag(struct zram *zram, u32 index,
106106
enum zram_pageflags flag)
107107
{
108-
zram->table[index].value |= BIT(flag);
108+
zram->table[index].flags |= BIT(flag);
109109
}
110110

111111
static void zram_clear_flag(struct zram *zram, u32 index,
112112
enum zram_pageflags flag)
113113
{
114-
zram->table[index].value &= ~BIT(flag);
114+
zram->table[index].flags &= ~BIT(flag);
115115
}
116116

117117
static inline void zram_set_element(struct zram *zram, u32 index,
@@ -127,15 +127,15 @@ static unsigned long zram_get_element(struct zram *zram, u32 index)
127127

128128
static size_t zram_get_obj_size(struct zram *zram, u32 index)
129129
{
130-
return zram->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1);
130+
return zram->table[index].flags & (BIT(ZRAM_FLAG_SHIFT) - 1);
131131
}
132132

133133
static void zram_set_obj_size(struct zram *zram,
134134
u32 index, size_t size)
135135
{
136-
unsigned long flags = zram->table[index].value >> ZRAM_FLAG_SHIFT;
136+
unsigned long flags = zram->table[index].flags >> ZRAM_FLAG_SHIFT;
137137

138-
zram->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size;
138+
zram->table[index].flags = (flags << ZRAM_FLAG_SHIFT) | size;
139139
}
140140

141141
#if PAGE_SIZE != 4096
@@ -282,16 +282,11 @@ static ssize_t mem_used_max_store(struct device *dev,
282282
}
283283

284284
#ifdef CONFIG_ZRAM_WRITEBACK
285-
static bool zram_wb_enabled(struct zram *zram)
286-
{
287-
return zram->backing_dev;
288-
}
289-
290285
static void reset_bdev(struct zram *zram)
291286
{
292287
struct block_device *bdev;
293288

294-
if (!zram_wb_enabled(zram))
289+
if (!zram->backing_dev)
295290
return;
296291

297292
bdev = zram->bdev;
@@ -318,7 +313,7 @@ static ssize_t backing_dev_show(struct device *dev,
318313
ssize_t ret;
319314

320315
down_read(&zram->init_lock);
321-
if (!zram_wb_enabled(zram)) {
316+
if (!zram->backing_dev) {
322317
memcpy(buf, "none\n", 5);
323318
up_read(&zram->init_lock);
324319
return 5;
@@ -447,7 +442,7 @@ static ssize_t backing_dev_store(struct device *dev,
447442
return err;
448443
}
449444

450-
static unsigned long get_entry_bdev(struct zram *zram)
445+
static unsigned long alloc_block_bdev(struct zram *zram)
451446
{
452447
unsigned long blk_idx = 1;
453448
retry:
@@ -462,11 +457,11 @@ static unsigned long get_entry_bdev(struct zram *zram)
462457
return blk_idx;
463458
}
464459

465-
static void put_entry_bdev(struct zram *zram, unsigned long entry)
460+
static void free_block_bdev(struct zram *zram, unsigned long blk_idx)
466461
{
467462
int was_set;
468463

469-
was_set = test_and_clear_bit(entry, zram->bitmap);
464+
was_set = test_and_clear_bit(blk_idx, zram->bitmap);
470465
WARN_ON_ONCE(!was_set);
471466
}
472467

@@ -579,7 +574,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
579574
if (!bio)
580575
return -ENOMEM;
581576

582-
entry = get_entry_bdev(zram);
577+
entry = alloc_block_bdev(zram);
583578
if (!entry) {
584579
bio_put(bio);
585580
return -ENOSPC;
@@ -590,7 +585,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
590585
if (!bio_add_page(bio, bvec->bv_page, bvec->bv_len,
591586
bvec->bv_offset)) {
592587
bio_put(bio);
593-
put_entry_bdev(zram, entry);
588+
free_block_bdev(zram, entry);
594589
return -EIO;
595590
}
596591

@@ -608,18 +603,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
608603
return 0;
609604
}
610605

611-
static void zram_wb_clear(struct zram *zram, u32 index)
612-
{
613-
unsigned long entry;
614-
615-
zram_clear_flag(zram, index, ZRAM_WB);
616-
entry = zram_get_element(zram, index);
617-
zram_set_element(zram, index, 0);
618-
put_entry_bdev(zram, entry);
619-
}
620-
621606
#else
622-
static bool zram_wb_enabled(struct zram *zram) { return false; }
623607
static inline void reset_bdev(struct zram *zram) {};
624608
static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
625609
u32 index, struct bio *parent,
@@ -634,7 +618,8 @@ static int read_from_bdev(struct zram *zram, struct bio_vec *bvec,
634618
{
635619
return -EIO;
636620
}
637-
static void zram_wb_clear(struct zram *zram, u32 index) {}
621+
622+
static void free_block_bdev(struct zram *zram, unsigned long blk_idx) {};
638623
#endif
639624

640625
#ifdef CONFIG_ZRAM_MEMORY_TRACKING
@@ -656,11 +641,6 @@ static void zram_accessed(struct zram *zram, u32 index)
656641
zram->table[index].ac_time = ktime_get_boottime();
657642
}
658643

659-
static void zram_reset_access(struct zram *zram, u32 index)
660-
{
661-
zram->table[index].ac_time = 0;
662-
}
663-
664644
static ssize_t read_block_state(struct file *file, char __user *buf,
665645
size_t count, loff_t *ppos)
666646
{
@@ -741,7 +721,6 @@ static void zram_debugfs_unregister(struct zram *zram)
741721
static void zram_debugfs_create(void) {};
742722
static void zram_debugfs_destroy(void) {};
743723
static void zram_accessed(struct zram *zram, u32 index) {};
744-
static void zram_reset_access(struct zram *zram, u32 index) {};
745724
static void zram_debugfs_register(struct zram *zram) {};
746725
static void zram_debugfs_unregister(struct zram *zram) {};
747726
#endif
@@ -942,17 +921,18 @@ static void zram_free_page(struct zram *zram, size_t index)
942921
{
943922
unsigned long handle;
944923

945-
zram_reset_access(zram, index);
946-
924+
#ifdef CONFIG_ZRAM_MEMORY_TRACKING
925+
zram->table[index].ac_time = 0;
926+
#endif
947927
if (zram_test_flag(zram, index, ZRAM_HUGE)) {
948928
zram_clear_flag(zram, index, ZRAM_HUGE);
949929
atomic64_dec(&zram->stats.huge_pages);
950930
}
951931

952-
if (zram_wb_enabled(zram) && zram_test_flag(zram, index, ZRAM_WB)) {
953-
zram_wb_clear(zram, index);
954-
atomic64_dec(&zram->stats.pages_stored);
955-
return;
932+
if (zram_test_flag(zram, index, ZRAM_WB)) {
933+
zram_clear_flag(zram, index, ZRAM_WB);
934+
free_block_bdev(zram, zram_get_element(zram, index));
935+
goto out;
956936
}
957937

958938
/*
@@ -961,10 +941,8 @@ static void zram_free_page(struct zram *zram, size_t index)
961941
*/
962942
if (zram_test_flag(zram, index, ZRAM_SAME)) {
963943
zram_clear_flag(zram, index, ZRAM_SAME);
964-
zram_set_element(zram, index, 0);
965944
atomic64_dec(&zram->stats.same_pages);
966-
atomic64_dec(&zram->stats.pages_stored);
967-
return;
945+
goto out;
968946
}
969947

970948
handle = zram_get_handle(zram, index);
@@ -975,10 +953,11 @@ static void zram_free_page(struct zram *zram, size_t index)
975953

976954
atomic64_sub(zram_get_obj_size(zram, index),
977955
&zram->stats.compr_data_size);
956+
out:
978957
atomic64_dec(&zram->stats.pages_stored);
979-
980958
zram_set_handle(zram, index, 0);
981959
zram_set_obj_size(zram, index, 0);
960+
WARN_ON_ONCE(zram->table[index].flags & ~(1UL << ZRAM_LOCK));
982961
}
983962

984963
static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
@@ -989,24 +968,20 @@ static int __zram_bvec_read(struct zram *zram, struct page *page, u32 index,
989968
unsigned int size;
990969
void *src, *dst;
991970

992-
if (zram_wb_enabled(zram)) {
993-
zram_slot_lock(zram, index);
994-
if (zram_test_flag(zram, index, ZRAM_WB)) {
995-
struct bio_vec bvec;
996-
997-
zram_slot_unlock(zram, index);
971+
zram_slot_lock(zram, index);
972+
if (zram_test_flag(zram, index, ZRAM_WB)) {
973+
struct bio_vec bvec;
998974

999-
bvec.bv_page = page;
1000-
bvec.bv_len = PAGE_SIZE;
1001-
bvec.bv_offset = 0;
1002-
return read_from_bdev(zram, &bvec,
1003-
zram_get_element(zram, index),
1004-
bio, partial_io);
1005-
}
1006975
zram_slot_unlock(zram, index);
976+
977+
bvec.bv_page = page;
978+
bvec.bv_len = PAGE_SIZE;
979+
bvec.bv_offset = 0;
980+
return read_from_bdev(zram, &bvec,
981+
zram_get_element(zram, index),
982+
bio, partial_io);
1007983
}
1008984

1009-
zram_slot_lock(zram, index);
1010985
handle = zram_get_handle(zram, index);
1011986
if (!handle || zram_test_flag(zram, index, ZRAM_SAME)) {
1012987
unsigned long value;
@@ -1118,7 +1093,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec,
11181093

11191094
if (unlikely(comp_len >= huge_class_size)) {
11201095
comp_len = PAGE_SIZE;
1121-
if (zram_wb_enabled(zram) && allow_wb) {
1096+
if (zram->backing_dev && allow_wb) {
11221097
zcomp_stream_put(zram->comp);
11231098
ret = write_to_bdev(zram, bvec, index, bio, &element);
11241099
if (!ret) {

drivers/block/zram/zram_drv.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030

3131

3232
/*
33-
* The lower ZRAM_FLAG_SHIFT bits of table.value is for
33+
* The lower ZRAM_FLAG_SHIFT bits of table.flags is for
3434
* object size (excluding header), the higher bits is for
3535
* zram_pageflags.
3636
*
@@ -41,7 +41,7 @@
4141
*/
4242
#define ZRAM_FLAG_SHIFT 24
4343

44-
/* Flags for zram pages (table[page_no].value) */
44+
/* Flags for zram pages (table[page_no].flags) */
4545
enum zram_pageflags {
4646
/* zram slot is locked */
4747
ZRAM_LOCK = ZRAM_FLAG_SHIFT,
@@ -60,7 +60,7 @@ struct zram_table_entry {
6060
unsigned long handle;
6161
unsigned long element;
6262
};
63-
unsigned long value;
63+
unsigned long flags;
6464
#ifdef CONFIG_ZRAM_MEMORY_TRACKING
6565
ktime_t ac_time;
6666
#endif
@@ -105,8 +105,8 @@ struct zram {
105105
* zram is claimed so open request will be failed
106106
*/
107107
bool claim; /* Protected by bdev->bd_mutex */
108-
#ifdef CONFIG_ZRAM_WRITEBACK
109108
struct file *backing_dev;
109+
#ifdef CONFIG_ZRAM_WRITEBACK
110110
struct block_device *bdev;
111111
unsigned int old_block_size;
112112
unsigned long *bitmap;

0 commit comments

Comments
 (0)