spapr-vlan: Don't touch last entry in buffer list
PATCH 1/1 spapr-vlan: Don't touch last entry in buffer list
The last 8 bytes of the buffer list is defined to contain the number of dropped frames. At the moment we use it to store rx entries, which trips up ethtool -S:
rx_no_buffer: 9223380832981355136
Fix this by skipping the last buffer list entry.
---
hw/net/spapr_llan.c +10 -3
@@ -72,7 +72,14 @@ typedef uint64_t vlan_bd_t;#define VLAN_RXQ_BD_OFF 0#define VLAN_FILTER_BD_OFF 8#define VLAN_RX_BDS_OFF 16 -#define VLAN_MAX_BUFS ((SPAPR_TCE_PAGE_SIZE - VLAN_RX_BDS_OFF) / 8) +/* +* The final 8 bytes of the buffer list is a counter of frames dropped +* because there was not a buffer in the buffer list capable of holding +* the frame. We must avoid it, or the operating system will report garbage +* for this statistic. +*/ +#define VLAN_RX_BDS_LEN (SPAPR_TCE_PAGE_SIZE - VLAN_RX_BDS_OFF - 8) +#define VLAN_MAX_BUFS (VLAN_RX_BDS_LEN / 8)#define TYPE_VIO_SPAPR_VLAN_DEVICE "spapr-vlan"#define VIO_SPAPR_VLAN_DEVICE (obj) \
@@ -119,7 +126,7 @@ static ssize_t spapr_vlan_receive(NetClientState *nc, const uint8_t *buf, do { buf_ptr += 8; - if (buf_ptr >= SPAPR_TCE_PAGE_SIZE) { + if (buf_ptr >= (VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF)) { buf_ptr = VLAN_RX_BDS_OFF; }
@@ -397,7 +404,7 @@ static target_ulong h_add_logical_lan_buffer(PowerPCCPU *cpu, do { dev->add_buf_ptr += 8; - if (dev->add_buf_ptr >= SPAPR_TCE_PAGE_SIZE) { + if (dev->add_buf_ptr >= (VLAN_RX_BDS_LEN + VLAN_RX_BDS_OFF)) { dev->add_buf_ptr = VLAN_RX_BDS_OFF; }
Quoted 9 lines · Anton Blanchard
The last 8 bytes of the buffer list is defined to contain the number of dropped frames. At the moment we use it to store rx entries, which trips up ethtool -S:
rx_no_buffer: 9223380832981355136Fix this by skipping the last buffer list entry.
Signed-off-by Anton Blanchard <[email protected]>
Huh. I obviously missed that bit of the llan spec in PAPR.
Signature · 4 lines
David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Alexander Graf
AppliedQuoted 9 lines · Anton Blanchard
The last 8 bytes of the buffer list is defined to contain the number of dropped frames. At the moment we use it to store rx entries, which trips up ethtool -S:
rx_no_buffer: 9223380832981355136Fix this by skipping the last buffer list entry.
Signed-off-by Anton Blanchard <[email protected]>
Thanks, applied to ppc-next.
Alex