diff mbox series

[01/14] dm-zoned: add 'status' and 'message' callbacks

Message ID 20200508090332.40716-2-hare@suse.de (mailing list archive)
State Superseded, archived
Delegated to: Mike Snitzer
Headers show
Series dm-zoned: metadata version 2 | expand

Commit Message

Hannes Reinecke May 8, 2020, 9:03 a.m. UTC
Add callbacks to supply information for 'dmsetup status'
and 'dmsetup info', and implement the message 'reclaim'
to start the reclaim worker.

Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Bob Liu <bob.liu@oracle.com>
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
---
 drivers/md/dm-zoned-metadata.c | 15 +++++++++++++++
 drivers/md/dm-zoned-target.c   | 41 +++++++++++++++++++++++++++++++++++++++++
 drivers/md/dm-zoned.h          |  3 +++
 3 files changed, 59 insertions(+)

Comments

Mike Snitzer May 8, 2020, 4:29 p.m. UTC | #1
On Fri, May 08 2020 at  5:03am -0400,
Hannes Reinecke <hare@suse.de> wrote:

> Add callbacks to supply information for 'dmsetup status'
> and 'dmsetup info', and implement the message 'reclaim'
> to start the reclaim worker.

Same feedback from before:
https://www.redhat.com/archives/dm-devel/2020-March/msg00189.html

Who/What will use the 'reclaim' message?  Shouldn't it be documented?
Think the dmz_status changes should be split out from this reclaim
message?

Thanks,
Mike

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
Hannes Reinecke May 8, 2020, 6:25 p.m. UTC | #2
On 5/8/20 6:29 PM, Mike Snitzer wrote:
> On Fri, May 08 2020 at  5:03am -0400,
> Hannes Reinecke <hare@suse.de> wrote:
> 
>> Add callbacks to supply information for 'dmsetup status'
>> and 'dmsetup info', and implement the message 'reclaim'
>> to start the reclaim worker.
> 
> Same feedback from before:
> https://www.redhat.com/archives/dm-devel/2020-March/msg00189.html
> 
> Who/What will use the 'reclaim' message?  Shouldn't it be documented?
> Think the dmz_status changes should be split out from this reclaim
> message?
> 
'reclaim' means that dm-zoned should start moving zones from the random 
zones to the sequential zones to free up more random zones.
There's a threshold after which it'll start automatically, but this 
allows you to start reclaim even if the threshold isn't reached.
You might be right, it should be documented.
(Where? In the code?)

As for splitting things off; yeah, I could; maybe I should if the 
'reclaim' message turns out to be controversial...

Cheers,

Hannes
Mike Snitzer May 8, 2020, 9 p.m. UTC | #3
On Fri, May 08 2020 at  2:25pm -0400,
Hannes Reinecke <hare@suse.de> wrote:

> On 5/8/20 6:29 PM, Mike Snitzer wrote:
> >On Fri, May 08 2020 at  5:03am -0400,
> >Hannes Reinecke <hare@suse.de> wrote:
> >
> >>Add callbacks to supply information for 'dmsetup status'
> >>and 'dmsetup info', and implement the message 'reclaim'
> >>to start the reclaim worker.
> >
> >Same feedback from before:
> >https://www.redhat.com/archives/dm-devel/2020-March/msg00189.html
> >
> >Who/What will use the 'reclaim' message?  Shouldn't it be documented?
> >Think the dmz_status changes should be split out from this reclaim
> >message?
> >
> 'reclaim' means that dm-zoned should start moving zones from the
> random zones to the sequential zones to free up more random zones.
> There's a threshold after which it'll start automatically, but this
> allows you to start reclaim even if the threshold isn't reached.
> You might be right, it should be documented.
> (Where? In the code?)

Documentation/admin-guide/device-mapper/dm-zoned.rst

Anything else worthy of sharing with others about v2 metadata format
would also be wise to document as part of those changes,

> As for splitting things off; yeah, I could; maybe I should if the
> 'reclaim' message turns out to be controversial...

Not controversial per se, but its disjoint from the rest of this series.
So best to split it out I think.

Thanks,
Mike

--
dm-devel mailing list
dm-devel@redhat.com
https://www.redhat.com/mailman/listinfo/dm-devel
diff mbox series

Patch

