Commit bd82fdab authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Mike Snitzer

dm zoned: move random and sequential zones into struct dmz_dev

Random and sequential zones should be part of the respective
device structure to make arbitration between devices possible.
Signed-off-by: default avatarHannes Reinecke <hare@suse.de>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent f97809ae
This diff is collapsed.
...@@ -447,15 +447,14 @@ static unsigned int dmz_reclaim_percentage(struct dmz_reclaim *zrc) ...@@ -447,15 +447,14 @@ static unsigned int dmz_reclaim_percentage(struct dmz_reclaim *zrc)
{ {
struct dmz_metadata *zmd = zrc->metadata; struct dmz_metadata *zmd = zrc->metadata;
unsigned int nr_cache = dmz_nr_cache_zones(zmd); unsigned int nr_cache = dmz_nr_cache_zones(zmd);
unsigned int nr_rnd = dmz_nr_rnd_zones(zmd);
unsigned int nr_unmap, nr_zones; unsigned int nr_unmap, nr_zones;
if (nr_cache) { if (nr_cache) {
nr_zones = nr_cache; nr_zones = nr_cache;
nr_unmap = dmz_nr_unmap_cache_zones(zmd); nr_unmap = dmz_nr_unmap_cache_zones(zmd);
} else { } else {
nr_zones = nr_rnd; nr_zones = dmz_nr_rnd_zones(zmd, zrc->dev_idx);
nr_unmap = dmz_nr_unmap_rnd_zones(zmd); nr_unmap = dmz_nr_unmap_rnd_zones(zmd, zrc->dev_idx);
} }
return nr_unmap * 100 / nr_zones; return nr_unmap * 100 / nr_zones;
} }
...@@ -467,7 +466,7 @@ static bool dmz_should_reclaim(struct dmz_reclaim *zrc, unsigned int p_unmap) ...@@ -467,7 +466,7 @@ static bool dmz_should_reclaim(struct dmz_reclaim *zrc, unsigned int p_unmap)
{ {
unsigned int nr_reclaim; unsigned int nr_reclaim;
nr_reclaim = dmz_nr_rnd_zones(zrc->metadata); nr_reclaim = dmz_nr_rnd_zones(zrc->metadata, zrc->dev_idx);
if (dmz_nr_cache_zones(zrc->metadata)) { if (dmz_nr_cache_zones(zrc->metadata)) {
/* /*
...@@ -528,8 +527,8 @@ static void dmz_reclaim_work(struct work_struct *work) ...@@ -528,8 +527,8 @@ static void dmz_reclaim_work(struct work_struct *work)
zrc->kc_throttle.throttle = min(75U, 100U - p_unmap / 2); zrc->kc_throttle.throttle = min(75U, 100U - p_unmap / 2);
} }
nr_unmap_rnd = dmz_nr_unmap_rnd_zones(zmd); nr_unmap_rnd = dmz_nr_unmap_rnd_zones(zmd, zrc->dev_idx);
nr_rnd = dmz_nr_rnd_zones(zmd); nr_rnd = dmz_nr_rnd_zones(zmd, zrc->dev_idx);
DMDEBUG("(%s/%u): Reclaim (%u): %s, %u%% free zones (%u/%u cache %u/%u random)", DMDEBUG("(%s/%u): Reclaim (%u): %s, %u%% free zones (%u/%u cache %u/%u random)",
dmz_metadata_label(zmd), zrc->dev_idx, dmz_metadata_label(zmd), zrc->dev_idx,
...@@ -537,8 +536,8 @@ static void dmz_reclaim_work(struct work_struct *work) ...@@ -537,8 +536,8 @@ static void dmz_reclaim_work(struct work_struct *work)
(dmz_target_idle(zrc) ? "Idle" : "Busy"), (dmz_target_idle(zrc) ? "Idle" : "Busy"),
p_unmap, dmz_nr_unmap_cache_zones(zmd), p_unmap, dmz_nr_unmap_cache_zones(zmd),
dmz_nr_cache_zones(zmd), dmz_nr_cache_zones(zmd),
dmz_nr_unmap_rnd_zones(zmd), dmz_nr_unmap_rnd_zones(zmd, zrc->dev_idx),
dmz_nr_rnd_zones(zmd)); dmz_nr_rnd_zones(zmd, zrc->dev_idx));
ret = dmz_do_reclaim(zrc); ret = dmz_do_reclaim(zrc);
if (ret && ret != -EINTR) { if (ret && ret != -EINTR) {
......
...@@ -1075,17 +1075,30 @@ static void dmz_status(struct dm_target *ti, status_type_t type, ...@@ -1075,17 +1075,30 @@ static void dmz_status(struct dm_target *ti, status_type_t type,
ssize_t sz = 0; ssize_t sz = 0;
char buf[BDEVNAME_SIZE]; char buf[BDEVNAME_SIZE];
struct dmz_dev *dev; struct dmz_dev *dev;
int i;
switch (type) { switch (type) {
case STATUSTYPE_INFO: case STATUSTYPE_INFO:
DMEMIT("%u zones %u/%u cache %u/%u random %u/%u sequential", DMEMIT("%u zones %u/%u cache",
dmz_nr_zones(dmz->metadata), dmz_nr_zones(dmz->metadata),
dmz_nr_unmap_cache_zones(dmz->metadata), dmz_nr_unmap_cache_zones(dmz->metadata),
dmz_nr_cache_zones(dmz->metadata), dmz_nr_cache_zones(dmz->metadata));
dmz_nr_unmap_rnd_zones(dmz->metadata), for (i = 0; i < DMZ_MAX_DEVS; i++) {
dmz_nr_rnd_zones(dmz->metadata), if (!dmz->ddev[i])
dmz_nr_unmap_seq_zones(dmz->metadata), continue;
dmz_nr_seq_zones(dmz->metadata)); /*
* For a multi-device setup the first device
* contains only cache zones.
*/
if ((i == 0) &&
(dmz_nr_cache_zones(dmz->metadata) > 0))
continue;
DMEMIT(" %u/%u random %u/%u sequential",
dmz_nr_unmap_rnd_zones(dmz->metadata, i),
dmz_nr_rnd_zones(dmz->metadata, i),
dmz_nr_unmap_seq_zones(dmz->metadata, i),
dmz_nr_seq_zones(dmz->metadata, i));
}
break; break;
case STATUSTYPE_TABLE: case STATUSTYPE_TABLE:
dev = &dmz->dev[0]; dev = &dmz->dev[0];
......
...@@ -67,6 +67,16 @@ struct dmz_dev { ...@@ -67,6 +67,16 @@ struct dmz_dev {
unsigned int flags; unsigned int flags;
sector_t zone_nr_sectors; sector_t zone_nr_sectors;
unsigned int nr_rnd;
atomic_t unmap_nr_rnd;
struct list_head unmap_rnd_list;
struct list_head map_rnd_list;
unsigned int nr_seq;
atomic_t unmap_nr_seq;
struct list_head unmap_seq_list;
struct list_head map_seq_list;
}; };
#define dmz_bio_chunk(zmd, bio) ((bio)->bi_iter.bi_sector >> \ #define dmz_bio_chunk(zmd, bio) ((bio)->bi_iter.bi_sector >> \
...@@ -213,10 +223,10 @@ void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone); ...@@ -213,10 +223,10 @@ void dmz_unmap_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
unsigned int dmz_nr_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_cache_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_cache_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_unmap_cache_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_unmap_cache_zones(struct dmz_metadata *zmd);
unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd, int idx);
unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd, int idx);
unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd, int idx);
unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd); unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd, int idx);
unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd); unsigned int dmz_zone_nr_blocks(struct dmz_metadata *zmd);
unsigned int dmz_zone_nr_blocks_shift(struct dmz_metadata *zmd); unsigned int dmz_zone_nr_blocks_shift(struct dmz_metadata *zmd);
unsigned int dmz_zone_nr_sectors(struct dmz_metadata *zmd); unsigned int dmz_zone_nr_sectors(struct dmz_metadata *zmd);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment