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