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 <[email protected]>
> ---
>  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 <[email protected]>

-- 
Damien Le Moal
Western Digital Research

--
dm-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/dm-devel

Reply via email to