aboutsummaryrefslogtreecommitdiff
path: root/chardev/char-file.c
diff options
context:
space:
mode:
authorDaniel P. Berrangé <berrange@redhat.com>2024-03-18 18:06:59 +0000
committerDaniel P. Berrangé <berrange@redhat.com>2024-03-19 20:17:12 +0000
commit8bd8b04adc9f18904f323dff085f8b4ec77915c6 (patch)
tree1bafa235addd285293c43cad142d8a4a1d4e21a4 /chardev/char-file.c
parente79f8b8b2d70a85200af14deb65d399597d780f5 (diff)
chardev: lower priority of the HUP GSource in socket chardev
The socket chardev often has 2 GSource object registered against the same FD. One is registered all the time and is just intended to handle POLLHUP events, while the other gets registered & unregistered on the fly as the frontend is ready to receive more data or not. It is very common for poll() to signal a POLLHUP event at the same time as there is pending incoming data from the disconnected client. It is therefore essential to process incoming data prior to processing HUP. The problem with having 2 GSource on the same FD is that there is no guaranteed ordering of execution between them, so the chardev code may process HUP first and thus discard data. This failure scenario is non-deterministic but can be seen fairly reliably by reverting a7077b8e354d90fec26c2921aa2dea85b90dff90, and then running 'tests/unit/test-char', which will sometimes fail with missing data. Ideally QEMU would only have 1 GSource, but that's a complex code refactoring job. The next best solution is to try to ensure ordering between the 2 GSource objects. This can be achieved by lowering the priority of the HUP GSource, so that it is never dispatched if the main GSource is also ready to dispatch. Counter-intuitively, lowering the priority of a GSource is done by raising its priority number. Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
Diffstat (limited to 'chardev/char-file.c')
0 files changed, 0 insertions, 0 deletions