bcache: Better full stripe scanning
The old scanning-by-stripe code burned too much CPU, this should be better. Signed-off-by: Kent Overstreet <kmo@daterainc.com>
This commit is contained in:
@@ -14,22 +14,27 @@ static inline uint64_t bcache_dev_sectors_dirty(struct bcache_device *d)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline bool bcache_dev_stripe_dirty(struct bcache_device *d,
|
||||
static inline unsigned offset_to_stripe(struct bcache_device *d,
|
||||
uint64_t offset)
|
||||
{
|
||||
do_div(offset, d->stripe_size);
|
||||
return offset;
|
||||
}
|
||||
|
||||
static inline bool bcache_dev_stripe_dirty(struct cached_dev *dc,
|
||||
uint64_t offset,
|
||||
unsigned nr_sectors)
|
||||
{
|
||||
uint64_t stripe = offset;
|
||||
|
||||
do_div(stripe, d->stripe_size);
|
||||
unsigned stripe = offset_to_stripe(&dc->disk, offset);
|
||||
|
||||
while (1) {
|
||||
if (atomic_read(d->stripe_sectors_dirty + stripe))
|
||||
if (atomic_read(dc->disk.stripe_sectors_dirty + stripe))
|
||||
return true;
|
||||
|
||||
if (nr_sectors <= d->stripe_size)
|
||||
if (nr_sectors <= dc->disk.stripe_size)
|
||||
return false;
|
||||
|
||||
nr_sectors -= d->stripe_size;
|
||||
nr_sectors -= dc->disk.stripe_size;
|
||||
stripe++;
|
||||
}
|
||||
}
|
||||
@@ -45,7 +50,7 @@ static inline bool should_writeback(struct cached_dev *dc, struct bio *bio,
|
||||
return false;
|
||||
|
||||
if (dc->partial_stripes_expensive &&
|
||||
bcache_dev_stripe_dirty(&dc->disk, bio->bi_sector,
|
||||
bcache_dev_stripe_dirty(dc, bio->bi_sector,
|
||||
bio_sectors(bio)))
|
||||
return true;
|
||||
|
||||
|
Reference in New Issue
Block a user