diff --git a/drivers/md/dm-zoned-metadata.c b/drivers/md/dm-zoned-metadata.c
index 369de15c4e80..c8787560fa9f 100644
--- a/drivers/md/dm-zoned-metadata.c
+++ b/drivers/md/dm-zoned-metadata.c
@@ -202,6 +202,11 @@  sector_t dmz_start_block(struct dmz_metadata *zmd, struct dm_zone *zone)
 	return (sector_t)dmz_id(zmd, zone) << zmd->dev->zone_nr_blocks_shift;
 }
 
+unsigned int dmz_nr_zones(struct dmz_metadata *zmd)
+{
+	return zmd->dev->nr_zones;
+}
+
 unsigned int dmz_nr_chunks(struct dmz_metadata *zmd)
 {
 	return zmd->nr_chunks;
@@ -217,6 +222,16 @@  unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd)
 	return atomic_read(&zmd->unmap_nr_rnd);
 }
 
+unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd)
+{
+	return zmd->nr_seq;
+}
+
+unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd)
+{
+	return atomic_read(&zmd->unmap_nr_seq);
+}
+
 /*
  * Lock/unlock mapping table.
  * The map lock also protects all the zone lists.
diff --git a/drivers/md/dm-zoned-target.c b/drivers/md/dm-zoned-target.c
index f4f83d39b3dc..0bfe34162dbb 100644
--- a/drivers/md/dm-zoned-target.c
+++ b/drivers/md/dm-zoned-target.c
@@ -965,6 +965,45 @@  static int dmz_iterate_devices(struct dm_target *ti,
 	return fn(ti, dmz->ddev, 0, capacity, data);
 }
 
+static void dmz_status(struct dm_target *ti, status_type_t type,
+		       unsigned int status_flags, char *result,
+		       unsigned int maxlen)
+{
+	struct dmz_target *dmz = ti->private;
+	ssize_t sz = 0;
+	char buf[BDEVNAME_SIZE];
+
+	switch (type) {
+	case STATUSTYPE_INFO:
+		DMEMIT("%u zones %u/%u random %u/%u sequential",
+		       dmz_nr_zones(dmz->metadata),
+		       dmz_nr_unmap_rnd_zones(dmz->metadata),
+		       dmz_nr_rnd_zones(dmz->metadata),
+		       dmz_nr_unmap_seq_zones(dmz->metadata),
+		       dmz_nr_seq_zones(dmz->metadata));
+		break;
+	case STATUSTYPE_TABLE:
+		format_dev_t(buf, dmz->dev->bdev->bd_dev);
+		DMEMIT("%s", buf);
+		break;
+	}
+	return;
+}
+
+static int dmz_message(struct dm_target *ti, unsigned int argc, char **argv,
+		       char *result, unsigned int maxlen)
+{
+	struct dmz_target *dmz = ti->private;
+	int r = -EINVAL;
+
+	if (!strcasecmp(argv[0], "reclaim")) {
+		dmz_schedule_reclaim(dmz->reclaim);
+		r = 0;
+	} else
+		DMERR("unrecognized message %s", argv[0]);
+	return r;
+}
+
 static struct target_type dmz_type = {
 	.name		 = "zoned",
 	.version	 = {1, 1, 0},
@@ -978,6 +1017,8 @@  static struct target_type dmz_type = {
 	.postsuspend	 = dmz_suspend,
 	.resume		 = dmz_resume,
 	.iterate_devices = dmz_iterate_devices,
+	.status		 = dmz_status,
+	.message	 = dmz_message,
 };
 
 static int __init dmz_init(void)
diff --git a/drivers/md/dm-zoned.h b/drivers/md/dm-zoned.h
index 5b5e493d479c..884c0e586082 100644
--- a/drivers/md/dm-zoned.h
+++ b/drivers/md/dm-zoned.h
@@ -190,8 +190,11 @@  void dmz_free_zone(struct dmz_metadata *zmd, struct dm_zone *zone);
 void dmz_map_zone(struct dmz_metadata *zmd, struct dm_zone *zone,
 		  unsigned int chunk);
 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_rnd_zones(struct dmz_metadata *zmd);
 unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd);
+unsigned int dmz_nr_seq_zones(struct dmz_metadata *zmd);
+unsigned int dmz_nr_unmap_seq_zones(struct dmz_metadata *zmd);
 
 /*
  * Activate a zone (increment its reference count).