[Stable-11.0.4 v2 131/161] pc-bios/s390-ccw: Refactor byte swapping
Michael Tokarev <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu.stable,gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
From: Zhuoying Cai <[email protected]> Introduce local variables to cache the byte-swapped values eliminating some redundant byte swap operations. Additionally, do byte swap when polling to avoid a special case where endianness is preserved. Reviewed-by: Eric Farman <[email protected]> Signed-off-by: Zhuoying Cai <[email protected]> Signed-off-by: Jared Rossi <[email protected]> Tested-by: Matthew Rosato <[email protected]> Message-ID: <[email protected]> Signed-off-by: Cornelia Huck <[email protected]> (cherry picked from commit c12bb74fd57f9ec9a90887a79282c24f17690183) Signed-off-by: Michael Tokarev <[email protected]> diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 390b55c7b92..a448dc96e26 100644 --- a/pc-bios/s390-ccw/virtio.c +++ b/pc-bios/s390-ccw/virtio.c @@ -153,14 +153,14 @@ static void vr_bswap_descriptor(VRingDesc *desc) void vring_send_buf(VRing *vr, void *p, int len, int flags) { - if (!be_ipl()) { - vr->avail->idx = bswap16(vr->avail->idx); - } + uint16_t avail_idx; + + avail_idx = be_ipl() ? vr->avail->idx : bswap16(vr->avail->idx); /* For follow-up chains we need to keep the first entry point */ if (!(flags & VRING_HIDDEN_IS_CHAIN)) { - vr->avail->ring[vr->avail->idx % vr->num] = be_ipl() ? vr->next_idx : - bswap16(vr->next_idx); + vr->avail->ring[avail_idx % vr->num] = be_ipl() ? vr->next_idx : + bswap16(vr->next_idx); } vr->desc[vr->next_idx].addr = (unsigned long)p; @@ -177,23 +177,23 @@ void vring_send_buf(VRing *vr, void *p, int len, int flags) /* Chains only have a single ID */ if (!(flags & VRING_DESC_F_NEXT)) { - vr->avail->idx++; - } - - if (!be_ipl()) { - vr->avail->idx = bswap16(vr->avail->idx); + avail_idx++; + vr->avail->idx = be_ipl() ? avail_idx : bswap16(avail_idx); } } int vr_poll(VRing *vr) { - if (vr->used->idx == vr->used_idx) { + uint16_t used_idx; + + used_idx = be_ipl() ? vr->used->idx : bswap16(vr->used->idx); + if (used_idx == vr->used_idx) { vring_notify(vr); yield(); return 0; } - vr->used_idx = vr->used->idx; /* Endianness is preserved */ + vr->used_idx = used_idx; vr->next_idx = 0; vr->desc[0].len = 0; vr->desc[0].flags = 0; -- 2.47.3