mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
xenpaging: drop xc.c, move xc_wait_for_event_or_timeout
Move xc_wait_for_event_or_timeout() into xenpaging and massage it a bit for further changes in subsequent patches. Include poll.h instead of sys/poll.h. Signed-off-by: Olaf Hering <olaf@aepfle.de> Committed-by: Ian Jackson <ian.jackson.citrix.com>
This commit is contained in:
1 parent
160e87fd49
commit
1a6a2f7c4d
3 files changed
+45
-44
No files matched your search
@@ -32,46 +32,6 @@
|
||||
|
||||
|
||||
|
||||
int xc_wait_for_event_or_timeout(xc_interface *xch, xc_evtchn *xce, unsigned long ms)
|
||||
{
|
||||
struct pollfd fd = { .fd = xc_evtchn_fd(xce), .events = POLLIN | POLLERR };
|
||||
int port;
|
||||
int rc;
|
||||
|
||||
rc = poll(&fd, 1, ms);
|
||||
if ( rc == -1 )
|
||||
{
|
||||
if (errno == EINTR)
|
||||
return 0;
|
||||
|
||||
ERROR("Poll exited with an error");
|
||||
goto err;
|
||||
}
|
||||
|
||||
if ( rc == 1 )
|
||||
{
|
||||
port = xc_evtchn_pending(xce);
|
||||
if ( port == -1 )
|
||||
{
|
||||
ERROR("Failed to read port from event channel");
|
||||
goto err;
|
||||
}
|
||||
|
||||
rc = xc_evtchn_unmask(xce, port);
|
||||
if ( rc != 0 )
|
||||
{
|
||||
ERROR("Failed to unmask event channel port");
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
port = -1;
|
||||
|
||||
return port;
|
||||
|
||||
err:
|
||||
return -errno;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
|
||||
|
||||
|
||||
int xc_wait_for_event_or_timeout(xc_interface *xch, xc_evtchn *xce, unsigned long ms);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
#include <poll.h>
|
||||
#include <xc_private.h>
|
||||
#include <xs.h>
|
||||
|
||||
@@ -62,6 +63,47 @@ static int xenpaging_mem_paging_flush_ioemu_cache(xenpaging_t *paging)
|
||||
return rc == true ? 0 : -1;
|
||||
}
|
||||
|
||||
static int xenpaging_wait_for_event_or_timeout(xenpaging_t *paging)
|
||||
{
|
||||
xc_interface *xch = paging->xc_handle;
|
||||
xc_evtchn *xce = paging->mem_event.xce_handle;
|
||||
struct pollfd fd[1];
|
||||
int port;
|
||||
int rc;
|
||||
|
||||
fd[0].fd = xc_evtchn_fd(xce);
|
||||
fd[0].events = POLLIN | POLLERR;
|
||||
rc = poll(fd, 1, 100);
|
||||
if ( rc < 0 )
|
||||
{
|
||||
if (errno == EINTR)
|
||||
return 0;
|
||||
|
||||
ERROR("Poll exited with an error");
|
||||
return -errno;
|
||||
}
|
||||
|
||||
if ( rc && fd[0].revents & POLLIN )
|
||||
{
|
||||
DPRINTF("Got event from evtchn\n");
|
||||
port = xc_evtchn_pending(xce);
|
||||
if ( port == -1 )
|
||||
{
|
||||
ERROR("Failed to read port from event channel");
|
||||
rc = -1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
rc = xc_evtchn_unmask(xce, port);
|
||||
if ( rc < 0 )
|
||||
{
|
||||
ERROR("Failed to unmask event channel port");
|
||||
}
|
||||
}
|
||||
err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void *init_page(void)
|
||||
{
|
||||
void *buffer;
|
||||
@@ -598,13 +640,13 @@ int main(int argc, char *argv[])
|
||||
while ( !interrupted )
|
||||
{
|
||||
/* Wait for Xen to signal that a page needs paged in */
|
||||
rc = xc_wait_for_event_or_timeout(xch, paging->mem_event.xce_handle, 100);
|
||||
if ( rc < -1 )
|
||||
rc = xenpaging_wait_for_event_or_timeout(paging);
|
||||
if ( rc < 0 )
|
||||
{
|
||||
ERROR("Error getting event");
|
||||
goto out;
|
||||
}
|
||||
else if ( rc != -1 )
|
||||
else if ( rc != 0 )
|
||||
{
|
||||
DPRINTF("Got event from Xen\n");
|
||||
}
|
||||
|
||||