From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tamas Lengyel Subject: [PATCH v3] tools/tests/mem-sharing/memshrtool share-all test Date: Sun, 7 Apr 2013 07:07:01 -0400 Message-ID: <20130407110659.GA11514@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: andres.lagarcavilla@gmail.com List-Id: xen-devel@lists.xenproject.org v3: Use max gpfn instead of tot_pages for sharing. Signed-off-by: Tamas Lengyel --- tools/tests/mem-sharing/memshrtool.c | 53 ++++++++++++++++++++++++++++++++++ 1 files changed, 53 insertions(+), 0 deletions(-) diff --git a/tools/tests/mem-sharing/memshrtool.c b/tools/tests/mem-sharing/memshrtool.c index db44294..49834e3 100644 --- a/tools/tests/mem-sharing/memshrtool.c +++ b/tools/tests/mem-sharing/memshrtool.c @@ -10,6 +10,7 @@ #include #include #include +#include #include "xenctrl.h" @@ -24,6 +25,8 @@ static int usage(const char* prog) printf(" share \n"); printf(" - Share two pages.\n"); printf(" unshare - Unshare a page by grabbing a writable map.\n"); + printf(" share-all \n"); + printf(" - Share all pages.\n"); printf(" add-to-physmap \n"); printf(" - Populate a page in a domain with a shared page.\n"); printf(" debug-gfn - Debug a particular domain and gfn.\n"); @@ -131,6 +134,56 @@ int main(int argc, const char** argv) munmap(map, 4096); R((int)!map); } + else if( !strcasecmp(cmd, "share-all") ) + { + domid_t domid; + domid_t source_domid; + uint64_t handle; + uint64_t source_handle; + uint64_t total_shared=0; + int ret; + uint64_t share_page; + int max_gfn, source_max_gfn; + + if( argc != 4 ) + return usage(argv[0]); + + domid = strtol(argv[2], NULL, 0); + source_domid = strtol(argv[3], NULL, 0); + + max_gfn=xc_domain_maximum_gpfn(xch, domid); + source_max_gfn=xc_domain_maximum_gpfn(xch, source_domid); + + printf("Max GFN: 0x%"PRIx32". Max source GFN: 0x%"PRIx32"\n", max_gfn, source_max_gfn); + + if(max_gfn != source_max_gfn) { + fprintf(stderr, "MAX GFN in source and destination domain doesn't match " + "(source: 0x%"PRIx32", destination 0x%"PRIx32")\n", max_gfn, source_max_gfn); + return 1; + } + + for(share_page=0;share_page<=max_gfn;++share_page) { + + ret=xc_memshr_nominate_gfn(xch, domid, share_page, &handle); + if(ret<0) { + continue; + } + + ret=xc_memshr_nominate_gfn(xch, source_domid, share_page, &source_handle); + if(ret<0) { + continue; + } + + ret=xc_memshr_share_gfns(xch, source_domid, share_page, source_handle, domid, share_page, handle); + + if(ret>=0) { + total_shared++; + } + } + + printf("Shared pages: %"PRIu64"\n", total_shared); + + } else if( !strcasecmp(cmd, "add-to-physmap") ) { domid_t domid; -- 1.7.2.5