Re: [f2fs-dev] [PATCH 2/2] f2fs: introduce gc_urgent mode for background GC

2017-08-10 Thread Chao Yu
On 2017/8/8 9:42, Jaegeuk Kim wrote:
> This patch adds a sysfs entry to control urgent mode for background GC.
> If this is set, background GC thread conducts GC with gc_urgent_sleep_time
> all the time.
> 
> Signed-off-by: Jaegeuk Kim 

Reviewed-by: Chao Yu 


--
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
___
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel


Re: [f2fs-dev] [PATCH 2/2] f2fs: introduce gc_urgent mode for background GC

2017-08-07 Thread Jaegeuk Kim
Hi Chao,

On 08/08, Chao Yu wrote:
> Hi Jaegeuk,
> 
> On 2017/8/8 9:42, Jaegeuk Kim wrote:
> > This patch adds a sysfs entry to control urgent mode for background GC.
> > If this is set, background GC thread conducts GC with gc_urgent_sleep_time
> > all the time.
> 
> Good idea.
> 
> If we want to add more gc policy, current approach is not friendly to be
> extended, and sysfs nodes are also become more and more, it's not friendly to
> user. So I'd like to suggest adding /sys/fs/f2fs//gc_policy only, and
> exposing original policy as normal_mode, and then introduce urgent_mode and
> reuse gc_min_sleep_time as gc_urgent_sleep_time in this patch.
> 
> e.g.
> 
> enum gc_policy {
>   GC_NORMAL,
>   GC_URGENT,
> };
> 
> If we want to turn on urgent_mode, we could:
> echo 1 > /sys/fs/f2fs//gc_policy
> echo 1000 > /sys/fs/f2fs//gc_min_sleep_time

I want to keep previous gc_min_sleep_time, so that user can go back to normal
state seamlessly.

Thanks,

