2020-01-21 11:38:05

by Yue Hu

[permalink] [raw]
Subject: [PATCH] zram: do not set ZRAM_IDLE bit for idlepage writeback in writeback_store()

From: Yue Hu <[email protected]>

Currently, we will call zram_set_flag() to set ZRAM_IDLE bit even for
idlepage writeback. That is pointless. Let's set it only for hugepage mode.

Signed-off-by: Yue Hu <[email protected]>
---
drivers/block/zram/zram_drv.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 4285e75..eef5767 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -689,16 +689,18 @@ static ssize_t writeback_store(struct device *dev,
if (mode == IDLE_WRITEBACK &&
!zram_test_flag(zram, index, ZRAM_IDLE))
goto next;
- if (mode == HUGE_WRITEBACK &&
- !zram_test_flag(zram, index, ZRAM_HUGE))
- goto next;
+ if (mode == HUGE_WRITEBACK) {
+ if (!zram_test_flag(zram, index, ZRAM_HUGE))
+ goto next;
+ /* Need for hugepage writeback racing */
+ zram_set_flag(zram, index, ZRAM_IDLE);
+ }
+
/*
* Clearing ZRAM_UNDER_WB is duty of caller.
* IOW, zram_free_page never clear it.
*/
zram_set_flag(zram, index, ZRAM_UNDER_WB);
- /* Need for hugepage writeback racing */
- zram_set_flag(zram, index, ZRAM_IDLE);
zram_slot_unlock(zram, index);
if (zram_bvec_read(zram, &bvec, index, 0, NULL)) {
zram_slot_lock(zram, index);
--
1.9.1


2020-01-23 02:24:38

by Minchan Kim

[permalink] [raw]
Subject: Re: [PATCH] zram: do not set ZRAM_IDLE bit for idlepage writeback in writeback_store()

On Tue, Jan 21, 2020 at 07:35:57PM +0800, Yue Hu wrote:
> From: Yue Hu <[email protected]>
>
> Currently, we will call zram_set_flag() to set ZRAM_IDLE bit even for
> idlepage writeback. That is pointless. Let's set it only for hugepage mode.

Could you be more specific? What do you see the problem with that?

>
> Signed-off-by: Yue Hu <[email protected]>
> ---
> drivers/block/zram/zram_drv.c | 12 +++++++-----
> 1 file changed, 7 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
> index 4285e75..eef5767 100644
> --- a/drivers/block/zram/zram_drv.c
> +++ b/drivers/block/zram/zram_drv.c
> @@ -689,16 +689,18 @@ static ssize_t writeback_store(struct device *dev,
> if (mode == IDLE_WRITEBACK &&
> !zram_test_flag(zram, index, ZRAM_IDLE))
> goto next;
> - if (mode == HUGE_WRITEBACK &&
> - !zram_test_flag(zram, index, ZRAM_HUGE))
> - goto next;
> + if (mode == HUGE_WRITEBACK) {
> + if (!zram_test_flag(zram, index, ZRAM_HUGE))
> + goto next;
> + /* Need for hugepage writeback racing */
> + zram_set_flag(zram, index, ZRAM_IDLE);
> + }
> +
> /*
> * Clearing ZRAM_UNDER_WB is duty of caller.
> * IOW, zram_free_page never clear it.
> */
> zram_set_flag(zram, index, ZRAM_UNDER_WB);
> - /* Need for hugepage writeback racing */
> - zram_set_flag(zram, index, ZRAM_IDLE);
> zram_slot_unlock(zram, index);
> if (zram_bvec_read(zram, &bvec, index, 0, NULL)) {
> zram_slot_lock(zram, index);
> --
> 1.9.1
>

2020-01-23 02:42:23

by Yue Hu

[permalink] [raw]
Subject: Re: [PATCH] zram: do not set ZRAM_IDLE bit for idlepage writeback in writeback_store()

On Wed, 22 Jan 2020 18:23:05 -0800
Minchan Kim <[email protected]> wrote:

> On Tue, Jan 21, 2020 at 07:35:57PM +0800, Yue Hu wrote:
> > From: Yue Hu <[email protected]>
> >
> > Currently, we will call zram_set_flag() to set ZRAM_IDLE bit even for
> > idlepage writeback. That is pointless. Let's set it only for hugepage mode.
>
> Could you be more specific? What do you see the problem with that?

If current writeback mode is idle, ZRAM_IDLE bit will be check firstly for this
slot. Then go to call zram_set_flag(, , ZRAM_IDLE) if it's marked as ZRAM_IDLE.
So, it's duplicated setting, am i right?

Thx.

>
> >
> > Signed-off-by: Yue Hu <[email protected]>
> > ---
> > drivers/block/zram/zram_drv.c | 12 +++++++-----
> > 1 file changed, 7 insertions(+), 5 deletions(-)
> >
> > diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
> > index 4285e75..eef5767 100644
> > --- a/drivers/block/zram/zram_drv.c
> > +++ b/drivers/block/zram/zram_drv.c
> > @@ -689,16 +689,18 @@ static ssize_t writeback_store(struct device *dev,
> > if (mode == IDLE_WRITEBACK &&
> > !zram_test_flag(zram, index, ZRAM_IDLE))
> > goto next;
> > - if (mode == HUGE_WRITEBACK &&
> > - !zram_test_flag(zram, index, ZRAM_HUGE))
> > - goto next;
> > + if (mode == HUGE_WRITEBACK) {
> > + if (!zram_test_flag(zram, index, ZRAM_HUGE))
> > + goto next;
> > + /* Need for hugepage writeback racing */
> > + zram_set_flag(zram, index, ZRAM_IDLE);
> > + }
> > +
> > /*
> > * Clearing ZRAM_UNDER_WB is duty of caller.
> > * IOW, zram_free_page never clear it.
> > */
> > zram_set_flag(zram, index, ZRAM_UNDER_WB);
> > - /* Need for hugepage writeback racing */
> > - zram_set_flag(zram, index, ZRAM_IDLE);
> > zram_slot_unlock(zram, index);
> > if (zram_bvec_read(zram, &bvec, index, 0, NULL)) {
> > zram_slot_lock(zram, index);
> > --
> > 1.9.1
> >

2020-01-24 00:51:05

by Minchan Kim

[permalink] [raw]
Subject: Re: [PATCH] zram: do not set ZRAM_IDLE bit for idlepage writeback in writeback_store()

On Thu, Jan 23, 2020 at 10:39:36AM +0800, Yue Hu wrote:
> On Wed, 22 Jan 2020 18:23:05 -0800
> Minchan Kim <[email protected]> wrote:
>
> > On Tue, Jan 21, 2020 at 07:35:57PM +0800, Yue Hu wrote:
> > > From: Yue Hu <[email protected]>
> > >
> > > Currently, we will call zram_set_flag() to set ZRAM_IDLE bit even for
> > > idlepage writeback. That is pointless. Let's set it only for hugepage mode.
> >
> > Could you be more specific? What do you see the problem with that?
>
> If current writeback mode is idle, ZRAM_IDLE bit will be check firstly for this
> slot. Then go to call zram_set_flag(, , ZRAM_IDLE) if it's marked as ZRAM_IDLE.
> So, it's duplicated setting, am i right?

As I wrote down in the description, it aims for the race with hugepage writeback.
Without it, there is no way to detect the slot is reallocated and marked
with huge again but it's new data so zram could free the page
unintentionally.