@@ -316,11 +316,9 @@ static ssize_t idle_store(struct device *dev,
316
316
* See the comment in writeback_store.
317
317
*/
318
318
zram_slot_lock (zram , index );
319
- if (!zram_allocated (zram , index ) ||
320
- zram_test_flag (zram , index , ZRAM_UNDER_WB ))
321
- goto next ;
322
- zram_set_flag (zram , index , ZRAM_IDLE );
323
- next :
319
+ if (zram_allocated (zram , index ) &&
320
+ !zram_test_flag (zram , index , ZRAM_UNDER_WB ))
321
+ zram_set_flag (zram , index , ZRAM_IDLE );
324
322
zram_slot_unlock (zram , index );
325
323
}
326
324
@@ -330,6 +328,41 @@ static ssize_t idle_store(struct device *dev,
330
328
}
331
329
332
330
#ifdef CONFIG_ZRAM_WRITEBACK
331
+ static ssize_t writeback_limit_enable_store (struct device * dev ,
332
+ struct device_attribute * attr , const char * buf , size_t len )
333
+ {
334
+ struct zram * zram = dev_to_zram (dev );
335
+ u64 val ;
336
+ ssize_t ret = - EINVAL ;
337
+
338
+ if (kstrtoull (buf , 10 , & val ))
339
+ return ret ;
340
+
341
+ down_read (& zram -> init_lock );
342
+ spin_lock (& zram -> wb_limit_lock );
343
+ zram -> wb_limit_enable = val ;
344
+ spin_unlock (& zram -> wb_limit_lock );
345
+ up_read (& zram -> init_lock );
346
+ ret = len ;
347
+
348
+ return ret ;
349
+ }
350
+
351
+ static ssize_t writeback_limit_enable_show (struct device * dev ,
352
+ struct device_attribute * attr , char * buf )
353
+ {
354
+ bool val ;
355
+ struct zram * zram = dev_to_zram (dev );
356
+
357
+ down_read (& zram -> init_lock );
358
+ spin_lock (& zram -> wb_limit_lock );
359
+ val = zram -> wb_limit_enable ;
360
+ spin_unlock (& zram -> wb_limit_lock );
361
+ up_read (& zram -> init_lock );
362
+
363
+ return scnprintf (buf , PAGE_SIZE , "%d\n" , val );
364
+ }
365
+
333
366
static ssize_t writeback_limit_store (struct device * dev ,
334
367
struct device_attribute * attr , const char * buf , size_t len )
335
368
{
@@ -341,9 +374,9 @@ static ssize_t writeback_limit_store(struct device *dev,
341
374
return ret ;
342
375
343
376
down_read (& zram -> init_lock );
344
- atomic64_set (& zram -> stats . bd_wb_limit , val );
345
- if ( val == 0 )
346
- zram -> stop_writeback = false ;
377
+ spin_lock (& zram -> wb_limit_lock );
378
+ zram -> bd_wb_limit = val ;
379
+ spin_unlock ( & zram -> wb_limit_lock ) ;
347
380
up_read (& zram -> init_lock );
348
381
ret = len ;
349
382
@@ -357,7 +390,9 @@ static ssize_t writeback_limit_show(struct device *dev,
357
390
struct zram * zram = dev_to_zram (dev );
358
391
359
392
down_read (& zram -> init_lock );
360
- val = atomic64_read (& zram -> stats .bd_wb_limit );
393
+ spin_lock (& zram -> wb_limit_lock );
394
+ val = zram -> bd_wb_limit ;
395
+ spin_unlock (& zram -> wb_limit_lock );
361
396
up_read (& zram -> init_lock );
362
397
363
398
return scnprintf (buf , PAGE_SIZE , "%llu\n" , val );
@@ -588,8 +623,8 @@ static int read_from_bdev_async(struct zram *zram, struct bio_vec *bvec,
588
623
return 1 ;
589
624
}
590
625
591
- #define HUGE_WRITEBACK 0x1
592
- #define IDLE_WRITEBACK 0x2
626
+ #define HUGE_WRITEBACK 1
627
+ #define IDLE_WRITEBACK 2
593
628
594
629
static ssize_t writeback_store (struct device * dev ,
595
630
struct device_attribute * attr , const char * buf , size_t len )
@@ -602,7 +637,7 @@ static ssize_t writeback_store(struct device *dev,
602
637
struct page * page ;
603
638
ssize_t ret , sz ;
604
639
char mode_buf [8 ];
605
- unsigned long mode = -1UL ;
640
+ int mode = -1 ;
606
641
unsigned long blk_idx = 0 ;
607
642
608
643
sz = strscpy (mode_buf , buf , sizeof (mode_buf ));
@@ -618,7 +653,7 @@ static ssize_t writeback_store(struct device *dev,
618
653
else if (!strcmp (mode_buf , "huge" ))
619
654
mode = HUGE_WRITEBACK ;
620
655
621
- if (mode == -1UL )
656
+ if (mode == -1 )
622
657
return - EINVAL ;
623
658
624
659
down_read (& zram -> init_lock );
@@ -645,10 +680,13 @@ static ssize_t writeback_store(struct device *dev,
645
680
bvec .bv_len = PAGE_SIZE ;
646
681
bvec .bv_offset = 0 ;
647
682
648
- if (zram -> stop_writeback ) {
683
+ spin_lock (& zram -> wb_limit_lock );
684
+ if (zram -> wb_limit_enable && !zram -> bd_wb_limit ) {
685
+ spin_unlock (& zram -> wb_limit_lock );
649
686
ret = - EIO ;
650
687
break ;
651
688
}
689
+ spin_unlock (& zram -> wb_limit_lock );
652
690
653
691
if (!blk_idx ) {
654
692
blk_idx = alloc_block_bdev (zram );
@@ -667,10 +705,11 @@ static ssize_t writeback_store(struct device *dev,
667
705
zram_test_flag (zram , index , ZRAM_UNDER_WB ))
668
706
goto next ;
669
707
670
- if ((mode & IDLE_WRITEBACK &&
671
- !zram_test_flag (zram , index , ZRAM_IDLE )) &&
672
- (mode & HUGE_WRITEBACK &&
673
- !zram_test_flag (zram , index , ZRAM_HUGE )))
708
+ if (mode == IDLE_WRITEBACK &&
709
+ !zram_test_flag (zram , index , ZRAM_IDLE ))
710
+ goto next ;
711
+ if (mode == HUGE_WRITEBACK &&
712
+ !zram_test_flag (zram , index , ZRAM_HUGE ))
674
713
goto next ;
675
714
/*
676
715
* Clearing ZRAM_UNDER_WB is duty of caller.
@@ -732,11 +771,10 @@ static ssize_t writeback_store(struct device *dev,
732
771
zram_set_element (zram , index , blk_idx );
733
772
blk_idx = 0 ;
734
773
atomic64_inc (& zram -> stats .pages_stored );
735
- if (atomic64_add_unless (& zram -> stats .bd_wb_limit ,
736
- -1 << (PAGE_SHIFT - 12 ), 0 )) {
737
- if (atomic64_read (& zram -> stats .bd_wb_limit ) == 0 )
738
- zram -> stop_writeback = true;
739
- }
774
+ spin_lock (& zram -> wb_limit_lock );
775
+ if (zram -> wb_limit_enable && zram -> bd_wb_limit > 0 )
776
+ zram -> bd_wb_limit -= 1UL << (PAGE_SHIFT - 12 );
777
+ spin_unlock (& zram -> wb_limit_lock );
740
778
next :
741
779
zram_slot_unlock (zram , index );
742
780
}
@@ -1812,6 +1850,7 @@ static DEVICE_ATTR_RW(comp_algorithm);
1812
1850
static DEVICE_ATTR_RW (backing_dev );
1813
1851
static DEVICE_ATTR_WO (writeback );
1814
1852
static DEVICE_ATTR_RW (writeback_limit );
1853
+ static DEVICE_ATTR_RW (writeback_limit_enable );
1815
1854
#endif
1816
1855
1817
1856
static struct attribute * zram_disk_attrs [] = {
@@ -1828,6 +1867,7 @@ static struct attribute *zram_disk_attrs[] = {
1828
1867
& dev_attr_backing_dev .attr ,
1829
1868
& dev_attr_writeback .attr ,
1830
1869
& dev_attr_writeback_limit .attr ,
1870
+ & dev_attr_writeback_limit_enable .attr ,
1831
1871
#endif
1832
1872
& dev_attr_io_stat .attr ,
1833
1873
& dev_attr_mm_stat .attr ,
@@ -1867,7 +1907,9 @@ static int zram_add(void)
1867
1907
device_id = ret ;
1868
1908
1869
1909
init_rwsem (& zram -> init_lock );
1870
-
1910
+ #ifdef CONFIG_ZRAM_WRITEBACK
1911
+ spin_lock_init (& zram -> wb_limit_lock );
1912
+ #endif
1871
1913
queue = blk_alloc_queue (GFP_KERNEL );
1872
1914
if (!queue ) {
1873
1915
pr_err ("Error allocating disk queue for device %d\n" ,
0 commit comments