Juan Quintela wrote:
Discused with Anthony about it. signalfd is complicated for qemu
upstream (too difficult to use properly),
It's not an issue of being difficult.
To emulate signalfd, we need to create a thread that writes to a pipe
from a signal handler. The problem is that a write() can return a
partial result and following the partial result, we can end up getting
an EAGAIN. We have no way to queue signals beyond that point and we
have no sane way to deal with partial writes.
Instead, how we do this in upstream QEMU is that we install a signal
handler and write one byte to the fd. If we get EAGAIN, that's fine
because all we care about is that at least one byte exists in the fd's
buffer. This requires that we use an fd-per-signal which means we end
up with a different model than signalfd.
The reason to use signalfd over what we do in upstream QEMU is that
signalfd can allow us to mask the signals which means less EINTRs. I
don't think that's a huge advantage and the inability to do backwards
compatibility in a sane way means that emulated signalfd is not workable.
We could possibly introduce a higher level interface that only required
one fd per signal and that had a function that drained the signals from
the fd without returning any special information.
The same is generally true for eventfd.
Regards,
Anthony Liguori
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html