dm zoned: Fix random zone reclaim selection
authorDamien Le Moal <damien.lemoal@wdc.com>
Fri, 19 Jun 2020 07:49:55 +0000 (16:49 +0900)
committerMike Snitzer <snitzer@redhat.com>
Fri, 19 Jun 2020 16:28:23 +0000 (12:28 -0400)
commit3ee39573e567eded4f73e1e22216034bc29f3813
tree3dc8a86b745cf670e8d6f0ea97117756b93fe4ee
parent415c79e13b17ce5f0a0815bab4d584f75f4d1171
dm zoned: Fix random zone reclaim selection

Commit 2094045fe5b5 ("dm zoned: prefer full zones for reclaim")
modified dmz_get_rnd_zone_for_reclaim() to add a search for the buffer
zone with the heaviest weight as an optimal candidate for reclaim. This
modification uses the zone pointer variabl "last" which is set only once
and never modified as zones are scanned, resulting in the search being
inefective. Furthermore, if the selected buffer zone at the end of the
search loop is active or already locked for reclaim,
dmz_get_rnd_zone_for_reclaim() returns NULL even if other random zones
with a lesser weight can be reclaimed.

To fix the search and to guarantee that reclaim can make forward
progress, fix dmz_get_rnd_zone_for_reclaim() loop to correctly find
the buffer zone with the heaviest weight using the variable maxw_z.
Also make sure to fallback to finding the first random zone that can
be reclaimed if this best candidate zone cannot be reclaimed.

While at it, also fix the device index check to consider only random
zones, ignoring cache zones belonging to the cache device if one is
used as that device does not have a reclaim process.

Fixes: 2094045fe5b5 ("dm zoned: prefer full zones for reclaim")
Signed-off-by: Damien Le Moal <damien.lemoal@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
drivers/md/dm-zoned-metadata.c