|
|
719b13 |
From f81698b323294b330a5dfb7b9eabff025596bbde Mon Sep 17 00:00:00 2001
|
|
|
719b13 |
From: Leonardo Bras <leobras@redhat.com>
|
|
|
719b13 |
Date: Thu, 4 Aug 2022 04:10:43 -0300
|
|
|
719b13 |
Subject: [PATCH 34/34] QIOChannelSocket: Add support for MSG_ZEROCOPY + IPV6
|
|
|
719b13 |
MIME-Version: 1.0
|
|
|
719b13 |
Content-Type: text/plain; charset=UTF-8
|
|
|
719b13 |
Content-Transfer-Encoding: 8bit
|
|
|
719b13 |
|
|
|
719b13 |
RH-Author: Leonardo Brás <leobras@redhat.com>
|
|
|
719b13 |
RH-MergeRequest: 185: MSG_ZEROCOPY + Multifd @ rhel8.6
|
|
|
719b13 |
RH-Commit: [34/34] 549d876ec7108bd11d01754bd1b893ba3e79deb9
|
|
|
719b13 |
RH-Bugzilla: 2117252
|
|
|
719b13 |
RH-Acked-by: quintela1 <quintela@redhat.com>
|
|
|
719b13 |
RH-Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
|
|
|
719b13 |
RH-Acked-by: Peter Xu <peterx@redhat.com>
|
|
|
719b13 |
|
|
|
719b13 |
For using MSG_ZEROCOPY, there are two steps:
|
|
|
719b13 |
1 - io_writev() the packet, which enqueues the packet for sending, and
|
|
|
719b13 |
2 - io_flush(), which gets confirmation that all packets got correctly sent
|
|
|
719b13 |
|
|
|
719b13 |
Currently, if MSG_ZEROCOPY is used to send packets over IPV6, no error will
|
|
|
719b13 |
be reported in (1), but it will fail in the first time (2) happens.
|
|
|
719b13 |
|
|
|
719b13 |
This happens because (2) currently checks for cmsg_level & cmsg_type
|
|
|
719b13 |
associated with IPV4 only, before reporting any error.
|
|
|
719b13 |
|
|
|
719b13 |
Add checks for cmsg_level & cmsg_type associated with IPV6, and thus enable
|
|
|
719b13 |
support for MSG_ZEROCOPY + IPV6
|
|
|
719b13 |
|
|
|
719b13 |
Fixes: 2bc58ffc29 ("QIOChannelSocket: Implement io_writev zero copy flag & io_flush for CONFIG_LINUX")
|
|
|
719b13 |
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
|
|
719b13 |
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
|
|
|
719b13 |
(cherry picked from commit 5258a7e2c0677d16e9e1d06845f60171adf0b290)
|
|
|
719b13 |
Signed-off-by: Leonardo Bras <leobras@redhat.com>
|
|
|
719b13 |
---
|
|
|
719b13 |
io/channel-socket.c | 4 ++--
|
|
|
719b13 |
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
719b13 |
|
|
|
719b13 |
diff --git a/io/channel-socket.c b/io/channel-socket.c
|
|
|
719b13 |
index cf0d67c51b..6010ad7017 100644
|
|
|
719b13 |
--- a/io/channel-socket.c
|
|
|
719b13 |
+++ b/io/channel-socket.c
|
|
|
719b13 |
@@ -747,8 +747,8 @@ static int qio_channel_socket_flush(QIOChannel *ioc,
|
|
|
719b13 |
}
|
|
|
719b13 |
|
|
|
719b13 |
cm = CMSG_FIRSTHDR(&msg;;
|
|
|
719b13 |
- if (cm->cmsg_level != SOL_IP &&
|
|
|
719b13 |
- cm->cmsg_type != IP_RECVERR) {
|
|
|
719b13 |
+ if (cm->cmsg_level != SOL_IP && cm->cmsg_type != IP_RECVERR &&
|
|
|
719b13 |
+ cm->cmsg_level != SOL_IPV6 && cm->cmsg_type != IPV6_RECVERR) {
|
|
|
719b13 |
error_setg_errno(errp, EPROTOTYPE,
|
|
|
719b13 |
"Wrong cmsg in errqueue");
|
|
|
719b13 |
return -1;
|
|
|
719b13 |
--
|
|
|
719b13 |
2.35.3
|
|
|
719b13 |
|