[dm-devel] [PATCH] dm-writecache: change config parameters using messages
Maged Mokhtar
mmokhtar at petasan.org
Tue Nov 5 21:19:40 UTC 2019
Gentle ping please.
It could add flexibility in changing cache parameters after device creation.
On 22/09/2019 21:39, Maged Mokhtar wrote:
> Support changing configuration parameters using device-mapper messages
> E.g.
> dmsetup message vg1/lv1 0 high_watermark 60
>
> Signed-off-by: Maged Mokhtar <mmokhtar at 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]);
>
More information about the dm-devel
mailing list