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