All of lore.kernel.org
 help / color / mirror / Atom feed
From: Akihiko Odaki <akihiko.odaki@daynix.com>
To: Jason Wang <jasowang@redhat.com>,
	 Dmitry Fleytman <dmitry.fleytman@gmail.com>,
	 Sriram Yagnaraman <sriram.yagnaraman@est.tech>,
	 "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 v9 16/20] virtio-net: Do not write hashes to peer buffer
Date: Wed, 03 Apr 2024 20:11:04 +0900	[thread overview]
Message-ID: <20240403-rss-v9-16-c6d87e69d38b@daynix.com> (raw)
In-Reply-To: <20240403-rss-v9-0-c6d87e69d38b@daynix.com>

The peer buffer is qualified with const and not meant to be modified.
It also prevents enabling VIRTIO_NET_F_HASH_REPORT for peers without
virtio-net header support.

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 2de073ce18fd..ff1884564d0d 100644
--- a/hw/net/virtio-net.c
+++ b/hw/net/virtio-net.c
@@ -1823,16 +1823,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;
@@ -1863,7 +1856,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;
     }
@@ -1871,7 +1865,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) {
@@ -1891,7 +1886,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;
@@ -1901,7 +1896,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);
@@ -1961,15 +1956,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;
@@ -2015,10 +2012,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



  parent reply	other threads:[~2024-04-03 11:12 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-03 11:10 [PATCH v9 00/20] virtio-net RSS/hash report fixes and improvements Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 01/20] tap: Remove tap_probe_vnet_hdr_len() Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 02/20] tap: Remove qemu_using_vnet_hdr() Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 03/20] net: Move virtio-net header length assertion Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 04/20] net: Remove receive_raw() Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 05/20] tap: Call tap_receive_iov() from tap_receive() Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 06/20] tap: Shrink zeroed virtio-net header Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 07/20] virtio-net: Do not propagate ebpf-rss-fds errors Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 08/20] virtio-net: Add only one queue pair when realizing Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 09/20] virtio-net: Copy header only when necessary Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 10/20] virtio-net: Shrink header byte swapping buffer Akihiko Odaki
2024-04-03 11:10 ` [PATCH v9 11/20] virtio-net: Disable RSS on reset Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 12/20] virtio-net: Unify the logic to update NIC state for RSS Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 13/20] virtio-net: Return an error when vhost cannot enable RSS Akihiko Odaki
2024-04-07 21:46   ` Yuri Benditovich
2024-04-08  1:29     ` Akihiko Odaki
2024-04-11 11:28       ` Yan Vugenfirer
2024-04-15 14:05   ` Yuri Benditovich
2024-04-16  4:00     ` Jason Wang
2024-04-16  5:43       ` Yuri Benditovich
2024-04-16  7:13         ` Jason Wang
2024-04-16  9:50           ` Yuri Benditovich
2024-04-17  4:18             ` Jason Wang
2024-04-16  6:54       ` Akihiko Odaki
2024-04-20 14:27         ` Yuri Benditovich
2024-04-16  9:54   ` Yuri Benditovich
2024-04-03 11:11 ` [PATCH v9 14/20] virtio-net: Report RSS warning at device realization Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 15/20] virtio-net: Always set populate_hash Akihiko Odaki
2024-04-03 11:11 ` Akihiko Odaki [this message]
2024-04-07 22:09   ` [PATCH v9 16/20] virtio-net: Do not write hashes to peer buffer Yuri Benditovich
2024-04-08  1:30     ` Akihiko Odaki
2024-04-08  7:40       ` Yuri Benditovich
2024-04-08  7:42         ` Akihiko Odaki
2024-04-08  7:54           ` Yuri Benditovich
2024-04-08  7:57             ` Akihiko Odaki
2024-04-08  8:06               ` Yuri Benditovich
2024-04-08  8:11                 ` Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 17/20] ebpf: Fix RSS error handling Akihiko Odaki
2024-04-13 12:16   ` Yuri Benditovich
2024-04-14  6:36     ` Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 18/20] ebpf: Return 0 when configuration fails Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 19/20] ebpf: Refactor tun_rss_steering_prog() Akihiko Odaki
2024-04-03 11:11 ` [PATCH v9 20/20] 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=20240403-rss-v9-16-c6d87e69d38b@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@est.tech \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.