Commit 30dc9d9c authored by Li Ruilin's avatar Li Ruilin Committed by Zheng Zengkai
Browse files

bcache: provide a switch to bypass all IO requests

euleros inclusion
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/I4LOJ6


CVE: NA

------------------------------

provide a switch named read_bypass. If enbale, all IO requests will
bypass the cache. This option could be useful when we enable userspace
prefetch and the cache device is low capacity.

Signed-off-by: default avatarLi Ruilin <liruilin4@huawei.com>
Reviewed-by: default avatarLuan Jianhai <luanjianhai@huawei.com>
Reviewed-by: default avatarPeng Junyi <pengjunyi1@huawei.com>
Acked-by: default avatarXie Xiuqi <xiexiuqi@huawei.com>
Signed-off-by: default avatarCheng Jian <cj.chengjian@huawei.com>
Reviewed-by: default avatarGuangxing Deng <dengguangxing@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Reviewed-by: default avatarchao song <chao.song@huawei.com>
Signed-off-by: default avatarZheng Zengkai <zhengzengkai@huawei.com>
parent a460ae11
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -441,6 +441,10 @@ sequential_cutoff
  most recent 128 IOs are tracked so sequential IO can be detected even when
  it isn't all done at once.

read_bypass
  If enbale, all IO will bypass the cache. This option could be useful when we
  enable userspace prefetch and the cache device is low capacity.

sequential_merge
  If non zero, bcache keeps a list of the last 128 requests submitted to compare
  against all new requests to determine which new requests are sequential
+2 −0
Original line number Diff line number Diff line
@@ -376,6 +376,8 @@ struct cached_dev {
	unsigned char		writeback_percent;
	unsigned int		writeback_delay;

	unsigned int		read_bypass;

	uint64_t		writeback_rate_target;
	int64_t			writeback_rate_proportional;
	int64_t			writeback_rate_integral;
+4 −2
Original line number Diff line number Diff line
@@ -852,7 +852,7 @@ static void cached_dev_read_done(struct closure *cl)
	if (!s->prefetch)
		bio_complete(s);

	if (s->iop.bio &&
	if (s->iop.bio && (!dc->read_bypass || s->prefetch) &&
	    !test_bit(CACHE_SET_STOPPING, &s->iop.c->flags)) {
		BUG_ON(!s->iop.replace);
		closure_call(&s->iop.cl, bch_data_insert, NULL, cl);
@@ -897,12 +897,14 @@ static int cached_dev_cache_miss(struct btree *b, struct search *s,

	s->cache_missed = 1;

	if (s->cache_miss || s->iop.bypass) {
	if (s->cache_miss || s->iop.bypass ||
	    (dc->read_bypass && !s->prefetch)) {
		miss = bio_next_split(bio, sectors, GFP_NOIO, &s->d->bio_split);
		ret = miss == bio ? MAP_DONE : MAP_CONTINUE;
		goto out_submit;
	}

	/* if called form do_readahead, no need to do this */
	if (!(bio->bi_opf & REQ_RAHEAD) &&
	    !(bio->bi_opf & (REQ_META|REQ_PRIO) ) &&
	    s->iop.c->gc_stats.in_use < CUTOFF_CACHE_READA &&
+1 −0
Original line number Diff line number Diff line
@@ -1439,6 +1439,7 @@ static int cached_dev_init(struct cached_dev *dc, unsigned int block_size)
	bch_cache_accounting_init(&dc->accounting, &dc->disk.cl);

	dc->sequential_cutoff		= 4 << 20;
	dc->read_bypass			= 0;

	for (io = dc->io; io < dc->io + RECENT_IO; io++) {
		list_add(&io->lru, &dc->io_lru);
+6 −0
Original line number Diff line number Diff line
@@ -108,6 +108,7 @@ rw_attribute(congested_read_threshold_us);
rw_attribute(congested_write_threshold_us);

rw_attribute(sequential_cutoff);
rw_attribute(read_bypass);
rw_attribute(data_csum);
rw_attribute(cache_mode);
rw_attribute(readahead_cache_policy);
@@ -252,6 +253,7 @@ SHOW(__bch_cached_dev)
	var_printf(partial_stripes_expensive,	"%u");

	var_hprint(sequential_cutoff);
	var_print(read_bypass);
	var_hprint(readahead);

	sysfs_print(running,		atomic_read(&dc->running));
@@ -346,6 +348,9 @@ STORE(__cached_dev)
	sysfs_strtoul_clamp(sequential_cutoff,
			    dc->sequential_cutoff,
			    0, UINT_MAX);
	sysfs_strtoul_clamp(read_bypass,
			    dc->read_bypass,
			    0, 1);
	d_strtoi_h(readahead);

	if (attr == &sysfs_clear_stats)
@@ -511,6 +516,7 @@ static struct attribute *bch_cached_dev_files[] = {
	&sysfs_stripe_size,
	&sysfs_partial_stripes_expensive,
	&sysfs_sequential_cutoff,
	&sysfs_read_bypass,
	&sysfs_clear_stats,
	&sysfs_running,
	&sysfs_state,