|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v4 1/4] xl: Allow user to configure xl mem-set behavior
Add mem_set_enforce_limit option to xl.conf file and equivalent xl
command line option. Those two things give a chance to align xl mem-set
behavior to xm mem-set behavior. Default xl mem-set behavior is not
changed.
v4 - suggestions/fixes:
- add limit check for mem_set_enforce_limit=0 case,
- fix some error messages.
v3 - suggestions/fixes:
- add xl command line option
(suggested by Ian Jackson).
Signed-off-by: Daniel Kiper <daniel.kiper@xxxxxxxxxx>
---
tools/libxl/libxl.c | 25 ++++++++++++++++++-------
tools/libxl/xl.c | 4 ++++
tools/libxl/xl.h | 1 +
tools/libxl/xl_cmdimpl.c | 16 ++++++++++------
tools/libxl/xl_cmdtable.c | 3 ++-
5 files changed, 35 insertions(+), 14 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 30302c7..9906224 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -3517,7 +3517,7 @@ int libxl_domain_setmaxmem(libxl_ctx *ctx, uint32_t
domid, uint32_t max_memkb)
}
if (max_memkb < memorykb) {
- LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "memory_static_max must be
greater than or or equal to memory_dynamic_max\n");
+ LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "memory_xen_max must be
greater than or equal to memory_dynamic_max\n");
goto out;
}
rc = xc_domain_setmaxmem(ctx->xch, domid, max_memkb +
LIBXL_MAXMEM_CONSTANT);
@@ -3678,6 +3678,16 @@ retry_transaction:
goto out;
}
}
+
+ rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
+
+ if (rc != 1 || info.domain != domid) {
+ abort_transaction = 1;
+ goto out;
+ }
+
+ xcinfo2xlinfo(&info, &ptr);
+
memmax = libxl__xs_read(gc, t, libxl__sprintf(gc,
"%s/memory/static-max", dompath));
if (!memmax) {
@@ -3733,6 +3743,12 @@ retry_transaction:
abort_transaction = 1;
goto out;
}
+ } else if (new_target_memkb > ptr.max_memkb - LIBXL_MAXMEM_CONSTANT) {
+ LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
+ "memory_dynamic_max must be less than or equal to"
+ " memory_xen_max\n");
+ abort_transaction = 1;
+ goto out;
}
new_target_memkb -= videoram;
@@ -3749,12 +3765,7 @@ retry_transaction:
libxl__xs_write(gc, t, libxl__sprintf(gc, "%s/memory/target",
dompath), "%"PRIu32, new_target_memkb);
- rc = xc_domain_getinfolist(ctx->xch, domid, 1, &info);
- if (rc != 1 || info.domain != domid) {
- abort_transaction = 1;
- goto out;
- }
- xcinfo2xlinfo(&info, &ptr);
+
uuid = libxl__uuid2string(gc, ptr.uuid);
libxl__xs_write(gc, t, libxl__sprintf(gc, "/vm/%s/memory", uuid),
"%"PRIu32, new_target_memkb / 1024);
diff --git a/tools/libxl/xl.c b/tools/libxl/xl.c
index 3c141bf..2023230 100644
--- a/tools/libxl/xl.c
+++ b/tools/libxl/xl.c
@@ -39,6 +39,7 @@ xentoollog_logger_stdiostream *logger;
int dryrun_only;
int force_execution;
int autoballoon = -1;
+int mem_set_enforce_limit = 1;
char *blkdev_start;
int run_hotplug_scripts = 1;
char *lockfile;
@@ -107,6 +108,9 @@ static void parse_global_config(const char *configfile,
if (autoballoon == -1)
autoballoon = auto_autoballoon();
+ if (!xlu_cfg_get_long (config, "mem_set_enforce_limit", &l, 0))
+ mem_set_enforce_limit = l;
+
if (!xlu_cfg_get_long (config, "run_hotplug_scripts", &l, 0))
run_hotplug_scripts = l;
diff --git a/tools/libxl/xl.h b/tools/libxl/xl.h
index 771b4af..2281535 100644
--- a/tools/libxl/xl.h
+++ b/tools/libxl/xl.h
@@ -144,6 +144,7 @@ int xl_child_pid(xlchildnum); /* returns 0 if child struct
is not in use */
/* global options */
extern int autoballoon;
+extern int mem_set_enforce_limit;
extern int run_hotplug_scripts;
extern int dryrun_only;
extern libxl_defbool claim_mode;
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index c1a969b..76799fc 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -2475,7 +2475,7 @@ int main_memmax(int argc, char **argv)
return 0;
}
-static void set_memory_target(uint32_t domid, const char *mem)
+static void set_memory_target(uint32_t domid, const char *mem, int
enforce_limit)
{
long long int memorykb;
@@ -2485,23 +2485,27 @@ static void set_memory_target(uint32_t domid, const
char *mem)
exit(3);
}
- libxl_set_memory_target(ctx, domid, memorykb, 0, /* enforce */ 1);
+ libxl_set_memory_target(ctx, domid, memorykb, 0, enforce_limit);
}
int main_memset(int argc, char **argv)
{
uint32_t domid;
- int opt = 0;
+ int enforce_limit, opt = 0;
const char *mem;
- SWITCH_FOREACH_OPT(opt, "", NULL, "mem-set", 2) {
- /* No options */
+ enforce_limit = mem_set_enforce_limit;
+
+ SWITCH_FOREACH_OPT(opt, "e:", NULL, "mem-set", 2) {
+ case 'e':
+ enforce_limit = atoi(optarg) ? 1 : 0;
+ break;
}
domid = find_domain(argv[optind]);
mem = argv[optind + 1];
- set_memory_target(domid, mem);
+ set_memory_target(domid, mem, enforce_limit);
return 0;
}
diff --git a/tools/libxl/xl_cmdtable.c b/tools/libxl/xl_cmdtable.c
index 347302c..8918a57 100644
--- a/tools/libxl/xl_cmdtable.c
+++ b/tools/libxl/xl_cmdtable.c
@@ -196,7 +196,8 @@ struct cmd_spec cmd_table[] = {
{ "mem-set",
&main_memset, 0, 1,
"Set the current memory usage for a domain",
- "<Domain> <MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
+ "[-e <0|1>] <Domain>
<MemMB['b'[bytes]|'k'[KB]|'m'[MB]|'g'[GB]|'t'[TB]]>",
+ "-e <0|1> (Not)Enforce maximum memory allocation for a domain"
},
{ "button-press",
&main_button_press, 0, 1,
--
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 |