xref: /kvmtool/builtin-balloon.c (revision 174a3fa33b0f4ef9396c31d2b41c32d5c824de97)
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>
104b1addaeSSasha Levin #include <kvm/kvm-ipc.h>
115cac5d9cSSasha Levin 
12790142ecSSasha Levin static const char *instance_name;
13790142ecSSasha Levin static u64 inflate;
14790142ecSSasha Levin static u64 deflate;
15790142ecSSasha Levin 
16c9cba791SPekka Enberg static const char * const balloon_usage[] = {
178d2ff5daSWanlong Gao 	"lkvm balloon [-n name] [-p pid] [-i amount] [-d amount]",
18790142ecSSasha Levin 	NULL
19790142ecSSasha Levin };
20790142ecSSasha Levin 
21c9cba791SPekka Enberg static const struct option balloon_options[] = {
22790142ecSSasha Levin 	OPT_GROUP("Instance options:"),
23790142ecSSasha Levin 	OPT_STRING('n', "name", &instance_name, "name", "Instance name"),
24790142ecSSasha Levin 	OPT_GROUP("Balloon options:"),
25*174a3fa3SWilliam Dauchy 	OPT_U64('i', "inflate", &inflate, "Amount to inflate (in MB)"),
26*174a3fa3SWilliam Dauchy 	OPT_U64('d', "deflate", &deflate, "Amount to deflate (in MB)"),
27790142ecSSasha Levin 	OPT_END(),
28c9cba791SPekka Enberg };
29c9cba791SPekka Enberg 
kvm_balloon_help(void)300725673aSSasha Levin void kvm_balloon_help(void)
310725673aSSasha Levin {
320725673aSSasha Levin 	usage_with_options(balloon_usage, balloon_options);
330725673aSSasha Levin }
340725673aSSasha Levin 
parse_balloon_options(int argc,const char ** argv)35790142ecSSasha Levin static void parse_balloon_options(int argc, const char **argv)
36790142ecSSasha Levin {
37790142ecSSasha Levin 	while (argc != 0) {
38790142ecSSasha Levin 		argc = parse_options(argc, argv, balloon_options, balloon_usage,
39790142ecSSasha Levin 				PARSE_OPT_STOP_AT_NON_OPTION);
40790142ecSSasha Levin 		if (argc != 0)
41790142ecSSasha Levin 			kvm_balloon_help();
42790142ecSSasha Levin 	}
43790142ecSSasha Levin }
44790142ecSSasha Levin 
kvm_cmd_balloon(int argc,const char ** argv,const char * prefix)455cac5d9cSSasha Levin int kvm_cmd_balloon(int argc, const char **argv, const char *prefix)
465cac5d9cSSasha Levin {
47a4670ad1SLai Jiangshan 	int instance;
484b1addaeSSasha Levin 	int r;
4949669299SLai Jiangshan 	int amount;
505cac5d9cSSasha Levin 
51790142ecSSasha Levin 	parse_balloon_options(argc, argv);
52790142ecSSasha Levin 
53790142ecSSasha Levin 	if (inflate == 0 && deflate == 0)
540725673aSSasha Levin 		kvm_balloon_help();
555cac5d9cSSasha Levin 
56a4670ad1SLai Jiangshan 	if (instance_name == NULL)
57790142ecSSasha Levin 		kvm_balloon_help();
585cac5d9cSSasha Levin 
594b1addaeSSasha Levin 	instance = kvm__get_sock_by_instance(instance_name);
605cac5d9cSSasha Levin 
614b1addaeSSasha Levin 	if (instance <= 0)
62790142ecSSasha Levin 		die("Failed locating instance");
635cac5d9cSSasha Levin 
64790142ecSSasha Levin 	if (inflate)
6549669299SLai Jiangshan 		amount = inflate;
66790142ecSSasha Levin 	else if (deflate)
6749669299SLai Jiangshan 		amount = -deflate;
68790142ecSSasha Levin 	else
69790142ecSSasha Levin 		kvm_balloon_help();
705cac5d9cSSasha Levin 
7149669299SLai Jiangshan 	r = kvm_ipc__send_msg(instance, KVM_IPC_BALLOON,
7249669299SLai Jiangshan 			sizeof(amount), (u8 *)&amount);
734b1addaeSSasha Levin 
744b1addaeSSasha Levin 	close(instance);
754b1addaeSSasha Levin 
764b1addaeSSasha Levin 	if (r < 0)
774b1addaeSSasha Levin 		return -1;
784b1addaeSSasha Levin 
795cac5d9cSSasha Levin 	return 0;
805cac5d9cSSasha Levin }
81