Message ID | 20200527062225.72849-15-hare@suse.de (mailing list archive) |
---|---|
State | Superseded, archived |
Delegated to: | Mike Snitzer |
Headers | show |
Series | dm-zoned: multi-device support | expand |
On Wed, 2020-05-27 at 08:22 +0200, Hannes Reinecke wrote: > per-device reclaim should select zones on that device only. > > Signed-off-by: Hannes Reinecke <hare@suse.de> > --- > drivers/md/dm-zoned-metadata.c | 50 +++++++++++++++++------------------------- > drivers/md/dm-zoned-reclaim.c | 3 ++- > drivers/md/dm-zoned-target.c | 1 + > drivers/md/dm-zoned.h | 5 ++++- > 4 files changed, 27 insertions(+), 32 deletions(-) > > diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c > index 0d65af94309a..b89b3d3b9ec9 100644 > --- a/drivers/md/dm-zoned-metadata.c > +++ b/drivers/md/dm-zoned-metadata.c > @@ -1933,7 +1933,7 @@ static void dmz_wait_for_reclaim(struct dmz_metadata *zmd, struct dm_zone *zone) > * Select a cache or random write zone for reclaim. > */ > static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, > - bool idle) > + unsigned int idx, bool idle) > { > struct dm_zone *dzone = NULL; > struct dm_zone *zone; > @@ -1943,24 +1943,17 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, > if (zmd->nr_cache) { > zone_list = &zmd->map_cache_list; > /* Try to relaim random zones, too, when idle */ > - if (idle && list_empty(zone_list)) { > - int i; > - > - for (i = 1; i < zmd->nr_devs; i++) { > - zone_list = &zmd->dev[i].map_rnd_list; > - if (!list_empty(zone_list)) > - break; > - } > - } > - } else { > - /* Otherwise the random zones are on the first disk */ > - zone_list = &zmd->dev[0].map_rnd_list; > - } > + if (idle && list_empty(zone_list)) > + zone_list = &zmd->dev[idx].map_rnd_list; > + } else > + zone_list = &zmd->dev[idx].map_rnd_list; > > list_for_each_entry(zone, zone_list, link) { > - if (dmz_is_buf(zone)) > + if (dmz_is_buf(zone)) { > dzone = zone->bzone; > - else > + if (dzone->dev->dev_idx != idx) > + continue; > + } else > dzone = zone; > if (dmz_lock_zone_reclaim(dzone)) > return dzone; > @@ -1972,20 +1965,16 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, > /* > * Select a buffered sequential zone for reclaim. > */ > -static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) > +static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd, > + unsigned int idx) > { > struct dm_zone *zone; > - int i; > - > - for (i = 0; i < zmd->nr_devs; i++) { > - struct dmz_dev *dev = &zmd->dev[i]; > > - list_for_each_entry(zone, &dev->map_seq_list, link) { > - if (!zone->bzone) > - continue; > - if (dmz_lock_zone_reclaim(zone)) > - return zone; > - } > + list_for_each_entry(zone, &zmd->dev[idx].map_seq_list, link) { > + if (!zone->bzone) > + continue; > + if (dmz_lock_zone_reclaim(zone)) > + return zone; > } > > return NULL; > @@ -1994,7 +1983,8 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) > /* > * Select a zone for reclaim. > */ > -struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle) > +struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, > + unsigned int dev_idx, bool idle) > { > struct dm_zone *zone; > > @@ -2008,9 +1998,9 @@ struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle) > */ > dmz_lock_map(zmd); > if (list_empty(&zmd->reserved_seq_zones_list)) > - zone = dmz_get_seq_zone_for_reclaim(zmd); > + zone = dmz_get_seq_zone_for_reclaim(zmd, dev_idx); > else > - zone = dmz_get_rnd_zone_for_reclaim(zmd, idle); > + zone = dmz_get_rnd_zone_for_reclaim(zmd, dev_idx, idle); > dmz_unlock_map(zmd); > > return zone; > diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c > index 5a04e34d17a9..2261b4dd60b7 100644 > --- a/drivers/md/dm-zoned-reclaim.c > +++ b/drivers/md/dm-zoned-reclaim.c > @@ -370,7 +370,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc) > int ret; > > /* Get a data zone */ > - dzone = dmz_get_zone_for_reclaim(zmd, dmz_target_idle(zrc)); > + dzone = dmz_get_zone_for_reclaim(zmd, zrc->dev_idx, > + dmz_target_idle(zrc)); > if (!dzone) { > DMDEBUG("(%s/%u): No zone found to reclaim", > dmz_metadata_label(zmd), zrc->dev_idx); > diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c > index 4a51738d4b0d..a23f1fbd208f 100644 > --- a/drivers/md/dm-zoned-target.c > +++ b/drivers/md/dm-zoned-target.c > @@ -738,6 +738,7 @@ static int dmz_get_zoned_device(struct dm_target *ti, char *path, > dev = &dmz->dev[idx]; > } > dev->bdev = bdev; > + dev->dev_idx = idx; > (void)bdevname(dev->bdev, dev->name); > > dev->capacity = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; > diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h > index ec020bb1caf7..22f11440b423 100644 > --- a/drivers/md/dm-zoned.h > +++ b/drivers/md/dm-zoned.h > @@ -61,6 +61,8 @@ struct dmz_dev { > > sector_t capacity; > > + unsigned int dev_idx; > + > unsigned int nr_zones; > unsigned int zone_offset; > > @@ -243,7 +245,8 @@ static inline void dmz_activate_zone(struct dm_zone *zone) > > int dmz_lock_zone_reclaim(struct dm_zone *zone); > void dmz_unlock_zone_reclaim(struct dm_zone *zone); > -struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle); > +struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, > + unsigned int dev_idx, bool idle); > > struct dm_zone *dmz_get_chunk_mapping(struct dmz_metadata *zmd, > unsigned int chunk, int op); Looks good. Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c index 0d65af94309a..b89b3d3b9ec9 100644 --- a/drivers/md/dm-zoned-metadata.c +++ b/drivers/md/dm-zoned-metadata.c @@ -1933,7 +1933,7 @@ static void dmz_wait_for_reclaim(struct dmz_metadata *zmd, struct dm_zone *zone) * Select a cache or random write zone for reclaim. */ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, - bool idle) + unsigned int idx, bool idle) { struct dm_zone *dzone = NULL; struct dm_zone *zone; @@ -1943,24 +1943,17 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, if (zmd->nr_cache) { zone_list = &zmd->map_cache_list; /* Try to relaim random zones, too, when idle */ - if (idle && list_empty(zone_list)) { - int i; - - for (i = 1; i < zmd->nr_devs; i++) { - zone_list = &zmd->dev[i].map_rnd_list; - if (!list_empty(zone_list)) - break; - } - } - } else { - /* Otherwise the random zones are on the first disk */ - zone_list = &zmd->dev[0].map_rnd_list; - } + if (idle && list_empty(zone_list)) + zone_list = &zmd->dev[idx].map_rnd_list; + } else + zone_list = &zmd->dev[idx].map_rnd_list; list_for_each_entry(zone, zone_list, link) { - if (dmz_is_buf(zone)) + if (dmz_is_buf(zone)) { dzone = zone->bzone; - else + if (dzone->dev->dev_idx != idx) + continue; + } else dzone = zone; if (dmz_lock_zone_reclaim(dzone)) return dzone; @@ -1972,20 +1965,16 @@ static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, /* * Select a buffered sequential zone for reclaim. */ -static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) +static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd, + unsigned int idx) { struct dm_zone *zone; - int i; - - for (i = 0; i < zmd->nr_devs; i++) { - struct dmz_dev *dev = &zmd->dev[i]; - list_for_each_entry(zone, &dev->map_seq_list, link) { - if (!zone->bzone) - continue; - if (dmz_lock_zone_reclaim(zone)) - return zone; - } + list_for_each_entry(zone, &zmd->dev[idx].map_seq_list, link) { + if (!zone->bzone) + continue; + if (dmz_lock_zone_reclaim(zone)) + return zone; } return NULL; @@ -1994,7 +1983,8 @@ static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) /* * Select a zone for reclaim. */ -struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle) +struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, + unsigned int dev_idx, bool idle) { struct dm_zone *zone; @@ -2008,9 +1998,9 @@ struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle) */ dmz_lock_map(zmd); if (list_empty(&zmd->reserved_seq_zones_list)) - zone = dmz_get_seq_zone_for_reclaim(zmd); + zone = dmz_get_seq_zone_for_reclaim(zmd, dev_idx); else - zone = dmz_get_rnd_zone_for_reclaim(zmd, idle); + zone = dmz_get_rnd_zone_for_reclaim(zmd, dev_idx, idle); dmz_unlock_map(zmd); return zone; diff --git a/drivers/md/dm-zoned-reclaim.c b/drivers/md/dm-zoned-reclaim.c index 5a04e34d17a9..2261b4dd60b7 100644 --- a/drivers/md/dm-zoned-reclaim.c +++ b/drivers/md/dm-zoned-reclaim.c @@ -370,7 +370,8 @@ static int dmz_do_reclaim(struct dmz_reclaim *zrc) int ret; /* Get a data zone */ - dzone = dmz_get_zone_for_reclaim(zmd, dmz_target_idle(zrc)); + dzone = dmz_get_zone_for_reclaim(zmd, zrc->dev_idx, + dmz_target_idle(zrc)); if (!dzone) { DMDEBUG("(%s/%u): No zone found to reclaim", dmz_metadata_label(zmd), zrc->dev_idx); diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c index 4a51738d4b0d..a23f1fbd208f 100644 --- a/drivers/md/dm-zoned-target.c +++ b/drivers/md/dm-zoned-target.c @@ -738,6 +738,7 @@ static int dmz_get_zoned_device(struct dm_target *ti, char *path, dev = &dmz->dev[idx]; } dev->bdev = bdev; + dev->dev_idx = idx; (void)bdevname(dev->bdev, dev->name); dev->capacity = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT; diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h index ec020bb1caf7..22f11440b423 100644 --- a/drivers/md/dm-zoned.h +++ b/drivers/md/dm-zoned.h @@ -61,6 +61,8 @@ struct dmz_dev { sector_t capacity; + unsigned int dev_idx; + unsigned int nr_zones; unsigned int zone_offset; @@ -243,7 +245,8 @@ static inline void dmz_activate_zone(struct dm_zone *zone) int dmz_lock_zone_reclaim(struct dm_zone *zone); void dmz_unlock_zone_reclaim(struct dm_zone *zone); -struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle); +struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, + unsigned int dev_idx, bool idle); struct dm_zone *dmz_get_chunk_mapping(struct dmz_metadata *zmd, unsigned int chunk, int op);
per-device reclaim should select zones on that device only. Signed-off-by: Hannes Reinecke <hare@suse.de> --- drivers/md/dm-zoned-metadata.c | 50 +++++++++++++++++------------------------- drivers/md/dm-zoned-reclaim.c | 3 ++- drivers/md/dm-zoned-target.c | 1 + drivers/md/dm-zoned.h | 5 ++++- 4 files changed, 27 insertions(+), 32 deletions(-)