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.
Signed-off-by: Zhuoying Cai <[email protected]> Signed-off-by: Jared Rossi <[email protected]> --- pc-bios/s390-ccw/virtio.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pc-bios/s390-ccw/virtio.c b/pc-bios/s390-ccw/virtio.c index 390b55c7b9..a448dc96e2 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.54.0
