linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] lightnvm: pblk: fix changing GC group list for a line
@ 2017-09-28 14:40 Rakesh Pandit
  2017-10-02 11:27 ` Javier González
  0 siblings, 1 reply; 4+ messages in thread
From: Rakesh Pandit @ 2017-09-28 14:40 UTC (permalink / raw)
  To: Matias Bjørling, linux-block, linux-kernel; +Cc: Javier González

pblk_line_gc_list seems to had a bug since the introduction of pblk in
getting GC list for a line.  In b20ba1bc7 while redesigning GC
algorithm it was not fixed correctly.  The problem is that even if
valid sector count (vsc) is less that mid_thrs (threshold for GC mid
list) it would always satisfy 'vsc < high_thrs' as high_thrs >
mid_thrs always.

Fixes: a4bd217b4("lightnvm: physical block device (pblk) target")
Signed-off-by: Rakesh Pandit <rakesh@tuxera.com>
---
 drivers/lightnvm/pblk-core.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 8150164..93a58ed 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -295,16 +295,16 @@ struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line)
 			line->gc_group = PBLK_LINEGC_FULL;
 			move_list = &l_mg->gc_full_list;
 		}
-	} else if (vsc < lm->high_thrs) {
-		if (line->gc_group != PBLK_LINEGC_HIGH) {
-			line->gc_group = PBLK_LINEGC_HIGH;
-			move_list = &l_mg->gc_high_list;
-		}
 	} else if (vsc < lm->mid_thrs) {
 		if (line->gc_group != PBLK_LINEGC_MID) {
 			line->gc_group = PBLK_LINEGC_MID;
 			move_list = &l_mg->gc_mid_list;
 		}
+	} else if (vsc < lm->high_thrs) {
+		if (line->gc_group != PBLK_LINEGC_HIGH) {
+			line->gc_group = PBLK_LINEGC_HIGH;
+			move_list = &l_mg->gc_high_list;
+		}
 	} else if (vsc < line->sec_in_line) {
 		if (line->gc_group != PBLK_LINEGC_LOW) {
 			line->gc_group = PBLK_LINEGC_LOW;
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] lightnvm: pblk: fix changing GC group list for a line
  2017-09-28 14:40 [PATCH] lightnvm: pblk: fix changing GC group list for a line Rakesh Pandit
@ 2017-10-02 11:27 ` Javier González
  2017-10-02 11:43   ` Rakesh Pandit
  0 siblings, 1 reply; 4+ messages in thread
From: Javier González @ 2017-10-02 11:27 UTC (permalink / raw)
  To: Rakesh Pandit; +Cc: Matias Bjørling, linux-block, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2768 bytes --]

> On 28 Sep 2017, at 16.40, Rakesh Pandit <rakesh@tuxera.com> wrote:
> 
> pblk_line_gc_list seems to had a bug since the introduction of pblk in
> getting GC list for a line.  In b20ba1bc7 while redesigning GC
> algorithm it was not fixed correctly.  The problem is that even if
> valid sector count (vsc) is less that mid_thrs (threshold for GC mid
> list) it would always satisfy 'vsc < high_thrs' as high_thrs >
> mid_thrs always.
> 
> Fixes: a4bd217b4("lightnvm: physical block device (pblk) target")
> Signed-off-by: Rakesh Pandit <rakesh@tuxera.com>
> ---
> drivers/lightnvm/pblk-core.c | 10 +++++-----
> 1 file changed, 5 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
> index 8150164..93a58ed 100644
> --- a/drivers/lightnvm/pblk-core.c
> +++ b/drivers/lightnvm/pblk-core.c
> @@ -295,16 +295,16 @@ struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line)
> 			line->gc_group = PBLK_LINEGC_FULL;
> 			move_list = &l_mg->gc_full_list;
> 		}
> -	} else if (vsc < lm->high_thrs) {
> -		if (line->gc_group != PBLK_LINEGC_HIGH) {
> -			line->gc_group = PBLK_LINEGC_HIGH;
> -			move_list = &l_mg->gc_high_list;
> -		}
> 	} else if (vsc < lm->mid_thrs) {
> 		if (line->gc_group != PBLK_LINEGC_MID) {
> 			line->gc_group = PBLK_LINEGC_MID;
> 			move_list = &l_mg->gc_mid_list;
> 		}
> +	} else if (vsc < lm->high_thrs) {
> +		if (line->gc_group != PBLK_LINEGC_HIGH) {
> +			line->gc_group = PBLK_LINEGC_HIGH;
> +			move_list = &l_mg->gc_high_list;
> +		}
> 	} else if (vsc < line->sec_in_line) {
> 		if (line->gc_group != PBLK_LINEGC_LOW) {
> 			line->gc_group = PBLK_LINEGC_LOW;
> --
> 2.9.3

You're right that the naming for high/mid/low was not updated when
aligning vsc with GC thresholds. But the fix should be making high,
being high, instead of reordering when moving into the GC bucket.

Does it make sense to you?

diff --git i/drivers/lightnvm/pblk-init.c w/drivers/lightnvm/pblk-init.c
index 7cf4b536d899..bc5c6cc12ad5 100644
--- i/drivers/lightnvm/pblk-init.c
+++ w/drivers/lightnvm/pblk-init.c
@@ -675,8 +675,8 @@ static int pblk_lines_init(struct pblk *pblk)
        lm->blk_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long);
        lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long);
        lm->lun_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long);
-       lm->high_thrs = lm->sec_per_line / 2;
-       lm->mid_thrs = lm->sec_per_line / 4;
+       lm->high_thrs = lm->sec_per_line / 4;
+       lm->mid_thrs = lm->sec_per_line / 2;
        lm->meta_distance = (geo->nr_luns / 2) * pblk->min_write_pgs;

        /* Calculate necessary pages for smeta. See comment over struct

[-- Attachment #2: Message signed with OpenPGP --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH] lightnvm: pblk: fix changing GC group list for a line
  2017-10-02 11:27 ` Javier González
