event_notifier: handle initialization failure better
Add 'initialized' field and use it to avoid touching event notifiers which are either not initialized or if their initialization failed. This is somewhat a hack, but it seems the less intrusive way to make virtio code deal with event notifiers that failed initialization. Signed-off-by: Maxim Levitsky <mlevitsk@redhat.com> Message-Id: <20201217150040.906961-4-mlevitsk@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
dec2bb14b8
commit
e34e47eb28
@ -24,6 +24,7 @@ struct EventNotifier {
|
||||
#else
|
||||
int rfd;
|
||||
int wfd;
|
||||
bool initialized;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -29,6 +29,7 @@ void event_notifier_init_fd(EventNotifier *e, int fd)
|
||||
{
|
||||
e->rfd = fd;
|
||||
e->wfd = fd;
|
||||
e->initialized = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -68,6 +69,7 @@ int event_notifier_init(EventNotifier *e, int active)
|
||||
if (active) {
|
||||
event_notifier_set(e);
|
||||
}
|
||||
e->initialized = true;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@ -78,12 +80,18 @@ fail:
|
||||
|
||||
void event_notifier_cleanup(EventNotifier *e)
|
||||
{
|
||||
if (!e->initialized) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (e->rfd != e->wfd) {
|
||||
close(e->rfd);
|
||||
}
|
||||
|
||||
e->rfd = -1;
|
||||
close(e->wfd);
|
||||
e->wfd = -1;
|
||||
e->initialized = false;
|
||||
}
|
||||
|
||||
int event_notifier_get_fd(const EventNotifier *e)
|
||||
@ -96,6 +104,10 @@ int event_notifier_set(EventNotifier *e)
|
||||
static const uint64_t value = 1;
|
||||
ssize_t ret;
|
||||
|
||||
if (!e->initialized) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = write(e->wfd, &value, sizeof(value));
|
||||
} while (ret < 0 && errno == EINTR);
|
||||
@ -113,6 +125,10 @@ int event_notifier_test_and_clear(EventNotifier *e)
|
||||
ssize_t len;
|
||||
char buffer[512];
|
||||
|
||||
if (!e->initialized) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Drain the notify pipe. For eventfd, only 8 bytes will be read. */
|
||||
value = 0;
|
||||
do {
|
||||
|
Loading…
Reference in New Issue
Block a user