From: Akihiko Odaki <akihiko.odaki@daynix.com>
To: Jason Wang <jasowang@redhat.com>,
Dmitry Fleytman <dmitry.fleytman@gmail.com>,
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com>,
"Michael S. Tsirkin" <mst@redhat.com>,
Luigi Rizzo <rizzo@iet.unipi.it>,
Giuseppe Lettieri <g.lettieri@iet.unipi.it>,
Vincenzo Maffione <v.maffione@gmail.com>,
Andrew Melnychenko <andrew@daynix.com>,
Yuri Benditovich <yuri.benditovich@daynix.com>
Cc: qemu-devel@nongnu.org, Akihiko Odaki <akihiko.odaki@daynix.com>
Subject: [PATCH v10 14/18] virtio-net: Do not write hashes to peer buffer
Date: Sun, 28 Apr 2024 16:00:57 +0900 [thread overview]
Message-ID: <20240428-rss-v10-14-73cbaa91aeb6@daynix.com> (raw)
In-Reply-To: <20240428-rss-v10-0-73cbaa91aeb6@daynix.com>
The peer buffer is qualified with const and not meant to be modified.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
---
hw/net/virtio-net.c | 36 +++++++++++++++++-------------------
1 file changed, 17 insertions(+), 19 deletions(-)
diff --git a/hw/net/virtio-net.c b/hw/net/virtio-net.c
index 527aac3a0465..c8059dc99bd4 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1830,16 +1830,9 @@ static uint8_t virtio_net_get_hash_type(bool hasip4,
return 0xff;
}
-static void virtio_set_packet_hash(const uint8_t *buf, uint8_t report,
- uint32_t hash)
-{
- struct virtio_net_hdr_v1_hash *hdr = (void *)buf;
- hdr->hash_value = hash;
- hdr->hash_report = report;
-}
-
static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
- size_t size)
+ size_t size,
+ struct virtio_net_hdr_v1_hash *hdr)
{
VirtIONet *n = qemu_get_nic_opaque(nc);
unsigned int index = nc->queue_index, new_index = index;
@@ -1870,7 +1863,8 @@ static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
n->rss_data.hash_types);
if (net_hash_type > NetPktRssIpV6UdpEx) {
if (n->rss_data.populate_hash) {
- virtio_set_packet_hash(buf, VIRTIO_NET_HASH_REPORT_NONE, 0);
+ hdr->hash_value = VIRTIO_NET_HASH_REPORT_NONE;
+ hdr->hash_report = 0;
}
return n->rss_data.redirect ? n->rss_data.default_queue : -1;
}
@@ -1878,7 +1872,8 @@ static int virtio_net_process_rss(NetClientState *nc, const uint8_t *buf,
hash = net_rx_pkt_calc_rss_hash(pkt, net_hash_type, n->rss_data.key);
if (n->rss_data.populate_hash) {
- virtio_set_packet_hash(buf, reports[net_hash_type], hash);
+ hdr->hash_value = hash;
+ hdr->hash_report = reports[net_hash_type];
}
if (n->rss_data.redirect) {
@@ -1898,7 +1893,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
VirtQueueElement *elems[VIRTQUEUE_MAX_SIZE];
size_t lens[VIRTQUEUE_MAX_SIZE];
struct iovec mhdr_sg[VIRTQUEUE_MAX_SIZE];
- struct virtio_net_hdr_mrg_rxbuf mhdr;
+ struct virtio_net_hdr_v1_hash extra_hdr;
unsigned mhdr_cnt = 0;
size_t offset, i, guest_offset, j;
ssize_t err;
@@ -1908,7 +1903,7 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
}
if (!no_rss && n->rss_data.enabled && n->rss_data.enabled_software_rss) {
- int index = virtio_net_process_rss(nc, buf, size);
+ int index = virtio_net_process_rss(nc, buf, size, &extra_hdr);
if (index >= 0) {
NetClientState *nc2 = qemu_get_subqueue(n->nic, index);
return virtio_net_receive_rcu(nc2, buf, size, true);
@@ -1968,15 +1963,17 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
if (n->mergeable_rx_bufs) {
mhdr_cnt = iov_copy(mhdr_sg, ARRAY_SIZE(mhdr_sg),
sg, elem->in_num,
- offsetof(typeof(mhdr), num_buffers),
- sizeof(mhdr.num_buffers));
+ offsetof(typeof(extra_hdr), hdr.num_buffers),
+ sizeof(extra_hdr.hdr.num_buffers));
}
receive_header(n, sg, elem->in_num, buf, size);
if (n->rss_data.populate_hash) {
- offset = sizeof(mhdr);
+ offset = offsetof(typeof(extra_hdr), hash_value);
iov_from_buf(sg, elem->in_num, offset,
- buf + offset, n->host_hdr_len - sizeof(mhdr));
+ (char *)&extra_hdr + offset,
+ sizeof(extra_hdr.hash_value) +
+ sizeof(extra_hdr.hash_report));
}
offset = n->host_hdr_len;
total += n->guest_hdr_len;
@@ -2022,10 +2019,11 @@ static ssize_t virtio_net_receive_rcu(NetClientState *nc, const uint8_t *buf,
}
if (mhdr_cnt) {
- virtio_stw_p(vdev, &mhdr.num_buffers, i);
+ virtio_stw_p(vdev, &extra_hdr.hdr.num_buffers, i);
iov_from_buf(mhdr_sg, mhdr_cnt,
0,
- &mhdr.num_buffers, sizeof mhdr.num_buffers);
+ &extra_hdr.hdr.num_buffers,
+ sizeof extra_hdr.hdr.num_buffers);
}
for (j = 0; j < i; j++) {
--
2.44.0
next prev parent reply other threads:[~2024-04-28 7:02 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-28 7:00 [PATCH v10 00/18] virtio-net RSS/hash report fixes and improvements Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 01/18] tap: Remove tap_probe_vnet_hdr_len() Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 02/18] tap: Remove qemu_using_vnet_hdr() Akihiko Odaki
2024-08-16 15:59 ` Jonathan Cameron via
2024-04-28 7:00 ` [PATCH v10 03/18] net: Move virtio-net header length assertion Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 04/18] net: Remove receive_raw() Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 05/18] tap: Call tap_receive_iov() from tap_receive() Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 06/18] tap: Shrink zeroed virtio-net header Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 07/18] virtio-net: Do not propagate ebpf-rss-fds errors Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 08/18] virtio-net: Add only one queue pair when realizing Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 09/18] virtio-net: Copy header only when necessary Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 10/18] virtio-net: Shrink header byte swapping buffer Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 11/18] virtio-net: Disable RSS on reset Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 12/18] virtio-net: Unify the logic to update NIC state for RSS Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 13/18] virtio-net: Always set populate_hash Akihiko Odaki
2024-04-28 7:00 ` Akihiko Odaki [this message]
2024-04-28 7:00 ` [PATCH v10 15/18] ebpf: Fix RSS error handling Akihiko Odaki
2024-04-28 7:00 ` [PATCH v10 16/18] ebpf: Return 0 when configuration fails Akihiko Odaki
2024-04-28 7:01 ` [PATCH v10 17/18] ebpf: Refactor tun_rss_steering_prog() Akihiko Odaki
2024-04-28 7:01 ` [PATCH v10 18/18] ebpf: Add a separate target for skeleton Akihiko Odaki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240428-rss-v10-14-73cbaa91aeb6@daynix.com \
--to=akihiko.odaki@daynix.com \
--cc=andrew@daynix.com \
--cc=dmitry.fleytman@gmail.com \
--cc=g.lettieri@iet.unipi.it \
--cc=jasowang@redhat.com \
--cc=mst@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=rizzo@iet.unipi.it \
--cc=sriram.yagnaraman@ericsson.com \
--cc=v.maffione@gmail.com \
--cc=yuri.benditovich@daynix.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).