static void wait_for_event(void) { int ret; fd_set inset; evtchn_port_t port; struct timeval tv; int evtchn_fd; if (xce_handle == NULL) { nanosleep(&opts.poll_sleep, NULL); return; } evtchn_fd = xenevtchn_fd(xce_handle); FD_ZERO(&inset); FD_SET(evtchn_fd, &inset); tv.tv_sec = 1; tv.tv_usec = 0; // tv = millis_to_timespec(&opts.poll_sleep); ret = select(evtchn_fd+1, &inset, NULL, NULL, &tv); if ( (ret == 1) && FD_ISSET(evtchn_fd, &inset)) { if ((port = xenevtchn_pending(xce_handle)) == -1) perror("Failed to read from event fd"); // if (port == virq_port) // printf("got the event I was looking for\r\n"); if (xenevtchn_unmask(xce_handle, port) == -1) perror("Failed to write to event fd"); } }
static void xen_9pfs_evtchn_event(void *opaque) { Xen9pfsRing *ring = opaque; evtchn_port_t port; port = xenevtchn_pending(ring->evtchndev); xenevtchn_unmask(ring->evtchndev, port); qemu_bh_schedule(ring->bh); }
int main(int argc, char *argv[]) { int rc; atexit(cleanup); xch = xc_interface_open(NULL, NULL, 0); if (xch == NULL) { perror("Failed to open xc interface"); return 1; } xce_handle = xenevtchn_open(NULL, 0); if (xce_handle == NULL) { perror("Failed to open evtchn device"); return 2; } xs_handle = xs_daemon_open(); if (xs_handle == NULL) { perror("Failed to open xenstore connection"); return 3; } if ((rc = xenevtchn_bind_virq(xce_handle, VIRQ_ENOMEM)) == -1) { perror("Failed to bind to domain exception virq port"); return 4; } virq_port = rc; while(1) { evtchn_port_t port; if ((port = xenevtchn_pending(xce_handle)) == -1) { perror("Failed to listen for pending event channel"); return 5; } if (port != virq_port) { char data[BUFSZ]; snprintf(data, BUFSZ, "Wrong port, got %d expected %d", port, virq_port); perror(data); return 6; } if (xenevtchn_unmask(xce_handle, port) == -1) { perror("Failed to unmask port"); return 7; } printf("Got a virq kick, time to get work\n"); handle_low_mem(); } return 0; }