@ 2017-10-02 11:43   ` Rakesh Pandit
  2017-10-02 11:44     ` Javier González
  0 siblings, 1 reply; 4+ messages in thread
From: Rakesh Pandit @ 2017-10-02 11:43 UTC (permalink / raw)
  To: Javier González; +Cc: Matias Bjørling, linux-block, linux-kernel

On Mon, Oct 02, 2017 at 01:27:42PM +0200, Javier González wrote:
> > On 28 Sep 2017, at 16.40, Rakesh Pandit <rakesh@tuxera.com> wrote:
> > 
> > pblk_line_gc_list seems to had a bug since the introduction of pblk in
> > getting GC list for a line.  In b20ba1bc7 while redesigning GC
> > algorithm it was not fixed correctly.  The problem is that even if
> > valid sector count (vsc) is less that mid_thrs (threshold for GC mid
> > list) it would always satisfy 'vsc < high_thrs' as high_thrs >
> > mid_thrs always.
> > 
> > Fixes: a4bd217b4("lightnvm: physical block device (pblk) target")
> > Signed-off-by: Rakesh Pandit <rakesh@tuxera.com>
> > ---
> > drivers/lightnvm/pblk-core.c | 10 +++++-----
> > 1 file changed, 5 insertions(+), 5 deletions(-)
> > 
> > diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
> > index 8150164..93a58ed 100644
> > --- a/drivers/lightnvm/pblk-core.c
> > +++ b/drivers/lightnvm/pblk-core.c
> > @@ -295,16 +295,16 @@ struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line)
> > 			line->gc_group = PBLK_LINEGC_FULL;
> > 			move_list = &l_mg->gc_full_list;
> > 		}
> > -	} else if (vsc < lm->high_thrs) {
> > -		if (line->gc_group != PBLK_LINEGC_HIGH) {
> > -			line->gc_group = PBLK_LINEGC_HIGH;
> > -			move_list = &l_mg->gc_high_list;
> > -		}
> > 	} else if (vsc < lm->mid_thrs) {
> > 		if (line->gc_group != PBLK_LINEGC_MID) {
> > 			line->gc_group = PBLK_LINEGC_MID;
> > 			move_list = &l_mg->gc_mid_list;
> > 		}
> > +	} else if (vsc < lm->high_thrs) {
> > +		if (line->gc_group != PBLK_LINEGC_HIGH) {
> > +			line->gc_group = PBLK_LINEGC_HIGH;
> > +			move_list = &l_mg->gc_high_list;
> > +		}
> > 	} else if (vsc < line->sec_in_line) {
> > 		if (line->gc_group != PBLK_LINEGC_LOW) {
> > 			line->gc_group = PBLK_LINEGC_LOW;
> > --
> > 2.9.3
> 
> You're right that the naming for high/mid/low was not updated when
> aligning vsc with GC thresholds. But the fix should be making high,
> being high, instead of reordering when moving into the GC bucket.
> 
> Does it make sense to you?

Yes.

> 
> diff --git i/drivers/lightnvm/pblk-init.c w/drivers/lightnvm/pblk-init.c
> index 7cf4b536d899..bc5c6cc12ad5 100644
> --- i/drivers/lightnvm/pblk-init.c
> +++ w/drivers/lightnvm/pblk-init.c
> @@ -675,8 +675,8 @@ static int pblk_lines_init(struct pblk *pblk)
>         lm->blk_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long);
>         lm->sec_bitmap_len = BITS_TO_LONGS(lm->sec_per_line) * sizeof(long);
>         lm->lun_bitmap_len = BITS_TO_LONGS(geo->nr_luns) * sizeof(long);
> -       lm->high_thrs = lm->sec_per_line / 2;
> -       lm->mid_thrs = lm->sec_per_line / 4;
> +       lm->high_thrs = lm->sec_per_line / 4;
> +       lm->mid_thrs = lm->sec_per_line / 2;
>         lm->meta_distance = (geo->nr_luns / 2) * pblk->min_write_pgs;
> 
>         /* Calculate necessary pages for smeta. See comment over struct

Regards,

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] lightnvm: pblk: fix changing GC group list for a line
  2017-10-02 11:43   ` Rakesh Pandit
@ 2017-10-02 11:44     ` Javier González
  0 siblings, 0 replies; 4+ messages in thread
From: Javier González @ 2017-10-02 11:44 UTC (permalink / raw)
  To: Rakesh Pandit; +Cc: Matias Bjørling, linux-block, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 2267 bytes --]

> On 2 Oct 2017, at 13.43, Rakesh Pandit <rakesh@tuxera.com> wrote:
> 
> On Mon, Oct 02, 2017 at 01:27:42PM +0200, Javier González wrote:
>>> On 28 Sep 2017, at 16.40, Rakesh Pandit <rakesh@tuxera.com> wrote:
>>> 
>>> pblk_line_gc_list seems to had a bug since the introduction of pblk in
>>> getting GC list for a line.  In b20ba1bc7 while redesigning GC
>>> algorithm it was not fixed correctly.  The problem is that even if
>>> valid sector count (vsc) is less that mid_thrs (threshold for GC mid
>>> list) it would always satisfy 'vsc < high_thrs' as high_thrs >
>>> mid_thrs always.
>>> 
>>> Fixes: a4bd217b4("lightnvm: physical block device (pblk) target")
>>> Signed-off-by: Rakesh Pandit <rakesh@tuxera.com>
>>> ---
>>> drivers/lightnvm/pblk-core.c | 10 +++++-----
>>> 1 file changed, 5 insertions(+), 5 deletions(-)
>>> 
>>> diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
>>> index 8150164..93a58ed 100644
>>> --- a/drivers/lightnvm/pblk-core.c
>>> +++ b/drivers/lightnvm/pblk-core.c
>>> @@ -295,16 +295,16 @@ struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line)
>>> 			line->gc_group = PBLK_LINEGC_FULL;
>>> 			move_list = &l_mg->gc_full_list;
>>> 		}
>>> -	} else if (vsc < lm->high_thrs) {
>>> -		if (line->gc_group != PBLK_LINEGC_HIGH) {
>>> -			line->gc_group = PBLK_LINEGC_HIGH;
>>> -			move_list = &l_mg->gc_high_list;
>>> -		}
>>> 	} else if (vsc < lm->mid_thrs) {
>>> 		if (line->gc_group != PBLK_LINEGC_MID) {
>>> 			line->gc_group = PBLK_LINEGC_MID;
>>> 			move_list = &l_mg->gc_mid_list;
>>> 		}
>>> +	} else if (vsc < lm->high_thrs) {
>>> +		if (line->gc_group != PBLK_LINEGC_HIGH) {
>>> +			line->gc_group = PBLK_LINEGC_HIGH;
>>> +			move_list = &l_mg->gc_high_list;
>>> +		}
>>> 	} else if (vsc < line->sec_in_line) {
>>> 		if (line->gc_group != PBLK_LINEGC_LOW) {
>>> 			line->gc_group = PBLK_LINEGC_LOW;
>>> --
>>> 2.9.3
>> 
>> You're right that the naming for high/mid/low was not updated when
>> aligning vsc with GC thresholds. But the fix should be making high,
>> being high, instead of reordering when moving into the GC bucket.
>> 
>> Does it make sense to you?
> 
> Yes.
> 

Cool. I'll fix it when picking it up.

Javier

[-- Attachment #2: Message signed with OpenPGP --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-10-02 11:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-28 14:40 [PATCH] lightnvm: pblk: fix changing GC group list for a line Rakesh Pandit
2017-10-02 11:27 ` Javier González
2017-10-02 11:43   ` Rakesh Pandit
2017-10-02 11:44     ` Javier González

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).