}
}
-int set_memory_max(char *p, char *mem)
+static int64_t parse_mem_size_kb(char *mem)
{
char *endptr;
- uint32_t memorykb;
+ int64_t kbytes;
+
+ kbytes = strtoll(mem, &endptr, 10);
+
+ if (strlen(endptr) > 1)
+ return -1;
+
+ switch (tolower(*endptr)) {
+ case 't':
+ kbytes <<= 10;
+ case 'g':
+ kbytes <<= 10;
+ case 'm':
+ kbytes <<= 10;
+ case '\0':
+ case 'k':
+ break;
+ case 'b':
+ kbytes >>= 10;
+ break;
+ default:
+ return -1;
+ }
+
+ return kbytes;
+}
+
+int set_memory_max(char *p, char *mem)
+{
+ int64_t memorykb;
int rc;
find_domain(p);
- memorykb = strtoul(mem, &endptr, 10);
- if (*endptr != '\0') {
+ memorykb = parse_mem_size_kb(mem);
+ if (memorykb == -1) {
fprintf(stderr, "invalid memory size: %s\n", mem);
exit(3);
}
void set_memory_target(char *p, char *mem)
{
- char *endptr;
- uint32_t memorykb;
+ long long int memorykb;
find_domain(p);
- memorykb = strtoul(mem, &endptr, 10);
- if (*endptr != '\0') {
+ memorykb = parse_mem_size_kb(mem);
+ if (memorykb == -1) {
fprintf(stderr, "invalid memory size: %s\n", mem);
exit(3);
}
- printf("setting domid %d memory to : %d\n", domid, memorykb);
+
+ printf("setting domid %d memory to : %lld\n", domid, memorykb);
libxl_set_memory_target(&ctx, domid, memorykb, /* enforce */ 1);
}
},
{ "mem-max",
&main_memmax,
- "Set the maximum amount reservation for a domain",
+ "Set the maximum amount reservation for a domain.\n"
+ "Units default to kilobytes, but can be suffixed with\n"
+ "'b' (bytes), 'k' (KB), 'm' (MB), 'g' (GB) or 't' (TB)",
"<Domain> <MemKB>",
},
{ "mem-set",
&main_memset,
- "Set the current memory usage for a domain",
+ "Set the current memory usage for a domain.\n"
+ "Units default to kilobytes, but can be suffixed with\n"
+ "'b' (bytes), 'k' (KB), 'm' (MB), 'g' (GB) or 't' (TB)",
"<Domain> <MemKB>",
},
{ "button-press",