xref: /kvmtool/builtin-stat.c (revision 4b1addaeed6f8c717b2b818e3f867829849d8e86)
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