@@ -49,6 +49,7 @@ TARGETS_COPY += xenpvnetboot
# Everything which needs to be built
TARGETS_BUILD := $(filter-out $(TARGETS_COPY),$(TARGETS_ALL))
+TARGETS_BUILD += xen-vcpus-stats
# ... including build-only targets
TARGETS_BUILD-$(CONFIG_X86) += xen-vmtrace
@@ -135,4 +136,9 @@ xencov: xencov.o
xen-ucode: xen-ucode.o
$(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(APPEND_LDFLAGS)
+xen-vcpus-stats.o: CFLAGS += $(CFLAGS_libxenforeginmemory)
+
+xen-vcpus-stats: xen-vcpus-stats.o
+ $(CC) $(LDFLAGS) -o $@ $< $(LDLIBS_libxenctrl) $(LDLIBS_libxenforeignmemory) $(APPEND_LDFLAGS)
+
-include $(DEPS_INCLUDE)
new file mode 100644
@@ -0,0 +1,76 @@
+#include <err.h>
+#include <errno.h>
+#include <error.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/mman.h>
+#include <signal.h>
+
+#include <xenctrl.h>
+#include <xenforeignmemory.h>
+#include <xen/vcpu.h>
+
+static sig_atomic_t interrupted;
+static void close_handler(int signum)
+{
+ interrupted = 1;
+}
+
+int main(int argc, char **argv)
+{
+ xenforeignmemory_handle *fh;
+ xenforeignmemory_resource_handle *res;
+ size_t size;
+ int rc, domid, frec, vcpu;
+ shared_vcpustatspage_t * info;
+ struct sigaction act;
+
+ if (argc != 4 ) {
+ fprintf(stderr, "Usage: %s <domid> <vcpu> <period>\n", argv[0]);
+ return 1;
+ }
+
+ domid = atoi(argv[1]);
+ vcpu = atoi(argv[2]);
+ frec = atoi(argv[3]);
+
+ act.sa_handler = close_handler;
+ act.sa_flags = 0;
+ sigemptyset(&act.sa_mask);
+ sigaction(SIGHUP, &act, NULL);
+ sigaction(SIGTERM, &act, NULL);
+ sigaction(SIGINT, &act, NULL);
+ sigaction(SIGALRM, &act, NULL);
+
+ fh = xenforeignmemory_open(NULL, 0);
+
+ if ( !fh )
+ err(1, "xenforeignmemory_open");
+
+ rc = xenforeignmemory_resource_size(
+ fh, domid, XENMEM_resource_stats_table,
+ 0, &size);
+
+ if ( rc )
+ err(1, "Fail: Get size");
+
+ res = xenforeignmemory_map_resource(
+ fh, domid, XENMEM_resource_stats_table,
+ 0, XENMEM_resource_stats_frame_vcpustats, size >> XC_PAGE_SHIFT,
+ (void **)&info, PROT_READ, 0);
+
+ if ( !res )
+ err(1, "Fail: Map");
+
+ while ( !interrupted ) {
+ sleep(frec);
+ printf("running cpu_time: %ld\n", info->vcpu_info[vcpu].runstate_running_time);
+ }
+
+ rc = xenforeignmemory_unmap_resource(fh, res);
+ if ( rc )
+ err(1, "Fail: Unmap");
+
+ return 0;
+}
Add a demostration tool that uses the stats_table resource to query vcpus' RUNSTATE_running counter for a DomU. Signed-off-by: Matias Ezequiel Vara Larsen <matias.vara@vates.fr> --- Changes in v1: - change the name of the tool to xen-vcpus-stats - set command line parameters in the same order that are passed - remove header libs.h - build by default - remove errno, strerrno, "\n", and identation - use errx when errno is not needed - address better the number of pages requested and error msgs - use the shared_vcpustatspage_t structure - use the correct frame id when requesting the resource --- tools/misc/Makefile | 6 +++ tools/misc/xen-vcpus-stats.c | 76 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 tools/misc/xen-vcpus-stats.c