|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] libxl: extract and save affinity maps from hypervisor
This is required to retain affinity setting across save/restore and
migration.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
tools/libxl/libxl_domain.c | 46 ++++++++++++++++++++++++++++++++++++---
1 file changed, 43 insertions(+), 3 deletions(-)
diff --git a/tools/libxl/libxl_domain.c b/tools/libxl/libxl_domain.c
index 3377bba..24fac9b 100644
--- a/tools/libxl/libxl_domain.c
+++ b/tools/libxl/libxl_domain.c
@@ -1603,16 +1603,18 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx,
uint32_t domid,
/* VCPUs */
{
- libxl_bitmap *map = &d_config->b_info.avail_vcpus;
- unsigned int max_vcpus = d_config->b_info.max_vcpus;
+ libxl_domain_build_info *b_info = &d_config->b_info;
+ libxl_bitmap *map = &b_info->avail_vcpus;
+ unsigned int max_vcpus = b_info->max_vcpus;
libxl_device_model_version version;
+ int i;
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) {
+ switch (b_info->type) {
case LIBXL_DOMAIN_TYPE_HVM:
version = libxl__device_model_version_running(gc, domid);
assert(version != LIBXL_DEVICE_MODEL_VERSION_UNKNOWN);
@@ -1642,6 +1644,44 @@ int libxl_retrieve_domain_configuration(libxl_ctx *ctx,
uint32_t domid,
LOGD(ERROR, domid, "Fail to update available cpu map");
goto out;
}
+
+ /* Affinity maps */
+
+#define REALLOC_AFFINITY_MAP(n) \
+ for (i = 0; i < b_info->num_vcpu_ ## n ## _affinity; i++) { \
+ libxl_bitmap *m = &b_info->vcpu_ ## n ## _affinity[i]; \
+ libxl_bitmap_dispose(m); \
+ libxl_bitmap_init(m); \
+ libxl_cpu_bitmap_alloc(CTX, m, 0); \
+ } \
+ b_info->vcpu_ ## n ## _affinity = \
+ libxl__realloc(NOGC, b_info->vcpu_ ## n ## _affinity, \
+ max_vcpus * sizeof(b_info->vcpu_ ## n ## _affinity[0])); \
+ for (i = b_info->num_vcpu_ ## n ## _affinity; i < max_vcpus; i++) { \
+ libxl_bitmap *m = &b_info->vcpu_ ## n ## _affinity[i]; \
+ libxl_bitmap_init(m); \
+ libxl_cpu_bitmap_alloc(CTX, m, 0); \
+ } \
+ b_info->num_vcpu_ ## n ## _affinity = max_vcpus;
+
+ REALLOC_AFFINITY_MAP(hard);
+ REALLOC_AFFINITY_MAP(soft);
+
+#undef REALLOC_AFFINITY_MAP
+
+ /* Get current maps from hypervisor */
+ for (i = 0; i < max_vcpus; i++) {
+ libxl_bitmap *hard = &b_info->vcpu_hard_affinity[i];
+ libxl_bitmap *soft = &b_info->vcpu_soft_affinity[i];
+
+ if (xc_vcpu_getaffinity(CTX->xch, domid, i, hard->map, soft->map,
+ XEN_VCPUAFFINITY_SOFT|XEN_VCPUAFFINITY_HARD) == -1) {
+ LOGED(ERROR, domid, "Getting vcpu affinity");
+ rc = ERROR_FAIL;
+ goto out;
+ }
+ }
+
}
/* Memory limits:
base-commit: 94b8b2e09290cca0fcd8afd930f7f083458b1afe
--
git-series 0.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |