diff mbox series

[09/14] bcache: use bucket index to set GC_MARK_METADATA for journal buckets in bch_btree_gc_finish()

Message ID 20210615054921.101421-10-colyli@suse.de (mailing list archive)
State New, archived
Headers show
Series bcache patches for Linux v5.14 | expand

Commit Message

Coly Li June 15, 2021, 5:49 a.m. UTC
Currently the meta data bucket locations on cache device are reserved
after the meta data stored on NVDIMM pages, for the meta data layout
consistentcy temporarily. So these buckets are still marked as meta data
by SET_GC_MARK() in bch_btree_gc_finish().

When BCH_FEATURE_INCOMPAT_NVDIMM_META is set, the sb.d[] stores linear
address of NVDIMM pages and not bucket index anymore. Therefore we
should avoid to find bucket index from sb.d[], and directly use bucket
index from ca->sb.first_bucket to (ca->sb.first_bucket +
ca->sb.njournal_bucketsi) for setting the gc mark of journal bucket.

Signed-off-by: Coly Li <colyli@suse.de>
Cc: Jianpeng Ma <jianpeng.ma@intel.com>
Cc: Qiaowei Ren <qiaowei.ren@intel.com>
---
 drivers/md/bcache/btree.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Hannes Reinecke June 22, 2021, 10:55 a.m. UTC | #1
On 6/15/21 7:49 AM, Coly Li wrote:
> Currently the meta data bucket locations on cache device are reserved
> after the meta data stored on NVDIMM pages, for the meta data layout
> consistentcy temporarily. So these buckets are still marked as meta data
> by SET_GC_MARK() in bch_btree_gc_finish().
> 
> When BCH_FEATURE_INCOMPAT_NVDIMM_META is set, the sb.d[] stores linear
> address of NVDIMM pages and not bucket index anymore. Therefore we
> should avoid to find bucket index from sb.d[], and directly use bucket
> index from ca->sb.first_bucket to (ca->sb.first_bucket +
> ca->sb.njournal_bucketsi) for setting the gc mark of journal bucket.
> 
> Signed-off-by: Coly Li <colyli@suse.de>
> Cc: Jianpeng Ma <jianpeng.ma@intel.com>
> Cc: Qiaowei Ren <qiaowei.ren@intel.com>
> ---
>  drivers/md/bcache/btree.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
> index 183a58c89377..e0d7135669ca 100644
> --- a/drivers/md/bcache/btree.c
> +++ b/drivers/md/bcache/btree.c
> @@ -1761,8 +1761,10 @@ static void bch_btree_gc_finish(struct cache_set *c)
>  	ca = c->cache;
>  	ca->invalidate_needs_gc = 0;
>  
> -	for (k = ca->sb.d; k < ca->sb.d + ca->sb.keys; k++)
> -		SET_GC_MARK(ca->buckets + *k, GC_MARK_METADATA);
> +	/* Range [first_bucket, first_bucket + keys) is for journal buckets */
> +	for (i = ca->sb.first_bucket;
> +	     i < ca->sb.first_bucket + ca->sb.njournal_buckets; i++)
> +		SET_GC_MARK(ca->buckets + i, GC_MARK_METADATA);
>  
>  	for (k = ca->prio_buckets;
>  	     k < ca->prio_buckets + prio_buckets(ca) * 2; k++)
> 
Reviewed-by: Hannes Reinecke <hare@suse.de>

Cheers,

Hannes
Coly Li June 23, 2021, 6:09 a.m. UTC | #2
On 6/22/21 6:55 PM, Hannes Reinecke wrote:
> On 6/15/21 7:49 AM, Coly Li wrote:
>> Currently the meta data bucket locations on cache device are reserved
>> after the meta data stored on NVDIMM pages, for the meta data layout
>> consistentcy temporarily. So these buckets are still marked as meta data
>> by SET_GC_MARK() in bch_btree_gc_finish().
>>
>> When BCH_FEATURE_INCOMPAT_NVDIMM_META is set, the sb.d[] stores linear
>> address of NVDIMM pages and not bucket index anymore. Therefore we
>> should avoid to find bucket index from sb.d[], and directly use bucket
>> index from ca->sb.first_bucket to (ca->sb.first_bucket +
>> ca->sb.njournal_bucketsi) for setting the gc mark of journal bucket.
>>
>> Signed-off-by: Coly Li <colyli@suse.de>
>> Cc: Jianpeng Ma <jianpeng.ma@intel.com>
>> Cc: Qiaowei Ren <qiaowei.ren@intel.com>
>> ---
>>  drivers/md/bcache/btree.c | 6 ++++--
>>  1 file changed, 4 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
>> index 183a58c89377..e0d7135669ca 100644
>> --- a/drivers/md/bcache/btree.c
>> +++ b/drivers/md/bcache/btree.c
>> @@ -1761,8 +1761,10 @@ static void bch_btree_gc_finish(struct cache_set *c)
>>  	ca = c->cache;
>>  	ca->invalidate_needs_gc = 0;
>>  
>> -	for (k = ca->sb.d; k < ca->sb.d + ca->sb.keys; k++)
>> -		SET_GC_MARK(ca->buckets + *k, GC_MARK_METADATA);
>> +	/* Range [first_bucket, first_bucket + keys) is for journal buckets */
>> +	for (i = ca->sb.first_bucket;
>> +	     i < ca->sb.first_bucket + ca->sb.njournal_buckets; i++)
>> +		SET_GC_MARK(ca->buckets + i, GC_MARK_METADATA);
>>  
>>  	for (k = ca->prio_buckets;
>>  	     k < ca->prio_buckets + prio_buckets(ca) * 2; k++)
>>
> Reviewed-by: Hannes Reinecke <hare@suse.de>

Thanks for your review.

Coly Li
diff mbox series

Patch

diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 183a58c89377..e0d7135669ca 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -1761,8 +1761,10 @@  static void bch_btree_gc_finish(struct cache_set *c)
 	ca = c->cache;
 	ca->invalidate_needs_gc = 0;
 
-	for (k = ca->sb.d; k < ca->sb.d + ca->sb.keys; k++)
-		SET_GC_MARK(ca->buckets + *k, GC_MARK_METADATA);
+	/* Range [first_bucket, first_bucket + keys) is for journal buckets */
+	for (i = ca->sb.first_bucket;
+	     i < ca->sb.first_bucket + ca->sb.njournal_buckets; i++)
+		SET_GC_MARK(ca->buckets + i, GC_MARK_METADATA);
 
 	for (k = ca->prio_buckets;
 	     k < ca->prio_buckets + prio_buckets(ca) * 2; k++)