|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] tools/xenstored: support SET/GET_FEATURE commands
commit d239b81a171676c8473e203ff06313de6fd7d21a
Author: Juergen Gross <jgross@xxxxxxxx>
AuthorDate: Mon Jul 28 13:07:21 2025 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Mon Jul 28 13:07:21 2025 +0200
tools/xenstored: support SET/GET_FEATURE commands
Add support for XS_SET_FEATURE and XS_GET_FEATURE to xenstored.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
Reviewed-by: Jason Andryuk <jason.andryuk@xxxxxxx>
---
tools/xenstored/core.c | 4 ++++
tools/xenstored/domain.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
tools/xenstored/domain.h | 8 +++++++
3 files changed, 72 insertions(+)
diff --git a/tools/xenstored/core.c b/tools/xenstored/core.c
index 37e4dd5a5b..3022efdce1 100644
--- a/tools/xenstored/core.c
+++ b/tools/xenstored/core.c
@@ -2031,6 +2031,10 @@ static struct {
{ "SET_TARGET", do_set_target, XS_FLAG_PRIV },
[XS_RESET_WATCHES] = { "RESET_WATCHES", do_reset_watches },
[XS_DIRECTORY_PART] = { "DIRECTORY_PART", send_directory_part },
+ [XS_GET_FEATURE] =
+ { "GET_FEATURE", do_get_feature, XS_FLAG_PRIV },
+ [XS_SET_FEATURE] =
+ { "SET_FEATURE", do_set_feature, 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 24ee99cbc6..2362216a7a 100644
--- a/tools/xenstored/domain.c
+++ b/tools/xenstored/domain.c
@@ -1243,6 +1243,66 @@ int do_reset_watches(const void *ctx, struct connection
*conn,
return 0;
}
+int do_get_feature(const void *ctx, struct connection *conn,
+ struct buffered_data *in)
+{
+ const char *vec[1];
+ unsigned int n_args;
+ unsigned int domid;
+ const struct domain *domain;
+ unsigned int features;
+ char *result;
+
+ n_args = get_strings(in, vec, ARRAY_SIZE(vec));
+ if (n_args > 1)
+ return EINVAL;
+
+ if (n_args == 1) {
+ domid = atoi(vec[0]);
+ domain = find_or_alloc_existing_domain(domid);
+ if (!domain)
+ return ENOENT;
+ features = domain->features;
+ } else
+ features = XENSTORE_FEATURES;
+
+ result = talloc_asprintf(ctx, "%u", features);
+ if (!result)
+ return ENOMEM;
+
+ send_reply(conn, XS_GET_FEATURE, result, strlen(result) + 1);
+
+ return 0;
+}
+
+int do_set_feature(const void *ctx, struct connection *conn,
+ struct buffered_data *in)
+{
+ const char *vec[2];
+ unsigned int domid;
+ struct domain *domain;
+ unsigned int features;
+
+ if (get_strings(in, vec, ARRAY_SIZE(vec)) != ARRAY_SIZE(vec))
+ return EINVAL;
+
+ domid = atoi(vec[0]);
+ features = atoi(vec[1]);
+ domain = find_or_alloc_existing_domain(domid);
+ if (!domain)
+ return ENOENT;
+ if (domain->introduced)
+ return EBUSY;
+ if (features & ~XENSTORE_FEATURES)
+ return EINVAL;
+
+ domain->features = features;
+
+ send_ack(conn, XS_SET_FEATURE);
+
+ 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 8bfaca8f90..94481fdcc0 100644
--- a/tools/xenstored/domain.h
+++ b/tools/xenstored/domain.h
@@ -82,6 +82,14 @@ int do_get_domain_path(const void *ctx, struct connection
*conn,
int do_reset_watches(const void *ctx, struct connection *conn,
struct buffered_data *in);
+/* Get global or per domain server features */
+int do_get_feature(const void *ctx, struct connection *conn,
+ struct buffered_data *in);
+
+/* Set per domain server features */
+int do_set_feature(const void *ctx, struct connection *conn,
+ struct buffered_data *in);
+
void domain_early_init(void);
void domain_init(int evtfd);
void dom0_init(void);
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |