aboutsummaryrefslogtreecommitdiffstats
path: root/tools/xenpaging
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:30:19 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-05-28 09:30:19 +0100
commit5cc436c1d2b3b0be3f42104582f53eec3969b43a (patch)
tree1e30ade146ee7287c486d1309b5d3d2c69a2d9b9 /tools/xenpaging
parent7f9a888af4b65cb8c22cea3c8295d30d0fedd623 (diff)
downloadxen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.tar.gz
xen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.tar.bz2
xen-5cc436c1d2b3b0be3f42104582f53eec3969b43a.zip
libxc: eliminate static variables, use xentoollog; API change
This patch eliminate the global variables in libxenctrl (used for logging and error reporting). Instead the information which was in the global variables is now in a new xc_interface* opaque structure, which xc_interface open returns instead of the raw file descriptor; furthermore, logging is done via xentoollog. There are three new parameters to xc_interface_open to control the logging, but existing callers can just pass "0" for all three to get the old behaviour. All libxc callers have been adjusted accordingly. Also update QEMU_TAG for corresponding qemu change. Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
Diffstat (limited to 'tools/xenpaging')
-rw-r--r--tools/xenpaging/file_ops.c1
-rw-r--r--tools/xenpaging/policy.h3
-rw-r--r--tools/xenpaging/policy_default.c3
-rw-r--r--tools/xenpaging/xc.c9
-rw-r--r--tools/xenpaging/xc.h7
-rw-r--r--tools/xenpaging/xenpaging.c44
-rw-r--r--tools/xenpaging/xenpaging.h2
7 files changed, 39 insertions, 30 deletions
diff --git a/tools/xenpaging/file_ops.c b/tools/xenpaging/file_ops.c
index 2d52827669..772d222637 100644
--- a/tools/xenpaging/file_ops.c
+++ b/tools/xenpaging/file_ops.c
@@ -22,6 +22,7 @@
#include <unistd.h>
+#include <stdarg.h>
#include <xc_private.h>
diff --git a/tools/xenpaging/policy.h b/tools/xenpaging/policy.h
index 5d7ed6c1db..0b8fa6cf46 100644
--- a/tools/xenpaging/policy.h
+++ b/tools/xenpaging/policy.h
@@ -29,7 +29,8 @@
int policy_init(xenpaging_t *paging);
-int policy_choose_victim(xenpaging_t *paging, domid_t domain_id,
+int policy_choose_victim(xc_interface *xch,
+ xenpaging_t *paging, domid_t domain_id,
xenpaging_victim_t *victim);
void policy_notify_paged_out(domid_t domain_id, unsigned long gfn);
void policy_notify_paged_in(domid_t domain_id, unsigned long gfn);
diff --git a/tools/xenpaging/policy_default.c b/tools/xenpaging/policy_default.c
index 599472edd5..1bb89e03ba 100644
--- a/tools/xenpaging/policy_default.c
+++ b/tools/xenpaging/policy_default.c
@@ -57,7 +57,8 @@ int policy_init(xenpaging_t *paging)
return rc;
}
-int policy_choose_victim(xenpaging_t *paging, domid_t domain_id,
+int policy_choose_victim(xc_interface *xch,
+ xenpaging_t *paging, domid_t domain_id,
xenpaging_victim_t *victim)
{
ASSERT(victim != NULL);
diff --git a/tools/xenpaging/xc.c b/tools/xenpaging/xc.c
index a5a396b3fd..3b9c836aa0 100644
--- a/tools/xenpaging/xc.c
+++ b/tools/xenpaging/xc.c
@@ -23,6 +23,7 @@
#include <errno.h>
#include <string.h>
+#include <stdarg.h>
#include <sys/poll.h>
#include <xc_private.h>
#include <xg_save_restore.h>
@@ -64,7 +65,7 @@ int xc_mem_paging_flush_ioemu_cache(domid_t domain_id)
return rc;
}
-int xc_wait_for_event_or_timeout(int xce_handle, unsigned long ms)
+int xc_wait_for_event_or_timeout(xc_interface *xch, int xce_handle, unsigned long ms)
{
struct pollfd fd = { .fd = xce_handle, .events = POLLIN | POLLERR };
int port;
@@ -105,12 +106,12 @@ int xc_wait_for_event_or_timeout(int xce_handle, unsigned long ms)
return -errno;
}
-int xc_wait_for_event(int xce_handle)
+int xc_wait_for_event(xc_interface *xch, int xce_handle)
{
- return xc_wait_for_event_or_timeout(xce_handle, -1);
+ return xc_wait_for_event_or_timeout(xch, xce_handle, -1);
}
-int xc_get_platform_info(int xc_handle, domid_t domain_id,
+int xc_get_platform_info(xc_interface *xc_handle, domid_t domain_id,
xc_platform_info_t *platform_info)
{
return get_platform_info(xc_handle, domain_id,
diff --git a/tools/xenpaging/xc.h b/tools/xenpaging/xc.h
index 19da10767a..5febb89ef3 100644
--- a/tools/xenpaging/xc.h
+++ b/tools/xenpaging/xc.h
@@ -25,6 +25,7 @@
#define __XC_H__
+#include <stdarg.h>
#include <xc_private.h>
#include <xen/mem_event.h>
@@ -52,10 +53,10 @@ typedef struct xc_platform_info {
int alloc_bitmap(unsigned long **bitmap, unsigned long bitmap_size);
int xc_mem_paging_flush_ioemu_cache(domid_t domain_id);
-int xc_wait_for_event(int xce_handle);
-int xc_wait_for_event_or_timeout(int xce_handle, unsigned long ms);
+int xc_wait_for_event(xc_interface *xch, int xce_handle);
+int xc_wait_for_event_or_timeout(xc_interface *xch, int xce_handle, unsigned long ms);
-int xc_get_platform_info(int xc_handle, domid_t domain_id,
+int xc_get_platform_info(xc_interface *xc_handle, domid_t domain_id,
xc_platform_info_t *platform_info);
diff --git a/tools/xenpaging/xenpaging.c b/tools/xenpaging/xenpaging.c
index 1c91ba8b1d..25ad5c44ee 100644
--- a/tools/xenpaging/xenpaging.c
+++ b/tools/xenpaging/xenpaging.c
@@ -22,6 +22,7 @@
#include <inttypes.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <xc_private.h>
#include <xen/mem_event.h>
@@ -66,24 +67,24 @@ static void *init_page(void)
return NULL;
}
-xenpaging_t *xenpaging_init(domid_t domain_id)
+xenpaging_t *xenpaging_init(xc_interface **xch_r, domid_t domain_id)
{
xenpaging_t *paging;
+ xc_interface *xch;
int rc;
+ xch = xc_interface_open(0,0,0);
+ if ( !xch ) return NULL;
+
DPRINTF("xenpaging init\n");
+ *xch_r = xch;
/* Allocate memory */
paging = malloc(sizeof(xenpaging_t));
memset(paging, 0, sizeof(xenpaging_t));
/* Open connection to xen */
- paging->xc_handle = xc_interface_open();
- if ( paging->xc_handle < 0 )
- {
- ERROR("Failed to open connection to Xen");
- goto err;
- }
+ paging->xc_handle = xch;
/* Set domain id */
paging->mem_event.domain_id = domain_id;
@@ -208,7 +209,7 @@ xenpaging_t *xenpaging_init(domid_t domain_id)
return NULL;
}
-int xenpaging_teardown(xenpaging_t *paging)
+int xenpaging_teardown(xc_interface *xch, xenpaging_t *paging)
{
int rc;
@@ -248,7 +249,7 @@ int xenpaging_teardown(xenpaging_t *paging)
ERROR("Error closing connection to xen");
goto err;
}
- paging->xc_handle = -1;
+ paging->xc_handle = NULL;
return 0;
@@ -302,7 +303,8 @@ static int put_response(mem_event_t *mem_event, mem_event_response_t *rsp)
return 0;
}
-int xenpaging_evict_page(xenpaging_t *paging, xenpaging_victim_t *victim, int fd, int i)
+int xenpaging_evict_page(xc_interface *xch, xenpaging_t *paging,
+ xenpaging_victim_t *victim, int fd, int i)
{
void *page;
unsigned long gfn;
@@ -373,7 +375,8 @@ int xenpaging_resume_page(xenpaging_t *paging, mem_event_response_t *rsp)
return ret;
}
-int xenpaging_populate_page(xenpaging_t *paging, unsigned long *gfn, int fd, int i)
+int xenpaging_populate_page(xc_interface *xch, xenpaging_t *paging,
+ unsigned long *gfn, int fd, int i)
{
void *page;
int ret;
@@ -411,7 +414,7 @@ int xenpaging_populate_page(xenpaging_t *paging, unsigned long *gfn, int fd, int
return ret;
}
-static int evict_victim(xenpaging_t *paging, domid_t domain_id,
+static int evict_victim(xc_interface *xch, xenpaging_t *paging, domid_t domain_id,
xenpaging_victim_t *victim, int fd, int i)
{
int j = 0;
@@ -419,7 +422,7 @@ static int evict_victim(xenpaging_t *paging, domid_t domain_id,
do
{
- ret = policy_choose_victim(paging, domain_id, victim);
+ ret = policy_choose_victim(xch, paging, domain_id, victim);
if ( ret != 0 )
{
ERROR("Error choosing victim");
@@ -429,7 +432,7 @@ static int evict_victim(xenpaging_t *paging, domid_t domain_id,
ret = xc_mem_paging_nominate(paging->xc_handle,
paging->mem_event.domain_id, victim->gfn);
if ( ret == 0 )
- ret = xenpaging_evict_page(paging, victim, fd, i);
+ ret = xenpaging_evict_page(xch, paging, victim, fd, i);
else
{
if ( j++ % 1000 == 0 )
@@ -459,6 +462,7 @@ int main(int argc, char *argv[])
int i;
int rc = -1;
int rc1;
+ xc_interface *xch;
int open_flags = O_CREAT | O_TRUNC | O_RDWR;
mode_t open_mode = S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IWGRP | S_IWOTH;
@@ -489,7 +493,7 @@ int main(int argc, char *argv[])
srand(time(NULL));
/* Initialise domain paging */
- paging = xenpaging_init(domain_id);
+ paging = xenpaging_init(&xch, domain_id);
if ( paging == NULL )
{
ERROR("Error initialising paging");
@@ -500,7 +504,7 @@ int main(int argc, char *argv[])
memset(victims, 0, sizeof(xenpaging_victim_t) * num_pages);
for ( i = 0; i < num_pages; i++ )
{
- evict_victim(paging, domain_id, &victims[i], fd, i);
+ evict_victim(xch, paging, domain_id, &victims[i], fd, i);
if ( i % 100 == 0 )
DPRINTF("%d pages evicted\n", i);
}
@@ -511,7 +515,7 @@ int main(int argc, char *argv[])
while ( 1 )
{
/* Wait for Xen to signal that a page needs paged in */
- rc = xc_wait_for_event_or_timeout(paging->mem_event.xce_handle, 100);
+ rc = xc_wait_for_event_or_timeout(xch, paging->mem_event.xce_handle, 100);
if ( rc < -1 )
{
ERROR("Error getting event");
@@ -549,7 +553,7 @@ int main(int argc, char *argv[])
}
/* Populate the page */
- rc = xenpaging_populate_page(paging, &req.gfn, fd, i);
+ rc = xenpaging_populate_page(xch, paging, &req.gfn, fd, i);
if ( rc != 0 )
{
ERROR("Error populating page");
@@ -570,7 +574,7 @@ int main(int argc, char *argv[])
}
/* Evict a new page to replace the one we just paged in */
- evict_victim(paging, domain_id, &victims[i], fd, i);
+ evict_victim(xch, paging, domain_id, &victims[i], fd, i);
}
else
{
@@ -604,7 +608,7 @@ int main(int argc, char *argv[])
free(victims);
/* Tear down domain paging */
- rc1 = xenpaging_teardown(paging);
+ rc1 = xenpaging_teardown(xch, paging);
if ( rc1 != 0 )
ERROR("Error tearing down paging");
diff --git a/tools/xenpaging/xenpaging.h b/tools/xenpaging/xenpaging.h
index 3c897ca381..d8451937d3 100644
--- a/tools/xenpaging/xenpaging.h
+++ b/tools/xenpaging/xenpaging.h
@@ -36,7 +36,7 @@
typedef struct xenpaging {
- int xc_handle;
+ xc_interface *xc_handle;
xc_platform_info_t *platform_info;
xc_domaininfo_t *domain_info;