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