xref: /kvmtool/builtin-balloon.c (revision 790142ec29168bf50beee617d40bc08b28d2b824)
15cac5d9cSSasha Levin #include <stdio.h>
25cac5d9cSSasha Levin #include <string.h>
35cac5d9cSSasha Levin #include <signal.h>
45cac5d9cSSasha Levin 
55cac5d9cSSasha Levin #include <kvm/util.h>
65cac5d9cSSasha Levin #include <kvm/kvm-cmd.h>
72a24f96dSSasha Levin #include <kvm/builtin-balloon.h>
8c9cba791SPekka Enberg #include <kvm/parse-options.h>
95cac5d9cSSasha Levin #include <kvm/kvm.h>
105cac5d9cSSasha Levin 
11*790142ecSSasha Levin static u64 instance_pid;
12*790142ecSSasha Levin static const char *instance_name;
13*790142ecSSasha Levin static u64 inflate;
14*790142ecSSasha Levin static u64 deflate;
15*790142ecSSasha Levin 
16c9cba791SPekka Enberg static const char * const balloon_usage[] = {
17c9cba791SPekka Enberg 	"kvm balloon {inflate|deflate} <size in MiB> <instance name>",
18c9cba791SPekka Enberg 	NULL
19c9cba791SPekka Enberg };
20c9cba791SPekka Enberg 
21*790142ecSSasha Levin static const char * const debug_usage[] = {
22*790142ecSSasha Levin 	"kvm balloon [-n name] [-p pid] [-i amount] [-d amount]",
23*790142ecSSasha Levin 	NULL
24*790142ecSSasha Levin };
25*790142ecSSasha Levin 
26c9cba791SPekka Enberg static const struct option balloon_options[] = {
27*790142ecSSasha Levin 	OPT_GROUP("Instance options:"),
28*790142ecSSasha Levin 	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
29*790142ecSSasha Levin 	OPT_U64('p', "pid", &instance_pid, "Instance pid"),
30*790142ecSSasha Levin 	OPT_GROUP("Balloon options:"),
31*790142ecSSasha Levin 	OPT_U64('i', "inflate", &inflate, "Amount to inflate"),
32*790142ecSSasha Levin 	OPT_U64('d', "deflate", &deflate, "Amount to deflate"),
33*790142ecSSasha Levin 	OPT_END(),
34c9cba791SPekka Enberg };
35c9cba791SPekka Enberg 
360725673aSSasha Levin void kvm_balloon_help(void)
370725673aSSasha Levin {
380725673aSSasha Levin 	usage_with_options(balloon_usage, balloon_options);
390725673aSSasha Levin }
400725673aSSasha Levin 
41*790142ecSSasha Levin static void parse_balloon_options(int argc, const char **argv)
42*790142ecSSasha Levin {
43*790142ecSSasha Levin 	while (argc != 0) {
44*790142ecSSasha Levin 		argc = parse_options(argc, argv, balloon_options, balloon_usage,
45*790142ecSSasha Levin 				PARSE_OPT_STOP_AT_NON_OPTION);
46*790142ecSSasha Levin 		if (argc != 0)
47*790142ecSSasha Levin 			kvm_balloon_help();
48*790142ecSSasha Levin 	}
49*790142ecSSasha Levin }
50*790142ecSSasha Levin 
515cac5d9cSSasha Levin int kvm_cmd_balloon(int argc, const char **argv, const char *prefix)
525cac5d9cSSasha Levin {
53*790142ecSSasha Levin 	u64 i;
545cac5d9cSSasha Levin 
55*790142ecSSasha Levin 	parse_balloon_options(argc, argv);
56*790142ecSSasha Levin 
57*790142ecSSasha Levin 	if (inflate == 0 && deflate == 0)
580725673aSSasha Levin 		kvm_balloon_help();
595cac5d9cSSasha Levin 
60*790142ecSSasha Levin 	if (instance_name == NULL &&
61*790142ecSSasha Levin 	    instance_pid == 0)
62*790142ecSSasha Levin 		kvm_balloon_help();
635cac5d9cSSasha Levin 
64*790142ecSSasha Levin 	if (instance_name)
65*790142ecSSasha Levin 		instance_pid = kvm__get_pid_by_instance(argv[0]);
665cac5d9cSSasha Levin 
67*790142ecSSasha Levin 	if (instance_pid <= 0)
68*790142ecSSasha Levin 		die("Failed locating instance");
695cac5d9cSSasha Levin 
70*790142ecSSasha Levin 	if (inflate)
71*790142ecSSasha Levin 		for (i = 0; i < inflate; i++)
72*790142ecSSasha Levin 			kill(instance_pid, SIGKVMADDMEM);
73*790142ecSSasha Levin 	else if (deflate)
74*790142ecSSasha Levin 		for (i = 0; i < deflate; i++)
75*790142ecSSasha Levin 			kill(instance_pid, SIGKVMDELMEM);
76*790142ecSSasha Levin 	else
77*790142ecSSasha Levin 		kvm_balloon_help();
785cac5d9cSSasha Levin 
795cac5d9cSSasha Levin 	return 0;
805cac5d9cSSasha Levin }
81