From: Jason Wang <jasowang@redhat.com>
To: peter.maydell@linaro.org, qemu-devel@nongnu.org
Cc: Akihiko Odaki <akihiko.odaki@daynix.com>,
Jason Wang <jasowang@redhat.com>
Subject: [PULL 14/20] virtio-net: Do not write hashes to peer buffer
Date: Tue, 4 Jun 2024 15:37:49 +0800 [thread overview]
Message-ID: <20240604073755.1859-15-jasowang@redhat.com> (raw)
In-Reply-To: <20240604073755.1859-1-jasowang@redhat.com>
From: Akihiko Odaki <akihiko.odaki@daynix.com>
The peer buffer is qualified with const and not meant to be modified.
Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.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 b423169a48..666a4e2a03 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;
@@ -2006,10 +2003,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.42.0
next prev parent reply other threads:[~2024-06-04 7:40 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-04 7:37 [PULL 00/20] Net patches Jason Wang
2024-06-04 7:37 ` [PULL 01/20] tap: Remove tap_probe_vnet_hdr_len() Jason Wang
2024-06-04 7:37 ` [PULL 02/20] tap: Remove qemu_using_vnet_hdr() Jason Wang
2024-06-04 7:37 ` [PULL 03/20] net: Move virtio-net header length assertion Jason Wang
2024-06-04 7:37 ` [PULL 04/20] net: Remove receive_raw() Jason Wang
2024-06-04 7:37 ` [PULL 05/20] tap: Call tap_receive_iov() from tap_receive() Jason Wang
2024-06-04 7:37 ` [PULL 06/20] tap: Shrink zeroed virtio-net header Jason Wang
2024-06-04 7:37 ` [PULL 07/20] virtio-net: Do not propagate ebpf-rss-fds errors Jason Wang
2024-06-05 10:23 ` Daniel P. Berrangé
2024-06-05 20:14 ` Akihiko Odaki
2024-06-06 7:14 ` Daniel P. Berrangé
2024-06-06 7:19 ` Akihiko Odaki
2024-06-06 7:59 ` Daniel P. Berrangé
2024-06-07 6:04 ` Akihiko Odaki
2024-06-04 7:37 ` [PULL 08/20] virtio-net: Add only one queue pair when realizing Jason Wang
2024-10-14 8:30 ` Laurent Vivier
2024-10-14 15:16 ` Laurent Vivier
2024-10-17 6:59 ` Jason Wang
2024-10-17 7:32 ` Laurent Vivier
2024-10-17 9:07 ` Akihiko Odaki
2024-10-17 9:17 ` Laurent Vivier
2024-10-17 9:42 ` Akihiko Odaki
2024-10-18 4:50 ` Jason Wang
2024-10-19 12:38 ` Akihiko Odaki
2024-10-21 7:23 ` Jason Wang
2024-10-21 8:40 ` Akihiko Odaki
2024-06-04 7:37 ` [PULL 09/20] virtio-net: Copy header only when necessary Jason Wang
2024-06-04 7:37 ` [PULL 10/20] virtio-net: Shrink header byte swapping buffer Jason Wang
2024-06-04 7:37 ` [PULL 11/20] virtio-net: Disable RSS on reset Jason Wang
2024-06-04 7:37 ` [PULL 12/20] virtio-net: Unify the logic to update NIC state for RSS Jason Wang
2024-06-04 7:37 ` [PULL 13/20] virtio-net: Always set populate_hash Jason Wang
2024-06-04 7:37 ` Jason Wang [this message]
2024-06-04 7:37 ` [PULL 15/20] ebpf: Fix RSS error handling Jason Wang
2024-06-04 7:37 ` [PULL 16/20] ebpf: Return 0 when configuration fails Jason Wang
2024-06-04 7:37 ` [PULL 17/20] ebpf: Refactor tun_rss_steering_prog() Jason Wang
2024-06-04 7:37 ` [PULL 18/20] ebpf: Add a separate target for skeleton Jason Wang
2024-06-04 7:37 ` [PULL 19/20] virtio-net: drop too short packets early Jason Wang
2024-06-04 7:37 ` [PULL 20/20] ebpf: Added traces back. Changed source set for eBPF to 'system' Jason Wang
2024-06-04 19:52 ` [PULL 00/20] Net patches Richard Henderson
2024-06-05 10:14 ` Michael Tokarev
2024-06-05 20:18 ` Akihiko Odaki
2024-06-06 0:13 ` Jason Wang
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=20240604073755.1859-15-jasowang@redhat.com \
--to=jasowang@redhat.com \
--cc=akihiko.odaki@daynix.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/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).