mirror of
https://github.com/qemu/qemu.git
synced 2026-07-08 17:56:38 +00:00
io: invert the return semantics of qio_channel_flush
With the kernel's zerocopy notification mechanism, the caller can determine whether * All syscalls successfully used zero copy * At least one syscall failed to use zero copy But, as of now QEMU's IO channel flush function semantics are like * 1 => all syscalls failed to use zero copy * 0 => at least one syscall successfully used zero copy This is not aligned with what the kernel reports, and ends up reporting false negatives for cases like when there's just a single successful zerocopy amongst a collection of deferred zero-copies during a flush. Fix this by inverting the return semantics of the IO flush function. Suggested-by: Peter Xu <peterx@redhat.com> Suggested-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Tejus GK <tejus.gk@nutanix.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
committed by
Daniel P. Berrangé
parent
3f129ea545
commit
2a092db9cb
@@ -72,7 +72,7 @@ qio_channel_socket_new(void)
|
||||
sioc->zero_copy_queued = 0;
|
||||
sioc->zero_copy_sent = 0;
|
||||
sioc->blocking = false;
|
||||
sioc->new_zero_copy_sent_success = false;
|
||||
sioc->zero_copy_fallback = false;
|
||||
|
||||
ioc = QIO_CHANNEL(sioc);
|
||||
qio_channel_set_feature(ioc, QIO_CHANNEL_FEATURE_SHUTDOWN);
|
||||
@@ -880,9 +880,9 @@ static int qio_channel_socket_flush_internal(QIOChannel *ioc,
|
||||
/* No errors, count successfully finished sendmsg()*/
|
||||
sioc->zero_copy_sent += serr->ee_data - serr->ee_info + 1;
|
||||
|
||||
/* If any sendmsg() succeeded using zero copy, mark zerocopy success */
|
||||
if (serr->ee_code != SO_EE_CODE_ZEROCOPY_COPIED) {
|
||||
sioc->new_zero_copy_sent_success = true;
|
||||
if (serr->ee_code == SO_EE_CODE_ZEROCOPY_COPIED) {
|
||||
/* If any sendmsg() fell back to a copy, mark fallback as true */
|
||||
sioc->zero_copy_fallback = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -900,12 +900,12 @@ static int qio_channel_socket_flush(QIOChannel *ioc,
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (sioc->new_zero_copy_sent_success) {
|
||||
sioc->new_zero_copy_sent_success = false;
|
||||
return 0;
|
||||
if (sioc->zero_copy_fallback) {
|
||||
sioc->zero_copy_fallback = false;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* QEMU_MSG_ZEROCOPY */
|
||||
|
||||
Reference in New Issue
Block a user