[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 6/9] e1000e: Don't zero out buffer address in rx desc
From: |
Jason Wang |
Subject: |
[Qemu-devel] [PULL 6/9] e1000e: Don't zero out buffer address in rx descriptor |
Date: |
Wed, 26 Oct 2016 10:24:08 +0800 |
From: Kevin Wolf <address@hidden>
The e1000e emulation zeroes out any used rx descriptor and then writes a
completely newly constructed value there. By doing this, it doesn't only
update the write-back area of the descriptors (as it's supposed to do),
but it also clears the buffer address, which real hardware doesn't do.
The spec explicitly mentions in chapter 7.1.8 that it is valid for a
driver to reuse a descriptor and only update the status field while
doing so, i.e. reusing the old buffer address:
If software statically allocates buffers, and uses memory read to
check for completed descriptors, it simply has to zero the status
byte in the descriptor to make it ready for reuse by hardware.
This patch fixes the behaviour to leave the buffer address in
descriptors unchanged even after the descriptor has been used.
Signed-off-by: Kevin Wolf <address@hidden>
Reviewed-by: Dmitry Fleytman <address@hidden>
Signed-off-by: Jason Wang <address@hidden>
---
hw/net/e1000e_core.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/hw/net/e1000e_core.c b/hw/net/e1000e_core.c
index 6505983..2b11499 100644
--- a/hw/net/e1000e_core.c
+++ b/hw/net/e1000e_core.c
@@ -1278,11 +1278,10 @@ e1000e_write_lgcy_rx_descr(E1000ECore *core, uint8_t
*desc,
struct e1000_rx_desc *d = (struct e1000_rx_desc *) desc;
- memset(d, 0, sizeof(*d));
-
assert(!rss_info->enabled);
d->length = cpu_to_le16(length);
+ d->csum = 0;
e1000e_build_rx_metadata(core, pkt, pkt != NULL,
rss_info,
@@ -1291,6 +1290,7 @@ e1000e_write_lgcy_rx_descr(E1000ECore *core, uint8_t
*desc,
&d->special);
d->errors = (uint8_t) (le32_to_cpu(status_flags) >> 24);
d->status = (uint8_t) le32_to_cpu(status_flags);
+ d->special = 0;
}
static inline void
@@ -1301,7 +1301,7 @@ e1000e_write_ext_rx_descr(E1000ECore *core, uint8_t *desc,
{
union e1000_rx_desc_extended *d = (union e1000_rx_desc_extended *) desc;
- memset(d, 0, sizeof(*d));
+ memset(&d->wb, 0, sizeof(d->wb));
d->wb.upper.length = cpu_to_le16(length);
@@ -1325,7 +1325,7 @@ e1000e_write_ps_rx_descr(E1000ECore *core, uint8_t *desc,
union e1000_rx_desc_packet_split *d =
(union e1000_rx_desc_packet_split *) desc;
- memset(d, 0, sizeof(*d));
+ memset(&d->wb, 0, sizeof(d->wb));
d->wb.middle.length0 = cpu_to_le16((*written)[0]);
--
2.7.4
- [Qemu-devel] [PULL 0/9] Net patches, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 1/9] net: pcnet: check rx/tx descriptor ring length, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 2/9] net: pcnet: fix source formatting and indentation, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 3/9] tap-bsd: OpenBSD uses tap(4) now, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 4/9] net: eepro100: fix memory leak in device uninit, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 5/9] net: rocker: set limit to DMA buffer size, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 6/9] e1000e: Don't zero out buffer address in rx descriptor,
Jason Wang <=
- [Qemu-devel] [PULL 7/9] net: vmxnet: initialise local tx descriptor, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 8/9] net: rtl8139: limit processing of ring descriptors, Jason Wang, 2016/10/25
- [Qemu-devel] [PULL 9/9] colo-proxy: fix memory leak, Jason Wang, 2016/10/25
Re: [Qemu-devel] [PULL 0/9] Net patches, Peter Maydell, 2016/10/27