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