From: Wei Liu <wei.liu2@citrix.com>
To: Xen-devel <xen-devel@lists.xenproject.org>
Cc: Anthony PERARD <anthony.perard@citrix.com>,
Wei Liu <wei.liu2@citrix.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Ian Jackson <Ian.Jackson@eu.citrix.com>,
Jan Beulich <JBeulich@suse.com>
Subject: [PATCH 3/3] libxl: update vcpus bitmap in retrieved guest config
Date: Tue, 7 Jun 2016 12:24:02 +0100 [thread overview]
Message-ID: <1465298642-5356-4-git-send-email-wei.liu2@citrix.com> (raw)
In-Reply-To: <1465298642-5356-1-git-send-email-wei.liu2@citrix.com>
... because the available vcpu bitmap can change during domain life time
due to cpu hotplug and unplug.
For QEMU upstream, we interrogate QEMU for the number of vcpus. For
others, we look directly into xenstore for information.
Reported-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Wei Liu <wei.liu2@citrix.com>
---
tools/libxl/libxl.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 91 insertions(+)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 006b83f..4f8b663 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -7222,6 +7222,57 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src)
(*dst)[i] = (*src)[i];
}
+static int libxl__update_avail_vcpus_qmp(libxl__gc *gc, uint32_t domid,
+ unsigned int max_vcpus,
+ libxl_bitmap *map)
+{
+ unsigned int count, i;
+ int rc;
+
+ /* For QEMU upstream we always need to return the number
+ * of cpus present to QEMU whether they are online or not;
+ * otherwise QEMU won't accept the saved state.
+ */
+ rc = libxl__qmp_query_cpus(gc, domid, &count);
+ if (rc) {
+ LOG(ERROR, "fail to get number of cpus for domain %d", domid);
+ goto out;
+ }
+
+ for (i = 0; i < count; i++)
+ libxl_bitmap_set(map, i);
+
+ rc = 0;
+out:
+ return rc;
+}
+
+static int libxl__update_avail_vcpus_xenstore(libxl__gc *gc, uint32_t domid,
+ unsigned int max_vcpus,
+ libxl_bitmap *map)
+{
+ int rc;
+ unsigned int i;
+ const char *dompath;
+
+ dompath = libxl__xs_get_dompath(gc, domid);
+ if (!dompath) {
+ rc = ERROR_FAIL;
+ goto out;
+ }
+
+ for (i = 0; i < max_vcpus; i++) {
+ const char *path = GCSPRINTF("%s/cpu/%u/availability", dompath, i);
+ const char *content = libxl__xs_read(gc, XBT_NULL, path);
+ if (!strncmp(content, "online", strlen("online")))
+ libxl_bitmap_set(map, i);
+ }
+
+ rc = 0;
+out:
+ return rc;
+}
+
int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid,
libxl_domain_config *d_config)
{
@@ -7270,6 +7321,46 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx, uint32_t domid,
libxl_dominfo_dispose(&info);
}
+ /* VCPUs */
+ {
+ libxl_bitmap *map = &d_config->b_info.avail_vcpus;
+ unsigned int max_vcpus = d_config->b_info.max_vcpus;
+
+ libxl_bitmap_dispose(map);
+ libxl_bitmap_init(map);
+ libxl_bitmap_alloc(CTX, map, max_vcpus);
+ libxl_bitmap_set_none(map);
+
+ switch (d_config->b_info.type) {
+ case LIBXL_DOMAIN_TYPE_HVM:
+ switch (d_config->b_info.device_model_version) {
+ case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN:
+ rc = libxl__update_avail_vcpus_qmp(gc, domid,
+ max_vcpus, map);
+ break;
+ case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
+ case LIBXL_DEVICE_MODEL_VERSION_NONE:
+ rc = libxl__update_avail_vcpus_xenstore(gc, domid,
+ max_vcpus, map);
+ break;
+ default:
+ abort();
+ }
+ break;
+ case LIBXL_DOMAIN_TYPE_PV:
+ rc = libxl__update_avail_vcpus_xenstore(gc, domid,
+ max_vcpus, map);
+ break;
+ default:
+ abort();
+ }
+
+ if (rc) {
+ LOG(ERROR, "fail to update available cpu map for domain %d", domid);
+ goto out;
+ }
+ }
+
/* Memory limits:
*
* Currently there are three memory limits:
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
next prev parent reply other threads:[~2016-06-07 11:24 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-07 11:23 [PATCH 0/3] libxl: update available vcpus map in retrieve configuration function Wei Liu
2016-06-07 11:24 ` [PATCH 1/3] libxl: introduce libxl__json_array_count Wei Liu
2016-06-07 11:24 ` [PATCH 2/3] libxl: introduce libxl__qmp_query_cpus Wei Liu
2016-06-07 11:24 ` Wei Liu [this message]
2016-06-07 14:45 ` [PATCH 3/3] libxl: update vcpus bitmap in retrieved guest config Anthony PERARD
2016-06-07 16:03 ` Wei Liu
2016-06-07 16:22 ` Dario Faggioli
2016-06-07 16:46 ` Wei Liu
2016-06-07 17:05 ` Dario Faggioli
2016-06-07 16:36 ` Anthony PERARD
2016-06-07 16:39 ` Wei Liu
2016-06-14 16:31 ` Ian Jackson
2016-06-14 16:39 ` Wei Liu
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=1465298642-5356-4-git-send-email-wei.liu2@citrix.com \
--to=wei.liu2@citrix.com \
--cc=Ian.Jackson@eu.citrix.com \
--cc=JBeulich@suse.com \
--cc=anthony.perard@citrix.com \
--cc=sstabellini@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).