All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Anthony PERARD" <anthony.perard@vates.tech>
To: "Juergen Gross" <jgross@suse.com>
Cc: xen-devel@lists.xenproject.org, "Julien Grall" <julien@xen.org>
Subject: Re: [PATCH 07/11] tools/xenstored: implement the GET/SET_QUOTA commands
Date: Mon, 16 Mar 2026 15:08:05 +0000	[thread overview]
Message-ID: <abgc1Azehzw_m9Ff@l14> (raw)
In-Reply-To: <20260305135208.2208663-8-jgross@suse.com>

On Thu, Mar 05, 2026 at 02:52:04PM +0100, Juergen Gross wrote:
> diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c
> index 8a06b35808..e283d47184 100644
> --- a/tools/xenstored/core.c
> +++ b/tools/xenstored/core.c
> @@ -2034,6 +2034,10 @@ static struct {
>  	    { "GET_FEATURE",   do_get_feature,  XS_FLAG_PRIV },
>  	[XS_SET_FEATURE]       =
>  	    { "SET_FEATURE",   do_set_feature,  XS_FLAG_PRIV },
> +	[XS_GET_QUOTA]         =
> +	    { "GET_QUOTA",     do_get_quota,    XS_FLAG_PRIV },
> +	[XS_SET_QUOTA]         =
> +	    { "SET_QUOTA",     do_set_quota,    XS_FLAG_PRIV },
>  };
>  
>  static const char *sockmsg_string(enum xsd_sockmsg_type type)
> diff --git a/tools/xenstored/domain.c b/tools/xenstored/domain.c
> index 8e52351695..c0bc8a3eb7 100644
> --- a/tools/xenstored/domain.c
> +++ b/tools/xenstored/domain.c
> @@ -1363,6 +1363,112 @@ static bool parse_quota_name(const char *name, unsigned int *qidx,
>  	return true;
>  }
>  
> +int do_get_quota(const void *ctx, struct connection *conn,
> +		 struct buffered_data *in)
> +{
> +	const char *vec[2];
> +	unsigned int n_pars;
> +	unsigned int domid;
> +	unsigned int q;
> +	unsigned int idx;
> +	char *resp;
> +	const char *name;
> +	const struct quota *quota;
> +	const struct domain *domain;
> +
> +	n_pars = get_strings(in, vec, ARRAY_SIZE(vec));
> +
> +	if (n_pars > 2)
> +		return EINVAL;
> +
> +	if (n_pars == 0) {
> +		resp = talloc_asprintf(ctx, "%s", "");

This could be written with talloc_strdup() instead, since there's no
formatting involve.

> +		if (!resp)
> +			return ENOMEM;
> +		for (q = 0; q < ACC_N; q++) {
> +			if (!quota_adm[q].name)
> +				continue;
> +			if (quotas[q].val[Q_IDX_HARD] != Q_VAL_DISABLED) {

Having set internally a value of Q_VAL_DISABLED, does it mean the named
quota is unsupported?

> +				resp = talloc_asprintf_append(resp, "%s%s",
> +					*resp ? " " : "", quota_adm[q].name);
> +				if (!resp)
> +					return ENOMEM;
> +			}
> +			if (quotas[q].val[Q_IDX_SOFT] != Q_VAL_DISABLED) {
> +				resp = talloc_asprintf_append(resp, "%ssoft-%s",
> +					*resp ? " " : "", quota_adm[q].name);
> +				if (!resp)
> +					return ENOMEM;
> +			}
> +		}
> +	} else {
> +		if (n_pars == 1) {
> +			quota = quotas;
> +			name = vec[0];
> +		} else {
> +			domid = atoi(vec[0]);

Shall we check that vec[0] actually contain a plausible domid? (An
integer between 0..65535). Right now, this accept everything, and would
return 0 if there's not a single digit.

> +			domain = find_or_alloc_existing_domain(domid);
> +			if (!domain)
> +				return ENOENT;
> +			quota = domain->acc;
> +			name = vec[1];
> +		}
> +
> +		if (parse_quota_name(name, &q, &idx))
> +			return EINVAL;
> +
> +		resp = talloc_asprintf(ctx, "%u", quota[q].val[idx]);

Why do we return 4294967295 for disabled quota check when the spec say
to return "0" when a quota check is disabled? That is for quota names
that are supposed to be not supported (if we ask "GET_QUOTA" first).

> +		if (!resp)
> +			return ENOMEM;
> +	}
> +
> +	send_reply(conn, XS_GET_QUOTA, resp, strlen(resp) + 1);
> +
> +	return 0;
> +}
> +
> +int do_set_quota(const void *ctx, struct connection *conn,
> +		 struct buffered_data *in)
> +{
> +	const char *vec[3];
> +	unsigned int n_pars;
> +	unsigned int domid;
> +	unsigned int q;
> +	unsigned int idx;
> +	const char *name;
> +	unsigned int val;
> +	struct quota *quota;
> +	struct domain *domain;
> +
> +	n_pars = get_strings(in, vec, ARRAY_SIZE(vec));
> +
> +	if (n_pars < 2 || n_pars > 3)
> +		return EINVAL;
> +
> +	if (n_pars == 2) {
> +		quota = quotas;
> +		name = vec[0];
> +		val = atoi(vec[1]);

We should check that vec[1] is a valid quota value, and also not an
internal value. Otherwise, we can just have "-1" on the wire, and have
unexpected changes for example. Only "0" is documented as a quota been
disabled, "-1" or "4294967295" isn't.

> +	} else {
> +		domid = atoi(vec[0]);
> +		domain = find_or_alloc_existing_domain(domid);
> +		if (!domain)
> +			return ENOENT;
> +		quota = domain->acc;
> +		name = vec[1];
> +		val = atoi(vec[2]);
> +	}
> +
> +	if (parse_quota_name(name, &q, &idx))
> +		return EINVAL;
> +
> +	quota[q].val[idx] = val;
> +
> +	send_ack(conn, XS_SET_QUOTA);
> +
> +	return 0;
> +}
> +
>  static int close_xgt_handle(void *_handle)
>  {
>  	xengnttab_close(*(xengnttab_handle **)_handle);
> diff --git a/tools/xenstored/domain.h b/tools/xenstored/domain.h
> index 62ce3b3166..6a06b0d1af 100644
> --- a/tools/xenstored/domain.h
> +++ b/tools/xenstored/domain.h
> @@ -93,6 +93,14 @@ int do_get_feature(const void *ctx, struct connection *conn,
>  int do_set_feature(const void *ctx, struct connection *conn,
>  		   struct buffered_data *in);
>  
> +/* Get quota names or value */

This could say "implement GET_QUOTA" or something instead. But a
comment here isn't going to give much value for internal functions.

> +int do_get_quota(const void *ctx, struct connection *conn,
> +		 struct buffered_data *in);
> +
> +/* Set quota value */
> +int do_set_quota(const void *ctx, struct connection *conn,
> +		 struct buffered_data *in);
> +
>  void domain_early_init(void);
>  void domain_init(int evtfd);
>  void init_domains(bool live_update);


Thanks,


--
Anthony Perard | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech



  reply	other threads:[~2026-03-16 15:08 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-05 13:51 [PATCH 00/11] tools: add support for per-domain xenstore quota Juergen Gross
2026-03-05 13:51 ` [PATCH 01/11] tools/libs/store: add get- and set-quota related functions Juergen Gross
2026-03-13 14:23   ` Anthony PERARD
2026-03-16  7:51     ` Jürgen Groß
2026-03-19 13:31       ` Anthony PERARD
2026-03-05 13:51 ` [PATCH 02/11] tools/xenstored: add central quota check functions Juergen Gross
2026-03-13 15:01   ` Anthony PERARD
2026-03-16  7:53     ` Jürgen Groß
2026-03-13 21:22   ` Jason Andryuk
2026-03-16  8:18     ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 03/11] tools/xenstored: rework hard_quotas and soft_quotas arrays Juergen Gross
2026-03-13 16:09   ` Anthony PERARD
2026-03-05 13:52 ` [PATCH 04/11] tools/xenstored: add GLOBAL_QUOTA_DATA record for live update Juergen Gross
2026-03-13 17:08   ` Anthony PERARD
2026-03-16  8:15     ` Jürgen Groß
2026-03-18 12:16       ` Juergen Gross
2026-03-19 16:15         ` Anthony PERARD
2026-03-19 16:31           ` Jürgen Groß
2026-03-19 15:59       ` Anthony PERARD
2026-03-05 13:52 ` [PATCH 05/11] tools/xenstored: split acc[] array in struct domain Juergen Gross
2026-03-13 17:15   ` Anthony PERARD
2026-03-05 13:52 ` [PATCH 06/11] tools/xenstored: add infrastructure for per-domain quotas Juergen Gross
2026-03-13 17:32   ` Anthony PERARD
2026-03-16  8:17     ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 07/11] tools/xenstored: implement the GET/SET_QUOTA commands Juergen Gross
2026-03-16 15:08   ` Anthony PERARD [this message]
2026-03-16 15:27     ` Juergen Gross
2026-03-19 16:47       ` Anthony PERARD
2026-03-20  6:36         ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 08/11] tools/libxl: add functions for retrieving and setting xenstore quota Juergen Gross
2026-03-10 13:58   ` Nick Rosbrook
2026-03-19  9:11   ` Anthony PERARD
2026-03-19 11:00     ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 09/11] tools/libxl: add support for xenstore quota in domain_config Juergen Gross
2026-03-10 13:57   ` Nick Rosbrook
2026-03-19  9:26   ` Anthony PERARD
2026-03-19 11:01     ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 10/11] tools/xl: add xl commands for xenstore quota operations Juergen Gross
2026-03-19 12:37   ` Anthony PERARD
2026-03-19 13:06     ` Jürgen Groß
2026-03-05 13:52 ` [PATCH 11/11] tools/xl: add support for xenstore quota setting via domain config Juergen Gross
2026-03-19 13:06   ` Anthony PERARD
2026-03-19 13:11     ` Jürgen Groß

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=abgc1Azehzw_m9Ff@l14 \
    --to=anthony.perard@vates.tech \
    --cc=jgross@suse.com \
    --cc=julien@xen.org \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.