|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 2/4] libxl: Allow a guest to inform a host about its maximum supported memory size
Allow a guest to inform a host about its maximum
supported memory size. This gives a chance to ignore
limit established at boot by maxmem and usage of memory
hotplug infrustacture if the guest OS supports it.
Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
---
tools/libxl/libxl.c | 58 +++++++++++++++++++++++++++++++-------------
tools/libxl/libxl_create.c | 3 +++
2 files changed, 44 insertions(+), 17 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 9906224..3427c13 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -3640,7 +3640,7 @@ int libxl_set_memory_target(libxl_ctx *ctx, uint32_t
domid,
{
GC_INIT(ctx);
int rc = 1, abort_transaction = 0;
- uint32_t memorykb = 0, videoram = 0;
+ uint32_t guestkb, memorykb = 0, videoram = 0;
uint32_t current_target_memkb = 0, new_target_memkb = 0;
char *memmax, *endptr, *videoram_s = NULL, *target = NULL;
char *dompath = libxl__xs_get_dompath(gc, domid);
@@ -3689,21 +3689,36 @@ retry_transaction:
xcinfo2xlinfo(&info, &ptr);
memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
- "%s/memory/static-max", dompath));
- if (!memmax) {
- LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
- "cannot get memory info from %s/memory/static-max\n",
- dompath);
- abort_transaction = 1;
- goto out;
- }
- memorykb = strtoul(memmax, &endptr, 10);
- if (*endptr != '\0') {
- LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
- "invalid max memory %s from %s/memory/static-max\n",
- memmax, dompath);
- abort_transaction = 1;
- goto out;
+ "%s/memory/guest-max", dompath));
+
+ if (memmax) {
+ guestkb = strtoul(memmax, &endptr, 10);
+ if (*endptr != '\0')
+ guestkb = 0;
+ } else
+ guestkb = 0;
+
+ if (!guestkb) {
+ memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
+ "%s/memory/static-max", dompath));
+
+ if (!memmax) {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+ "cannot get memory info from %s/memory/static-max\n",
+ dompath);
+ abort_transaction = 1;
+ goto out;
+ }
+
+ memorykb = strtoul(memmax, &endptr, 10);
+
+ if (*endptr != '\0') {
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR,
+ "invalid max memory %s from %s/memory/static-max\n",
+ memmax, dompath);
+ abort_transaction = 1;
+ goto out;
+ }
}
if (relative) {
@@ -3713,7 +3728,16 @@ retry_transaction:
new_target_memkb = current_target_memkb + target_memkb;
} else
new_target_memkb = target_memkb;
- if (new_target_memkb > memorykb) {
+
+ if (guestkb) {
+ if (new_target_memkb > guestkb) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "memory_dynamic_max must be less than or equal to"
+ " memory_guest_max\n");
+ abort_transaction = 1;
+ goto out;
+ }
+ } else if (new_target_memkb > memorykb) {
LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
"memory_dynamic_max must be less than or equal to"
" memory_static_max\n");
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index cb9c822..f57cbe9 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -512,6 +512,9 @@ retry_transaction:
libxl__sprintf(gc, "%s/device/suspend/event-channel",
dom_path),
rwperm, ARRAY_SIZE(rwperm));
libxl__xs_mkdir(gc, t,
+ libxl__sprintf(gc, "%s/memory/guest-max", dom_path),
+ rwperm, ARRAY_SIZE(rwperm));
+ libxl__xs_mkdir(gc, t,
libxl__sprintf(gc, "%s/data", dom_path),
rwperm, ARRAY_SIZE(rwperm));
if (info->type == LIBXL_DOMAIN_TYPE_HVM)
--
1.7.10.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |