On Sun, 2 Jul 2017, Coly Li wrote: > On 2017/7/1 上午4:42, bcache@xxxxxxxxxxxxxxxxxx wrote: > > From: Eric Wheeler <git@xxxxxxxxxxxxxxxxxx> > > > > Bypass if: bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND) > > > > Writeback if: op_is_sync(bio->bi_opf) || bio->bi_opf & (REQ_META|REQ_PRIO) > > > > Hi Eric, > > Could you please explain a bit how the above policy is designed ? I'd > like to understand it more. Hi Coly, It is pretty trivial, all of the processing code exists already. This patch only adds to the existing functions for the constraints noted in the patch. What happens is this: cached_dev_make_request() in request.c takes the IO decides where the IO should go by using these two functions to decide whether a bio should writeback or bypass: check_should_bypass() and should_writeback() In check_should_bypass(), `if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND))` means bypass the cache because the bio has been flagged as a readahead or background IO (no sense in polluting cache in either case). Later, if the bio is a write, then cached_dev_write() checks should_writeback() In bio->bi_opf & (REQ_META|REQ_PRIO), it means writeback to cache. Some filesystems use REQ_META for metadata operations which are best to keep low-latency for high transactional performance. REQ_PRIO is a CFQ hint that the priority of the IO has been raised, so writeback is faster here. -- Eric Wheeler > > Thanks. > > Coly > > > > Signed-off-by: Eric Wheeler <bcache@xxxxxxxxxxxxxxxxxx> > > --- > > drivers/md/bcache/request.c | 3 +++ > > drivers/md/bcache/writeback.h | 3 ++- > > 2 files changed, 5 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c > > index a95609f..4629b0c 100644 > > --- a/drivers/md/bcache/request.c > > +++ b/drivers/md/bcache/request.c > > @@ -386,6 +386,9 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio) > > op_is_write(bio_op(bio)))) > > goto skip; > > > > + if (bio->bi_opf & (REQ_RAHEAD|REQ_BACKGROUND)) > > + goto skip; > > + > > /* If the ioprio already exists on the bio, use that. We assume that > > * the upper layer properly assigned the calling process's ioprio to > > * the bio being passed to bcache. Otherwise, use current's ioc. */ > > diff --git a/drivers/md/bcache/writeback.h b/drivers/md/bcache/writeback.h > > index cd82fe8..ea2f92e 100644 > > --- a/drivers/md/bcache/writeback.h > > +++ b/drivers/md/bcache/writeback.h > > @@ -81,7 +81,8 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio, > > return true; > > } > > > > - return op_is_sync(bio->bi_opf) || in_use <= CUTOFF_WRITEBACK; > > + return op_is_sync(bio->bi_opf) || bio->bi_opf & (REQ_META|REQ_PRIO) > > + || in_use <= CUTOFF_WRITEBACK; > > } > > > > static inline void bch_writeback_queue(struct cached_dev *dc) > > >