From: "Jason J. Herne" <jjherne@linux.ibm.com>
To: Zhuoying Cai <zycai@linux.ibm.com>,
qemu-devel@nongnu.org, qemu-s390x@nongnu.org
Cc: mst@redhat.com, jrossi@linux.ibm.com, borntraeger@linux.ibm.com,
cohuck@redhat.com, farman@linux.ibm.com, mjrosato@linux.ibm.com,
pasic@linux.ibm.com, farosas@suse.de, lvivier@redhat.com,
pbonzini@redhat.com
Subject: Re: [PATCH v1 2/7] pc-bios/s390-ccw: Add dynamic net header size handling
Date: Wed, 26 Aug 2026 13:01:14 -0400 [thread overview]
Message-ID: <eee4b8dc-6cde-413f-9a58-67d792ab56d8@linux.ibm.com> (raw)
In-Reply-To: <20260818205324.580199-3-zycai@linux.ibm.com>
On 8/18/26 4:53 PM, Zhuoying Cai wrote:
> The virtio-net device used a fixed header size that did not account for
> the num_buffers field used in VirtIO 1.0 or for the mergeable receive
> buffers feature.
>
> Use dynamic header sizing: 10 bytes for legacy mode and 12 bytes for
> VirtIO 1.0 or when VIRTIO_NET_F_MRG_RXBUF is enabled. This ensures
> correct packet handling across different VirtIO configurations.
>
> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
> ---
> pc-bios/s390-ccw/virtio-net.c | 26 +++++++++++++++++++-------
> 1 file changed, 19 insertions(+), 7 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c
> index 0ee51653ab..3a9ae789cf 100644
> --- a/pc-bios/s390-ccw/virtio-net.c
> +++ b/pc-bios/s390-ccw/virtio-net.c
> @@ -20,6 +20,7 @@
> #include "s390-ccw.h"
> #include "virtio.h"
> #include "virtio-ccw.h"
> +#include "virtio-pci.h"
> #include "s390-time.h"
> #include "helper.h"
>
> @@ -28,10 +29,15 @@
> #endif
>
> #define VIRTIO_NET_F_MAC_BIT (1 << 5)
> +#define VIRTIO_NET_F_MRG_RXBUF_BIT (1 << 15)
>
> #define VQ_RX 0 /* Receive queue */
> #define VQ_TX 1 /* Transmit queue */
>
> +/* Header sizes for different modes */
> +#define VIRTIO_NET_HDR_SIZE_LEGACY 10 /* Without num_buffers */
> +#define VIRTIO_NET_HDR_SIZE_V1 12 /* With num_buffers */
> +
> struct VirtioNetHdr {
> uint8_t flags;
> uint8_t gso_type;
> @@ -39,11 +45,12 @@ struct VirtioNetHdr {
> uint16_t gso_size;
> uint16_t csum_start;
> uint16_t csum_offset;
> - /*uint16_t num_buffers;*/ /* Only with VIRTIO_NET_F_MRG_RXBUF or VIRTIO1 */
> + uint16_t num_buffers; /* Only with VIRTIO_NET_F_MRG_RXBUF or VIRTIO1 */
> };
> typedef struct VirtioNetHdr VirtioNetHdr;
>
> static uint16_t rx_last_idx; /* Last index in receive queue "used" ring */
> +static int virtio_net_hdr_size;
>
> int virtio_net_init(void *mac_addr)
> {
> @@ -62,12 +69,17 @@ int virtio_net_init(void *mac_addr)
> return -1;
> }
>
> + virtio_net_hdr_size = ((vdev->guest_features[1] & VIRTIO_F_VERSION_1) ||
> + (vdev->guest_features[0] & VIRTIO_NET_F_MRG_RXBUF_BIT))
> + ? VIRTIO_NET_HDR_SIZE_V1
> + : VIRTIO_NET_HDR_SIZE_LEGACY;
> +
> memcpy(mac_addr, vdev->config.net.mac, ETH_ALEN);
>
> for (i = 0; i < 64; i++) {
> - buf = malloc(ETH_MTU_SIZE + sizeof(VirtioNetHdr));
> + buf = malloc(ETH_MTU_SIZE + virtio_net_hdr_size);
> IPL_assert(buf != NULL, "Can not allocate memory for receive buffers");
> - vring_send_buf(rxvq, buf, ETH_MTU_SIZE + sizeof(VirtioNetHdr),
> + vring_send_buf(rxvq, buf, ETH_MTU_SIZE + virtio_net_hdr_size,
> VRING_DESC_F_WRITE);
> }
> vring_notify(rxvq);
> @@ -82,9 +94,9 @@ int send(int fd, const void *buf, int len, int flags)
> VRing *txvq = &vdev->vrings[VQ_TX];
>
> /* Set up header - we do not use anything special, so simply clear it */
> - memset(&tx_hdr, 0, sizeof(tx_hdr));
> + memset(&tx_hdr, 0, virtio_net_hdr_size);
I think you want to leave this line as-is. There's no harm in cleaning
the entire struct's memory even if we never end up using the final
field. But only partially cleaning the struct looks weird and could
potentially cause problems if subsequent code changes introduce code
that attempts to read uninitialized data from num_buffers later.
With that change made:
Reviewed-by: Jason J. Herne <jjherne@linux.ibm.com>
next prev parent reply other threads:[~2026-08-26 21:08 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 20:53 [PATCH v1 0/7] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
2026-08-18 20:53 ` [PATCH v1 1/7] pc-bios/s390-ccw: Split virtio-ccw and generic virtio net Zhuoying Cai
2026-08-26 16:26 ` Jason J. Herne
2026-08-26 17:33 ` Matthew Rosato
2026-08-26 19:30 ` Jared Rossi
2026-08-26 19:41 ` Matthew Rosato
2026-08-26 20:23 ` Jared Rossi
2026-08-26 20:49 ` Matthew Rosato
2026-08-31 17:17 ` Zhuoying Cai
2026-08-18 20:53 ` [PATCH v1 2/7] pc-bios/s390-ccw: Add dynamic net header size handling Zhuoying Cai
2026-08-26 17:01 ` Jason J. Herne [this message]
2026-08-26 17:34 ` Matthew Rosato
2026-08-18 20:53 ` [PATCH v1 3/7] pc-bios/s390-ccw: Introduce virtio_tswap helpers Zhuoying Cai
2026-08-26 17:20 ` Jason J. Herne
2026-08-26 17:44 ` Matthew Rosato
2026-08-18 20:53 ` [PATCH v1 4/7] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
2026-08-26 14:31 ` Zhuoying Cai
2026-08-26 16:44 ` Jared Rossi
2026-08-31 18:36 ` Zhuoying Cai
2026-09-02 10:12 ` Eric Farman
2026-08-28 16:51 ` Jason J. Herne
2026-08-18 20:53 ` [PATCH v1 5/7] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x Zhuoying Cai
2026-08-28 17:00 ` Jason J. Herne
2026-08-18 20:53 ` [PATCH v1 6/7] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
2026-08-26 18:28 ` Joshua Daley
2026-08-18 20:53 ` [PATCH v1 7/7] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py Zhuoying Cai
2026-08-26 18:17 ` Joshua Daley
2026-08-26 18:22 ` Joshua Daley
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=eee4b8dc-6cde-413f-9a58-67d792ab56d8@linux.ibm.com \
--to=jjherne@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=farman@linux.ibm.com \
--cc=farosas@suse.de \
--cc=jrossi@linux.ibm.com \
--cc=lvivier@redhat.com \
--cc=mjrosato@linux.ibm.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=zycai@linux.ibm.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.