[dm-devel] [PATCH 14/15] dm-zoned: select reclaim zone based on device index
Damien Le Moal
Damien.LeMoal at wdc.com
Thu May 28 04:11:14 UTC 2020
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 at 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 at wdc.com>
--
Damien Le Moal
Western Digital Research
More information about the dm-devel
mailing list