1*bc10d2c1SSasha Levin #include <kvm/util.h> 2*bc10d2c1SSasha Levin #include <kvm/kvm-cmd.h> 3*bc10d2c1SSasha Levin #include <kvm/builtin-stat.h> 4*bc10d2c1SSasha Levin #include <kvm/kvm.h> 5*bc10d2c1SSasha Levin #include <kvm/parse-options.h> 6*bc10d2c1SSasha Levin 7*bc10d2c1SSasha Levin #include <stdio.h> 8*bc10d2c1SSasha Levin #include <string.h> 9*bc10d2c1SSasha Levin #include <signal.h> 10*bc10d2c1SSasha Levin 11*bc10d2c1SSasha Levin static bool mem; 12*bc10d2c1SSasha Levin static bool all; 13*bc10d2c1SSasha Levin static u64 instance_pid; 14*bc10d2c1SSasha Levin static const char *instance_name; 15*bc10d2c1SSasha Levin 16*bc10d2c1SSasha Levin static const char * const stat_usage[] = { 17*bc10d2c1SSasha Levin "kvm stat [command] [--all] [-n name] [-p pid]", 18*bc10d2c1SSasha Levin NULL 19*bc10d2c1SSasha Levin }; 20*bc10d2c1SSasha Levin 21*bc10d2c1SSasha Levin static const struct option stat_options[] = { 22*bc10d2c1SSasha Levin OPT_GROUP("Commands options:"), 23*bc10d2c1SSasha Levin OPT_BOOLEAN('m', "memory", &mem, "Display memory statistics"), 24*bc10d2c1SSasha Levin OPT_GROUP("Instance options:"), 25*bc10d2c1SSasha Levin OPT_BOOLEAN('a', "all", &all, "All instances"), 26*bc10d2c1SSasha Levin OPT_STRING('n', "name", &instance_name, "name", "Instance name"), 27*bc10d2c1SSasha Levin OPT_U64('p', "pid", &instance_pid, "Instance pid"), 28*bc10d2c1SSasha Levin OPT_END() 29*bc10d2c1SSasha Levin }; 30*bc10d2c1SSasha Levin 31*bc10d2c1SSasha Levin static void parse_stat_options(int argc, const char **argv) 32*bc10d2c1SSasha Levin { 33*bc10d2c1SSasha Levin while (argc != 0) { 34*bc10d2c1SSasha Levin argc = parse_options(argc, argv, stat_options, stat_usage, 35*bc10d2c1SSasha Levin PARSE_OPT_STOP_AT_NON_OPTION); 36*bc10d2c1SSasha Levin if (argc != 0) 37*bc10d2c1SSasha Levin kvm_stat_help(); 38*bc10d2c1SSasha Levin } 39*bc10d2c1SSasha Levin } 40*bc10d2c1SSasha Levin 41*bc10d2c1SSasha Levin void kvm_stat_help(void) 42*bc10d2c1SSasha Levin { 43*bc10d2c1SSasha Levin usage_with_options(stat_usage, stat_options); 44*bc10d2c1SSasha Levin } 45*bc10d2c1SSasha Levin 46*bc10d2c1SSasha Levin static int do_memstat(const char *name, int pid) 47*bc10d2c1SSasha Levin { 48*bc10d2c1SSasha Levin printf("Sending memstat command to %s, output should be on the targets' terminal.\n", name); 49*bc10d2c1SSasha Levin return kill(pid, SIGKVMMEMSTAT); 50*bc10d2c1SSasha Levin } 51*bc10d2c1SSasha Levin 52*bc10d2c1SSasha Levin int kvm_cmd_stat(int argc, const char **argv, const char *prefix) 53*bc10d2c1SSasha Levin { 54*bc10d2c1SSasha Levin parse_stat_options(argc, argv); 55*bc10d2c1SSasha Levin 56*bc10d2c1SSasha Levin if (!mem) 57*bc10d2c1SSasha Levin usage_with_options(stat_usage, stat_options); 58*bc10d2c1SSasha Levin 59*bc10d2c1SSasha Levin if (mem && all) 60*bc10d2c1SSasha Levin return kvm__enumerate_instances(do_memstat); 61*bc10d2c1SSasha Levin 62*bc10d2c1SSasha Levin if (instance_name == NULL && 63*bc10d2c1SSasha Levin instance_pid == 0) 64*bc10d2c1SSasha Levin kvm_stat_help(); 65*bc10d2c1SSasha Levin 66*bc10d2c1SSasha Levin if (instance_name) 67*bc10d2c1SSasha Levin instance_pid = kvm__get_pid_by_instance(instance_name); 68*bc10d2c1SSasha Levin 69*bc10d2c1SSasha Levin if (instance_pid <= 0) 70*bc10d2c1SSasha Levin die("Failed locating instance"); 71*bc10d2c1SSasha Levin 72*bc10d2c1SSasha Levin if (mem) { 73*bc10d2c1SSasha Levin printf("Sending memstat command to designated instance, output should be on the targets' terminal.\n"); 74*bc10d2c1SSasha Levin 75*bc10d2c1SSasha Levin return kill(instance_pid, SIGKVMMEMSTAT); 76*bc10d2c1SSasha Levin } 77*bc10d2c1SSasha Levin 78*bc10d2c1SSasha Levin return 0; 79*bc10d2c1SSasha Levin } 80