[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] tools: memshrtool: tool to test and exercise the sharing subsystem
# HG changeset patch # User Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> # Date 1327688622 0 # Node ID 8c0ef22c10096bc2afe50a2487e17242bfd21fb4 # Parent 502e0214bdb29ab5c6c8f2764e06604cc18e2635 tools: memshrtool: tool to test and exercise the sharing subsystem This is demo code meant to showcase how to perform sharing operations. It is useful for testing. [ Added appropriate lines to .hgignore and .gitignore -iwj ] Signed-off-by: Adin Scannell <adin@xxxxxxxxxxx> Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> Committed-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx> --- diff -r 502e0214bdb2 -r 8c0ef22c1009 .gitignore --- a/.gitignore Fri Jan 27 17:58:20 2012 +0000 +++ b/.gitignore Fri Jan 27 18:23:42 2012 +0000 @@ -210,6 +210,7 @@ tools/tests/regression/installed/* tools/tests/regression/build/* tools/tests/regression/downloads/* +tools/tests/mem-sharing/memshrtool tools/vnet/Make.local tools/vnet/build/* tools/vnet/gc diff -r 502e0214bdb2 -r 8c0ef22c1009 .hgignore --- a/.hgignore Fri Jan 27 17:58:20 2012 +0000 +++ b/.hgignore Fri Jan 27 18:23:42 2012 +0000 @@ -221,6 +221,7 @@ ^tools/tests/regression/build/.*$ ^tools/tests/regression/downloads/.*$ ^tools/tests/xen-access/xen-access$ +^tools/tests/mem-sharing/memshrtool$ ^tools/vnet/Make.local$ ^tools/vnet/build/.*$ ^tools/vnet/gc$ diff -r 502e0214bdb2 -r 8c0ef22c1009 tools/tests/mem-sharing/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/tests/mem-sharing/Makefile Fri Jan 27 18:23:42 2012 +0000 @@ -0,0 +1,26 @@ +XEN_ROOT=$(CURDIR)/../../.. +include $(XEN_ROOT)/tools/Rules.mk + +CFLAGS += -Werror + +CFLAGS += $(CFLAGS_libxenctrl) +CFLAGS += $(CFLAGS_xeninclude) + +TARGETS-y := +TARGETS-$(CONFIG_X86) += memshrtool +TARGETS := $(TARGETS-y) + +.PHONY: all +all: build + +.PHONY: build +build: $(TARGETS) + +.PHONY: clean +clean: + $(RM) *.o $(TARGETS) *~ $(DEPS) + +memshrtool: memshrtool.o + $(CC) -o $@ $< $(LDFLAGS) $(LDLIBS_libxenctrl) + +-include $(DEPS) diff -r 502e0214bdb2 -r 8c0ef22c1009 tools/tests/mem-sharing/memshrtool.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/tests/mem-sharing/memshrtool.c Fri Jan 27 18:23:42 2012 +0000 @@ -0,0 +1,165 @@ +/* + * memshrtool.c + * + * Copyright 2011 GridCentric Inc. (Adin Scannell, Andres Lagar-Cavilla) + */ + +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <sys/mman.h> + +#include "xenctrl.h" + +static int usage(const char* prog) +{ + printf("usage: %s <command> [args...]\n", prog); + printf("where <command> may be:\n"); + printf(" info - Display total sharing info.\n"); + printf(" enable - Enable sharing on a domain.\n"); + printf(" disable - Disable sharing on a domain.\n"); + printf(" nominate <domid> <gfn> - Nominate a page for sharing.\n"); + printf(" share <domid> <gfn> <handle> <source> <source-gfn> <source-handle>\n"); + printf(" - Share two pages.\n"); + printf(" unshare <domid> <gfn> - Unshare a page by grabbing a writable map.\n"); + printf(" add-to-physmap <domid> <gfn> <source> <source-gfn> <source-handle>\n"); + printf(" - Populate a page in a domain with a shared page.\n"); + printf(" debug-gfn <domid> <gfn> - Debug a particular domain and gfn.\n"); + return 1; +} + +#define R(f) do { \ + int rc = f; \ + if ( rc < 0 ) { \ + printf("error executing %s: %s\n", #f, \ + ((errno * -1) == XEN_DOMCTL_MEM_SHARING_C_HANDLE_INVALID) ? \ + "problem with client handle" :\ + ((errno * -1) == XEN_DOMCTL_MEM_SHARING_S_HANDLE_INVALID) ? \ + "problem with source handle" : strerror(errno)); \ + return rc; \ + } \ +} while(0) + +int main(int argc, const char** argv) +{ + const char* cmd = NULL; + xc_interface *xch = xc_interface_open(0, 0, 0); + + if( argc < 2 ) + return usage(argv[0]); + + cmd = argv[1]; + + if( !strcasecmp(cmd, "info") ) + { + if( argc != 2 ) + return usage(argv[0]); + + printf("used = %ld\n", xc_sharing_used_frames(xch)); + printf("freed = %ld\n", xc_sharing_freed_pages(xch)); + } + else if( !strcasecmp(cmd, "enable") ) + { + domid_t domid; + + if( argc != 3 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + R(xc_memshr_control(xch, domid, 1)); + } + else if( !strcasecmp(cmd, "disable") ) + { + domid_t domid; + + if( argc != 3 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + R(xc_memshr_control(xch, domid, 0)); + } + else if( !strcasecmp(cmd, "nominate") ) + { + domid_t domid; + unsigned long gfn; + uint64_t handle; + + if( argc != 4 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + gfn = strtol(argv[3], NULL, 0); + R(xc_memshr_nominate_gfn(xch, domid, gfn, &handle)); + printf("handle = 0x%08llx\n", (unsigned long long) handle); + } + else if( !strcasecmp(cmd, "share") ) + { + domid_t domid; + unsigned long gfn; + uint64_t handle; + domid_t source_domid; + unsigned long source_gfn; + uint64_t source_handle; + + if( argc != 8 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + gfn = strtol(argv[3], NULL, 0); + handle = strtol(argv[4], NULL, 0); + source_domid = strtol(argv[5], NULL, 0); + source_gfn = strtol(argv[6], NULL, 0); + source_handle = strtol(argv[7], NULL, 0); + R(xc_memshr_share_gfns(xch, source_domid, source_gfn, source_handle, domid, gfn, handle)); + } + else if( !strcasecmp(cmd, "unshare") ) + { + domid_t domid; + unsigned long gfn; + void *map; + + if( argc != 4 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + gfn = strtol(argv[3], NULL, 0); + map = xc_map_foreign_range(xch, domid, 4096, PROT_WRITE, gfn); + if( map ) + munmap(map, 4096); + R((int)!map); + } + else if( !strcasecmp(cmd, "add-to-physmap") ) + { + domid_t domid; + unsigned long gfn; + domid_t source_domid; + unsigned long source_gfn; + uint64_t source_handle; + + if( argc != 7 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + gfn = strtol(argv[3], NULL, 0); + source_domid = strtol(argv[4], NULL, 0); + source_gfn = strtol(argv[5], NULL, 0); + source_handle = strtol(argv[6], NULL, 0); + R(xc_memshr_add_to_physmap(xch, source_domid, source_gfn, source_handle, domid, gfn)); + } + else if( !strcasecmp(cmd, "debug-gfn") ) + { + domid_t domid; + unsigned long gfn; + + if( argc != 4 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + gfn = strtol(argv[3], NULL, 0); + R(xc_memshr_debug_gfn(xch, domid, gfn)); + } + + return 0; +} _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |