All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] dm-writecache: change config parameters using messages
@ 2019-09-22 19:39 Maged Mokhtar
  2019-11-05 21:19 ` Maged Mokhtar
  0 siblings, 1 reply; 9+ messages in thread
From: Maged Mokhtar @ 2019-09-22 19:39 UTC (permalink / raw)
  To: mpatocka; +Cc: dm-devel

Support changing configuration parameters using device-mapper messages
E.g.
    dmsetup message vg1/lv1 0 high_watermark 60

Signed-off-by: Maged Mokhtar <mmokhtar@petasan.org>
---
  drivers/md/dm-writecache.c |   68 +++++++++++++++++++++++++++++++++++
  1 file changed, 68 insertions(+)

--- a/drivers/md/dm-writecache.c	2019-08-25 16:13:54.000000000 +0200
+++ b/drivers/md/dm-writecache.c	2019-09-21 16:22:23.000000000 +0200
@@ -1009,6 +1009,69 @@ static int process_flush_on_suspend_mesg
  	return 0;
  }

+static int set_config_value(struct dm_writecache *wc, char *key, char *val)
+{
+	unsigned v,x;
+	if (sscanf(val, "%u", &v) != 1)
+		return -EINVAL;
+	if (!strcasecmp(key, "high_watermark")) {
+		if (v < 0 || v > 100)
+			return -EINVAL;
+		wc_lock(wc);
+		x = (uint64_t)wc->n_blocks * (100 - v);
+		x += 50;
+		do_div(x, 100);
+		if (wc->freelist_low_watermark < x) {
+			wc_unlock(wc);
+			return -EINVAL;
+		}
+		wc->freelist_high_watermark = x;
+		wc->high_wm_percent_set = true;
+		if (wc->freelist_size + wc->writeback_size
+			<= wc->freelist_high_watermark)
+			queue_work(wc->writeback_wq, &wc->writeback_work);
+		wc_unlock(wc);
+	}
+	else if (!strcasecmp(key, "low_watermark")) {
+		if (v < 0 || v > 100)
+			return -EINVAL;
+		wc_lock(wc);
+		x = (uint64_t)wc->n_blocks * (100 - v);
+		x += 50;
+		do_div(x, 100);
+		if (x < wc->freelist_high_watermark) {
+			wc_unlock(wc);
+			return -EINVAL;
+		}
+		wc->freelist_low_watermark = x;
+		wc->low_wm_percent_set = true;
+		wc_unlock(wc);
+	}
+	else if (!strcasecmp(key, "writeback_jobs")) {
+		wc_lock(wc);
+		wc->max_writeback_jobs = v;
+		wc->max_writeback_jobs_set = true;
+		wc_unlock(wc);
+	}
+	else if (!strcasecmp(key, "autocommit_blocks")) {
+		wc_lock(wc);
+		wc->autocommit_blocks = v;
+		wc->autocommit_blocks_set = true;
+		wc_unlock(wc);
+	}
+	else if (!strcasecmp(key, "autocommit_time")) {
+		if (v < 1 || v > 3600000)
+			return -EINVAL;
+		wc_lock(wc);
+		wc->autocommit_jiffies = msecs_to_jiffies(v);
+		wc->autocommit_time_set = true;
+		wc_unlock(wc);
+	}
+	else
+		return -EINVAL;
+	return 0;
+}
+
  static int writecache_message(struct dm_target *ti, unsigned argc, 
char **argv,
  			      char *result, unsigned maxlen)
  {
@@ -1019,6 +1082,11 @@ static int writecache_message(struct dm_
  		r = process_flush_mesg(argc, argv, wc);
  	else if (!strcasecmp(argv[0], "flush_on_suspend"))
  		r = process_flush_on_suspend_mesg(argc, argv, wc);
+	else if (argc==2) {
+		r = set_config_value(wc, argv[0], argv[1]);
+		if (r==-EINVAL)
+			DMERR("invalid message received: %s %s", argv[0], argv[1]);
+	}
  	else
  		DMERR("unrecognised message received: %s", argv[0]);

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2019-11-07 20:16 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-09-22 19:39 [PATCH] dm-writecache: change config parameters using messages Maged Mokhtar
2019-11-05 21:19 ` Maged Mokhtar
2019-11-06 15:08   ` Mike Snitzer
2019-11-07 18:55     ` Maged Mokhtar
2019-11-07 19:09       ` Mike Snitzer
2019-11-07 19:29         ` Maged Mokhtar
2019-11-07 19:49           ` Mike Snitzer
2019-11-07 19:50           ` Mikulas Patocka
2019-11-07 20:16             ` Zdenek Kabelac

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.