Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

dm zoned: select reclaim zone based on device index

per-device reclaim should select zones on that device only.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>

authored by

Hannes Reinecke and committed by
Mike Snitzer
69875d44 22c1ef66

+27 -32
+20 -30
drivers/md/dm-zoned-metadata.c
··· 1938 1938 * Select a cache or random write zone for reclaim. 1939 1939 */ 1940 1940 static struct dm_zone *dmz_get_rnd_zone_for_reclaim(struct dmz_metadata *zmd, 1941 - bool idle) 1941 + unsigned int idx, bool idle) 1942 1942 { 1943 1943 struct dm_zone *dzone = NULL; 1944 1944 struct dm_zone *zone; ··· 1948 1948 if (zmd->nr_cache) { 1949 1949 zone_list = &zmd->map_cache_list; 1950 1950 /* Try to relaim random zones, too, when idle */ 1951 - if (idle && list_empty(zone_list)) { 1952 - int i; 1953 - 1954 - for (i = 1; i < zmd->nr_devs; i++) { 1955 - zone_list = &zmd->dev[i].map_rnd_list; 1956 - if (!list_empty(zone_list)) 1957 - break; 1958 - } 1959 - } 1960 - } else { 1961 - /* Otherwise the random zones are on the first disk */ 1962 - zone_list = &zmd->dev[0].map_rnd_list; 1963 - } 1951 + if (idle && list_empty(zone_list)) 1952 + zone_list = &zmd->dev[idx].map_rnd_list; 1953 + } else 1954 + zone_list = &zmd->dev[idx].map_rnd_list; 1964 1955 1965 1956 list_for_each_entry(zone, zone_list, link) { 1966 - if (dmz_is_buf(zone)) 1957 + if (dmz_is_buf(zone)) { 1967 1958 dzone = zone->bzone; 1968 - else 1959 + if (dzone->dev->dev_idx != idx) 1960 + continue; 1961 + } else 1969 1962 dzone = zone; 1970 1963 if (dmz_lock_zone_reclaim(dzone)) 1971 1964 return dzone; ··· 1970 1977 /* 1971 1978 * Select a buffered sequential zone for reclaim. 1972 1979 */ 1973 - static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd) 1980 + static struct dm_zone *dmz_get_seq_zone_for_reclaim(struct dmz_metadata *zmd, 1981 + unsigned int idx) 1974 1982 { 1975 1983 struct dm_zone *zone; 1976 - int i; 1977 1984 1978 - for (i = 0; i < zmd->nr_devs; i++) { 1979 - struct dmz_dev *dev = &zmd->dev[i]; 1980 - 1981 - list_for_each_entry(zone, &dev->map_seq_list, link) { 1982 - if (!zone->bzone) 1983 - continue; 1984 - if (dmz_lock_zone_reclaim(zone)) 1985 - return zone; 1986 - } 1985 + list_for_each_entry(zone, &zmd->dev[idx].map_seq_list, link) { 1986 + if (!zone->bzone) 1987 + continue; 1988 + if (dmz_lock_zone_reclaim(zone)) 1989 + return zone; 1987 1990 } 1988 1991 1989 1992 return NULL; ··· 1988 1999 /* 1989 2000 * Select a zone for reclaim. 1990 2001 */ 1991 - struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle) 2002 + struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, 2003 + unsigned int dev_idx, bool idle) 1992 2004 { 1993 2005 struct dm_zone *zone; 1994 2006 ··· 2003 2013 */ 2004 2014 dmz_lock_map(zmd); 2005 2015 if (list_empty(&zmd->reserved_seq_zones_list)) 2006 - zone = dmz_get_seq_zone_for_reclaim(zmd); 2016 + zone = dmz_get_seq_zone_for_reclaim(zmd, dev_idx); 2007 2017 else 2008 - zone = dmz_get_rnd_zone_for_reclaim(zmd, idle); 2018 + zone = dmz_get_rnd_zone_for_reclaim(zmd, dev_idx, idle); 2009 2019 dmz_unlock_map(zmd); 2010 2020 2011 2021 return zone;
+2 -1
drivers/md/dm-zoned-reclaim.c
··· 370 370 int ret; 371 371 372 372 /* Get a data zone */ 373 - dzone = dmz_get_zone_for_reclaim(zmd, dmz_target_idle(zrc)); 373 + dzone = dmz_get_zone_for_reclaim(zmd, zrc->dev_idx, 374 + dmz_target_idle(zrc)); 374 375 if (!dzone) { 375 376 DMDEBUG("(%s/%u): No zone found to reclaim", 376 377 dmz_metadata_label(zmd), zrc->dev_idx);
+1
drivers/md/dm-zoned-target.c
··· 738 738 dev = &dmz->dev[idx]; 739 739 } 740 740 dev->bdev = bdev; 741 + dev->dev_idx = idx; 741 742 (void)bdevname(dev->bdev, dev->name); 742 743 743 744 dev->capacity = i_size_read(bdev->bd_inode) >> SECTOR_SHIFT;
+4 -1
drivers/md/dm-zoned.h
··· 61 61 62 62 sector_t capacity; 63 63 64 + unsigned int dev_idx; 65 + 64 66 unsigned int nr_zones; 65 67 unsigned int zone_offset; 66 68 ··· 245 243 246 244 int dmz_lock_zone_reclaim(struct dm_zone *zone); 247 245 void dmz_unlock_zone_reclaim(struct dm_zone *zone); 248 - struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, bool idle); 246 + struct dm_zone *dmz_get_zone_for_reclaim(struct dmz_metadata *zmd, 247 + unsigned int dev_idx, bool idle); 249 248 250 249 struct dm_zone *dmz_get_chunk_mapping(struct dmz_metadata *zmd, 251 250 unsigned int chunk, int op);