@@ -55,17 +55,17 @@ static void zram_free_page(struct zram *zram, size_t index);
55
55
56
56
static int zram_slot_trylock (struct zram * zram , u32 index )
57
57
{
58
- return bit_spin_trylock (ZRAM_LOCK , & zram -> table [index ].value );
58
+ return bit_spin_trylock (ZRAM_LOCK , & zram -> table [index ].flags );
59
59
}
60
60
61
61
static void zram_slot_lock (struct zram * zram , u32 index )
62
62
{
63
- bit_spin_lock (ZRAM_LOCK , & zram -> table [index ].value );
63
+ bit_spin_lock (ZRAM_LOCK , & zram -> table [index ].flags );
64
64
}
65
65
66
66
static void zram_slot_unlock (struct zram * zram , u32 index )
67
67
{
68
- bit_spin_unlock (ZRAM_LOCK , & zram -> table [index ].value );
68
+ bit_spin_unlock (ZRAM_LOCK , & zram -> table [index ].flags );
69
69
}
70
70
71
71
static inline bool init_done (struct zram * zram )
@@ -76,7 +76,7 @@ static inline bool init_done(struct zram *zram)
76
76
static inline bool zram_allocated (struct zram * zram , u32 index )
77
77
{
78
78
79
- return (zram -> table [index ].value >> (ZRAM_FLAG_SHIFT + 1 )) ||
79
+ return (zram -> table [index ].flags >> (ZRAM_FLAG_SHIFT + 1 )) ||
80
80
zram -> table [index ].handle ;
81
81
}
82
82
@@ -99,19 +99,19 @@ static void zram_set_handle(struct zram *zram, u32 index, unsigned long handle)
99
99
static bool zram_test_flag (struct zram * zram , u32 index ,
100
100
enum zram_pageflags flag )
101
101
{
102
- return zram -> table [index ].value & BIT (flag );
102
+ return zram -> table [index ].flags & BIT (flag );
103
103
}
104
104
105
105
static void zram_set_flag (struct zram * zram , u32 index ,
106
106
enum zram_pageflags flag )
107
107
{
108
- zram -> table [index ].value |= BIT (flag );
108
+ zram -> table [index ].flags |= BIT (flag );
109
109
}
110
110
111
111
static void zram_clear_flag (struct zram * zram , u32 index ,
112
112
enum zram_pageflags flag )
113
113
{
114
- zram -> table [index ].value &= ~BIT (flag );
114
+ zram -> table [index ].flags &= ~BIT (flag );
115
115
}
116
116
117
117
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)
127
127
128
128
static size_t zram_get_obj_size (struct zram * zram , u32 index )
129
129
{
130
- return zram -> table [index ].value & (BIT (ZRAM_FLAG_SHIFT ) - 1 );
130
+ return zram -> table [index ].flags & (BIT (ZRAM_FLAG_SHIFT ) - 1 );
131
131
}
132
132
133
133
static void zram_set_obj_size (struct zram * zram ,
134
134
u32 index , size_t size )
135
135
{
136
- unsigned long flags = zram -> table [index ].value >> ZRAM_FLAG_SHIFT ;
136
+ unsigned long flags = zram -> table [index ].flags >> ZRAM_FLAG_SHIFT ;
137
137
138
- zram -> table [index ].value = (flags << ZRAM_FLAG_SHIFT ) | size ;
138
+ zram -> table [index ].flags = (flags << ZRAM_FLAG_SHIFT ) | size ;
139
139
}
140
140
141
141
#if PAGE_SIZE != 4096
@@ -282,16 +282,11 @@ static ssize_t mem_used_max_store(struct device *dev,
282
282
}
283
283
284
284
#ifdef CONFIG_ZRAM_WRITEBACK
285
- static bool zram_wb_enabled (struct zram * zram )
286
- {
287
- return zram -> backing_dev ;
288
- }
289
-
290
285
static void reset_bdev (struct zram * zram )
291
286
{
292
287
struct block_device * bdev ;
293
288
294
- if (!zram_wb_enabled ( zram ) )
289
+ if (!zram -> backing_dev )
295
290
return ;
296
291
297
292
bdev = zram -> bdev ;
@@ -318,7 +313,7 @@ static ssize_t backing_dev_show(struct device *dev,
318
313
ssize_t ret ;
319
314
320
315
down_read (& zram -> init_lock );
321
- if (!zram_wb_enabled ( zram ) ) {
316
+ if (!zram -> backing_dev ) {
322
317
memcpy (buf , "none\n" , 5 );
323
318
up_read (& zram -> init_lock );
324
319
return 5 ;
@@ -447,7 +442,7 @@ static ssize_t backing_dev_store(struct device *dev,
447
442
return err ;
448
443
}
449
444
450
- static unsigned long get_entry_bdev (struct zram * zram )
445
+ static unsigned long alloc_block_bdev (struct zram * zram )
451
446
{
452
447
unsigned long blk_idx = 1 ;
453
448
retry :
@@ -462,11 +457,11 @@ static unsigned long get_entry_bdev(struct zram *zram)
462
457
return blk_idx ;
463
458
}
464
459
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 )
466
461
{
467
462
int was_set ;
468
463
469
- was_set = test_and_clear_bit (entry , zram -> bitmap );
464
+ was_set = test_and_clear_bit (blk_idx , zram -> bitmap );
470
465
WARN_ON_ONCE (!was_set );
471
466
}
472
467
@@ -579,7 +574,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
579
574
if (!bio )
580
575
return - ENOMEM ;
581
576
582
- entry = get_entry_bdev (zram );
577
+ entry = alloc_block_bdev (zram );
583
578
if (!entry ) {
584
579
bio_put (bio );
585
580
return - ENOSPC ;
@@ -590,7 +585,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
590
585
if (!bio_add_page (bio , bvec -> bv_page , bvec -> bv_len ,
591
586
bvec -> bv_offset )) {
592
587
bio_put (bio );
593
- put_entry_bdev (zram , entry );
588
+ free_block_bdev (zram , entry );
594
589
return - EIO ;
595
590
}
596
591
@@ -608,18 +603,7 @@ static int write_to_bdev(struct zram *zram, struct bio_vec *bvec,
608
603
return 0 ;
609
604
}
610
605
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
-
621
606
#else
622
- static bool zram_wb_enabled (struct zram * zram ) { return false; }
623
607
static inline void reset_bdev (struct zram * zram ) {};
624
608
static int write_to_bdev (struct zram * zram , struct bio_vec * bvec ,
625
609
u32 index , struct bio * parent ,
@@ -634,7 +618,8 @@ static int read_from_bdev(struct zram *zram, struct bio_vec *bvec,
634
618
{
635
619
return - EIO ;
636
620
}
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 ) {};
638
623
#endif
639
624
640
625
#ifdef CONFIG_ZRAM_MEMORY_TRACKING
@@ -656,11 +641,6 @@ static void zram_accessed(struct zram *zram, u32 index)
656
641
zram -> table [index ].ac_time = ktime_get_boottime ();
657
642
}
658
643
659
- static void zram_reset_access (struct zram * zram , u32 index )
660
- {
661
- zram -> table [index ].ac_time = 0 ;
662
- }
663
-
664
644
static ssize_t read_block_state (struct file * file , char __user * buf ,
665
645
size_t count , loff_t * ppos )
666
646
{
@@ -741,7 +721,6 @@ static void zram_debugfs_unregister(struct zram *zram)
741
721
static void zram_debugfs_create (void ) {};
742
722
static void zram_debugfs_destroy (void ) {};
743
723
static void zram_accessed (struct zram * zram , u32 index ) {};
744
- static void zram_reset_access (struct zram * zram , u32 index ) {};
745
724
static void zram_debugfs_register (struct zram * zram ) {};
746
725
static void zram_debugfs_unregister (struct zram * zram ) {};
747
726
#endif
@@ -942,17 +921,18 @@ static void zram_free_page(struct zram *zram, size_t index)
942
921
{
943
922
unsigned long handle ;
944
923
945
- zram_reset_access (zram , index );
946
-
924
+ #ifdef CONFIG_ZRAM_MEMORY_TRACKING
925
+ zram -> table [index ].ac_time = 0 ;
926
+ #endif
947
927
if (zram_test_flag (zram , index , ZRAM_HUGE )) {
948
928
zram_clear_flag (zram , index , ZRAM_HUGE );
949
929
atomic64_dec (& zram -> stats .huge_pages );
950
930
}
951
931
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 ;
956
936
}
957
937
958
938
/*
@@ -961,10 +941,8 @@ static void zram_free_page(struct zram *zram, size_t index)
961
941
*/
962
942
if (zram_test_flag (zram , index , ZRAM_SAME )) {
963
943
zram_clear_flag (zram , index , ZRAM_SAME );
964
- zram_set_element (zram , index , 0 );
965
944
atomic64_dec (& zram -> stats .same_pages );
966
- atomic64_dec (& zram -> stats .pages_stored );
967
- return ;
945
+ goto out ;
968
946
}
969
947
970
948
handle = zram_get_handle (zram , index );
@@ -975,10 +953,11 @@ static void zram_free_page(struct zram *zram, size_t index)
975
953
976
954
atomic64_sub (zram_get_obj_size (zram , index ),
977
955
& zram -> stats .compr_data_size );
956
+ out :
978
957
atomic64_dec (& zram -> stats .pages_stored );
979
-
980
958
zram_set_handle (zram , index , 0 );
981
959
zram_set_obj_size (zram , index , 0 );
960
+ WARN_ON_ONCE (zram -> table [index ].flags & ~(1UL << ZRAM_LOCK ));
982
961
}
983
962
984
963
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,
989
968
unsigned int size ;
990
969
void * src , * dst ;
991
970
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 ;
998
974
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
- }
1006
975
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 );
1007
983
}
1008
984
1009
- zram_slot_lock (zram , index );
1010
985
handle = zram_get_handle (zram , index );
1011
986
if (!handle || zram_test_flag (zram , index , ZRAM_SAME )) {
1012
987
unsigned long value ;
@@ -1118,7 +1093,7 @@ static int __zram_bvec_write(struct zram *zram, struct bio_vec *bvec,
1118
1093
1119
1094
if (unlikely (comp_len >= huge_class_size )) {
1120
1095
comp_len = PAGE_SIZE ;
1121
- if (zram_wb_enabled ( zram ) && allow_wb ) {
1096
+ if (zram -> backing_dev && allow_wb ) {
1122
1097
zcomp_stream_put (zram -> comp );
1123
1098
ret = write_to_bdev (zram , bvec , index , bio , & element );
1124
1099
if (!ret ) {
0 commit comments