linux-bcache.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Coly Li <colyli@suse.de>
To: Hannes Reinecke <hare@suse.de>, Guoju Fang <fangguoju@gmail.com>
Cc: linux-bcache@vger.kernel.org, linux-block@vger.kernel.org
Subject: Re: [PATCH] bcache: add a new sysfs interface to disable refill when read miss
Date: Tue, 14 Jul 2020 14:20:45 +0800	[thread overview]
Message-ID: <7f52be25-3bcd-17b9-b9a7-219820d71c17@suse.de> (raw)
In-Reply-To: <141fbeaf-8fb6-43fb-56ed-5f8a5a019cc7@suse.de>

On 2020/7/14 13:57, Hannes Reinecke wrote:
> On 7/13/20 5:28 AM, Guoju Fang wrote:
>> When read cache miss, backing device will be read first, and then refill
>> the cache device. But under some scenarios there are large number of new
>> reads and rarely hit, so it's necessary to disable the refill when read
>> miss to save space for writes.
>>
>> This patch add a new config called refill_on_miss_disabled which is
>> not set
>> by default. Bcache user can set it by sysfs interface and then the bcache
>> device will not refill when read cache miss.
>>
>> Signed-off-by: Guoju Fang <fangguoju@gmail.com>
>> ---
>>   drivers/md/bcache/bcache.h  | 1 +
>>   drivers/md/bcache/request.c | 2 ++
>>   drivers/md/bcache/super.c   | 1 +
>>   drivers/md/bcache/sysfs.c   | 5 +++++
>>   4 files changed, 9 insertions(+)
>>
>> diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
>> index 221e0191b687..3a19ee6de3a7 100644
>> --- a/drivers/md/bcache/bcache.h
>> +++ b/drivers/md/bcache/bcache.h
>> @@ -730,6 +730,7 @@ struct cache_set {
>>       unsigned int        shrinker_disabled:1;
>>       unsigned int        copy_gc_enabled:1;
>>       unsigned int        idle_max_writeback_rate_enabled:1;
>> +    unsigned int        refill_on_miss_disabled:1;
>>     #define BUCKET_HASH_BITS    12
>>       struct hlist_head    bucket_hash[1 << BUCKET_HASH_BITS];
>> diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
>> index 7acf024e99f3..4bfa0e0b4b3f 100644
>> --- a/drivers/md/bcache/request.c
>> +++ b/drivers/md/bcache/request.c
>> @@ -378,6 +378,8 @@ static bool check_should_bypass(struct cached_dev
>> *dc, struct bio *bio)
>>            op_is_write(bio_op(bio))))
>>           goto skip;
>>   +    if (c->refill_on_miss_disabled && !op_is_write(bio_op(bio)))
>> +        goto skip;
>>       /*
>>        * If the bio is for read-ahead or background IO, bypass it or
>>        * not depends on the following situations,
>> diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
>> index 2014016f9a60..c1e9bfec1267 100644
>> --- a/drivers/md/bcache/super.c
>> +++ b/drivers/md/bcache/super.c
>> @@ -1862,6 +1862,7 @@ struct cache_set *bch_cache_set_alloc(struct
>> cache_sb *sb)
>>       c->congested_write_threshold_us    = 20000;
>>       c->error_limit    = DEFAULT_IO_ERROR_LIMIT;
>>       c->idle_max_writeback_rate_enabled = 1;
>> +    c->refill_on_miss_disabled = 0;
>>       WARN_ON(test_and_clear_bit(CACHE_SET_IO_DISABLE, &c->flags));
>>         return c;
>> diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c
>> index 0dadec5a78f6..178300f401bb 100644
>> --- a/drivers/md/bcache/sysfs.c
>> +++ b/drivers/md/bcache/sysfs.c
>> @@ -144,6 +144,7 @@ rw_attribute(copy_gc_enabled);
>>   rw_attribute(idle_max_writeback_rate);
>>   rw_attribute(gc_after_writeback);
>>   rw_attribute(size);
>> +rw_attribute(refill_on_miss_disabled);
>>     static ssize_t bch_snprint_string_list(char *buf,
>>                          size_t size,
>> @@ -779,6 +780,8 @@ SHOW(__bch_cache_set)
>>       if (attr == &sysfs_bset_tree_stats)
>>           return bch_bset_print_stats(c, buf);
>>   +    sysfs_printf(refill_on_miss_disabled, "%i",
>> c->refill_on_miss_disabled);
>> +
>>       return 0;
>>   }
>>   SHOW_LOCKED(bch_cache_set)
>> @@ -898,6 +901,7 @@ STORE(__bch_cache_set)
>>        * set in next chance.
>>        */
>>       sysfs_strtoul_clamp(gc_after_writeback, c->gc_after_writeback,
>> 0, 1);
>> +    sysfs_strtoul(refill_on_miss_disabled, c->refill_on_miss_disabled);
>>         return size;
>>   }
>> @@ -948,6 +952,7 @@ static struct attribute *bch_cache_set_files[] = {
>>       &sysfs_congested_read_threshold_us,
>>       &sysfs_congested_write_threshold_us,
>>       &sysfs_clear_stats,
>> +    &sysfs_refill_on_miss_disabled,
>>       NULL
>>   };
>>   KTYPE(bch_cache_set);
>>

Hi Hannes,

> Please don't call the attribute refill_on_miss_disabled.
> This kind of double-negation will always lead to issues; please invert
> the meaning and call it 'refill_on_miss'.

The original purpose is to implement a "write-only" or "read-around"
like cache. Such kind of cache model is desired for heavy write
condition, and disable the read-miss-refill may also help to extend the
SSD life time.

Naming is a challenge here. Becuase "write-only" is not true while read
hitting on dirty data on cache device may successfully return, and
"read-around" is also not true due to the same reason.

We do need help for people to suggest a proper mode for such cache mode,
or cache configuration (if we don't want one more cache mode).

Thanks.

Coly Li

      reply	other threads:[~2020-07-14  6:20 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-13  3:28 [PATCH] bcache: add a new sysfs interface to disable refill when read miss Guoju Fang
2020-07-14  5:57 ` Hannes Reinecke
2020-07-14  6:20   ` Coly Li [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7f52be25-3bcd-17b9-b9a7-219820d71c17@suse.de \
    --to=colyli@suse.de \
    --cc=fangguoju@gmail.com \
    --cc=hare@suse.de \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-block@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).