> 
> How do you think?
> 
> Thanks,
> 
> > 
> > Signed-off-by: Jaegeuk Kim 
> > ---
> >  Documentation/ABI/testing/sysfs-fs-f2fs | 12 
> >  fs/f2fs/gc.c| 17 +++--
> >  fs/f2fs/gc.h|  4 
> >  fs/f2fs/sysfs.c |  9 +
> >  4 files changed, 40 insertions(+), 2 deletions(-)
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs 
> > b/Documentation/ABI/testing/sysfs-fs-f2fs
> > index c579ce5e0ef5..11b7f4ebea7c 100644
> > --- a/Documentation/ABI/testing/sysfs-fs-f2fs
> > +++ b/Documentation/ABI/testing/sysfs-fs-f2fs
> > @@ -139,3 +139,15 @@ Date:  June 2017
> >  Contact:   "Chao Yu" 
> >  Description:
> >  Controls current reserved blocks in system.
> > +
> > +What:  /sys/fs/f2fs//gc_urgent
> > +Date:  August 2017
> > +Contact:   "Jaegeuk Kim" 
> > +Description:
> > +Do background GC agressively
> > +
> > +What:  /sys/fs/f2fs//gc_urgent_sleep_time
> > +Date:  August 2017
> > +Contact:   "Jaegeuk Kim" 
> > +Description:
> > +Controls sleep time of GC urgent mode
> > diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> > index 620dca443b29..8da7c14a9d29 100644
> > --- a/fs/f2fs/gc.c
> > +++ b/fs/f2fs/gc.c
> > @@ -35,9 +35,14 @@ static int gc_thread_func(void *data)
> > set_freezable();
> > do {
> > wait_event_interruptible_timeout(*wq,
> > -   kthread_should_stop() || freezing(current),
> > +   kthread_should_stop() || freezing(current) ||
> > +   gc_th->gc_wake,
> > msecs_to_jiffies(wait_ms));
> >  
> > +   /* give it a try one time */
> > +   if (gc_th->gc_wake)
> > +   gc_th->gc_wake = 0;
> > +
> > if (try_to_freeze())
> > continue;
> > if (kthread_should_stop())
> > @@ -74,6 +79,11 @@ static int gc_thread_func(void *data)
> > if (!mutex_trylock(&sbi->gc_mutex))
> > goto next;
> >  
> > +   if (gc_th->gc_urgent) {
> > +   wait_ms = gc_th->urgent_sleep_time;
> > +   goto do_gc;
> > +   }
> > +
> > if (!is_idle(sbi)) {
> > increase_sleep_time(gc_th, &wait_ms);
> > mutex_unlock(&sbi->gc_mutex);
> > @@ -84,7 +94,7 @@ static int gc_thread_func(void *data)
> > decrease_sleep_time(gc_th, &wait_ms);
> > else
> > increase_sleep_time(gc_th, &wait_ms);
> > -
> > +do_gc:
> > stat_inc_bggc_count(sbi);
> >  
> > /* if return value is not zero, no victim was selected */
> > @@ -115,11 +125,14 @@ int start_gc_thread(struct f2fs_sb_info *sbi)
> > goto out;
> > }
> >  
> > +   gc_th->urgent_sleep_time = DEF_GC_THREAD_URGENT_SLEEP_TIME;
> > gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
> > gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
> > gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
> >  
> > gc_th->gc_idle = 0;
> > +   gc_th->gc_urgent = 0;
> > +   gc_th->gc_wake= 0;
> >  
> > sbi->gc_thread = gc_th;
> > init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);
> > diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h
> > index a993967dcdb9..57a9000ce3af 100644
> > --- a/fs/f2fs/gc.h
> > +++ b/fs/f2fs/gc.h
> > @@ -13,6 +13,7 @@
> >  * whether IO subsystem is idle
> >  * or not
> >  */
> > +#define DEF_GC_THREAD_URGENT_SLEEP_TIME500 /* 500 ms */
> >  #define DEF_GC_THREAD_MIN_SLEEP_TIME   3   /* milliseconds */
> >  #define DEF_GC_THREAD_MAX_SLEEP_TIME   6
> >  #define DEF_GC_THREAD_NOGC_SLEEP_TIME  30  /* wait 5 min */
> > @@ -27,12 +28,15 @@ struct f2fs_gc_kthread {
> >

Re: [f2fs-dev] [PATCH 2/2] f2fs: introduce gc_urgent mode for background GC

2017-08-07 Thread Chao Yu
Hi Jaegeuk,

On 2017/8/8 9:42, Jaegeuk Kim wrote:
> This patch adds a sysfs entry to control urgent mode for background GC.
> If this is set, background GC thread conducts GC with gc_urgent_sleep_time
> all the time.

Good idea.

If we want to add more gc policy, current approach is not friendly to be
extended, and sysfs nodes are also become more and more, it's not friendly to
user. So I'd like to suggest adding /sys/fs/f2fs//gc_policy only, and
exposing original policy as normal_mode, and then introduce urgent_mode and
reuse gc_min_sleep_time as gc_urgent_sleep_time in this patch.

e.g.

enum gc_policy {
GC_NORMAL,
GC_URGENT,
};

If we want to turn on urgent_mode, we could:
echo 1 > /sys/fs/f2fs//gc_policy
echo 1000 > /sys/fs/f2fs//gc_min_sleep_time

How do you think?

Thanks,

> 
> Signed-off-by: Jaegeuk Kim 
> ---
>  Documentation/ABI/testing/sysfs-fs-f2fs | 12 
>  fs/f2fs/gc.c| 17 +++--
>  fs/f2fs/gc.h|  4 
>  fs/f2fs/sysfs.c |  9 +
>  4 files changed, 40 insertions(+), 2 deletions(-)
> 
> diff --git a/Documentation/ABI/testing/sysfs-fs-f2fs 
> b/Documentation/ABI/testing/sysfs-fs-f2fs
> index c579ce5e0ef5..11b7f4ebea7c 100644
> --- a/Documentation/ABI/testing/sysfs-fs-f2fs
> +++ b/Documentation/ABI/testing/sysfs-fs-f2fs
> @@ -139,3 +139,15 @@ Date:June 2017
>  Contact: "Chao Yu" 
>  Description:
>Controls current reserved blocks in system.
> +
> +What:/sys/fs/f2fs//gc_urgent
> +Date:August 2017
> +Contact: "Jaegeuk Kim" 
> +Description:
> +  Do background GC agressively
> +
> +What:/sys/fs/f2fs//gc_urgent_sleep_time
> +Date:August 2017
> +Contact: "Jaegeuk Kim" 
> +Description:
> +  Controls sleep time of GC urgent mode
> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c
> index 620dca443b29..8da7c14a9d29 100644
> --- a/fs/f2fs/gc.c
> +++ b/fs/f2fs/gc.c
> @@ -35,9 +35,14 @@ static int gc_thread_func(void *data)
>   set_freezable();
>   do {
>   wait_event_interruptible_timeout(*wq,
> - kthread_should_stop() || freezing(current),
> + kthread_should_stop() || freezing(current) ||
> + gc_th->gc_wake,
>   msecs_to_jiffies(wait_ms));
>  
> + /* give it a try one time */
> + if (gc_th->gc_wake)
> + gc_th->gc_wake = 0;
> +
>   if (try_to_freeze())
>   continue;
>   if (kthread_should_stop())
> @@ -74,6 +79,11 @@ static int gc_thread_func(void *data)
>   if (!mutex_trylock(&sbi->gc_mutex))
>   goto next;
>  
> + if (gc_th->gc_urgent) {
> + wait_ms = gc_th->urgent_sleep_time;
> + goto do_gc;
> + }
> +
>   if (!is_idle(sbi)) {
>   increase_sleep_time(gc_th, &wait_ms);
>   mutex_unlock(&sbi->gc_mutex);
> @@ -84,7 +94,7 @@ static int gc_thread_func(void *data)
>   decrease_sleep_time(gc_th, &wait_ms);
>   else
>   increase_sleep_time(gc_th, &wait_ms);
> -
> +do_gc:
>   stat_inc_bggc_count(sbi);
>  
>   /* if return value is not zero, no victim was selected */
> @@ -115,11 +125,14 @@ int start_gc_thread(struct f2fs_sb_info *sbi)
>   goto out;
>   }
>  
> + gc_th->urgent_sleep_time = DEF_GC_THREAD_URGENT_SLEEP_TIME;
>   gc_th->min_sleep_time = DEF_GC_THREAD_MIN_SLEEP_TIME;
>   gc_th->max_sleep_time = DEF_GC_THREAD_MAX_SLEEP_TIME;
>   gc_th->no_gc_sleep_time = DEF_GC_THREAD_NOGC_SLEEP_TIME;
>  
>   gc_th->gc_idle = 0;
> + gc_th->gc_urgent = 0;
> + gc_th->gc_wake= 0;
>  
>   sbi->gc_thread = gc_th;
>   init_waitqueue_head(&sbi->gc_thread->gc_wait_queue_head);
> diff --git a/fs/f2fs/gc.h b/fs/f2fs/gc.h
> index a993967dcdb9..57a9000ce3af 100644
> --- a/fs/f2fs/gc.h
> +++ b/fs/f2fs/gc.h
> @@ -13,6 +13,7 @@
>* whether IO subsystem is idle
>* or not
>*/
> +#define DEF_GC_THREAD_URGENT_SLEEP_TIME  500 /* 500 ms */
>  #define DEF_GC_THREAD_MIN_SLEEP_TIME 3   /* milliseconds */
>  #define DEF_GC_THREAD_MAX_SLEEP_TIME 6
>  #define DEF_GC_THREAD_NOGC_SLEEP_TIME30  /* wait 5 min */
> @@ -27,12 +28,15 @@ struct f2fs_gc_kthread {
>   wait_queue_head_t gc_wait_queue_head;
>  
>   /* for gc sleep time */
> + unsigned int urgent_sleep_time;
>   unsigned int min_sleep_time;
>   unsigned int max_sleep_time;
>   unsigned int no_gc_sleep_time;
>  
>   /* for changing gc mode */
>   unsigned int gc_idle;