X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fnet%2Fvirtio%2Fvirtqueue.h;h=8d7f197b139cd6459293cfe6557a3eafb3e870ad;hb=5fc66630bed5db8b0e2507e7324f1c8f98e0dd9a;hp=b728ff86d6f9c0e8c226d950783946ade7fecf7b;hpb=6094557de086702961800fdb1159670231a9f218;p=dpdk.git diff --git a/drivers/net/virtio/virtqueue.h b/drivers/net/virtio/virtqueue.h index b728ff86d6..8d7f197b13 100644 --- a/drivers/net/virtio/virtqueue.h +++ b/drivers/net/virtio/virtqueue.h @@ -54,6 +54,32 @@ virtio_wmb(uint8_t weak_barriers) rte_cio_wmb(); } +static inline uint16_t +virtqueue_fetch_flags_packed(struct vring_packed_desc *dp, + uint8_t weak_barriers) +{ + uint16_t flags; + + if (weak_barriers) { +/* x86 prefers to using rte_smp_rmb over __atomic_load_n as it reports + * a better perf(~1.5%), which comes from the saved branch by the compiler. + * The if and else branch are identical with the smp and cio barriers both + * defined as compiler barriers on x86. + */ +#ifdef RTE_ARCH_X86_64 + flags = dp->flags; + rte_smp_rmb(); +#else + flags = __atomic_load_n(&dp->flags, __ATOMIC_ACQUIRE); +#endif + } else { + flags = dp->flags; + rte_cio_rmb(); + } + + return flags; +} + static inline void virtqueue_store_flags_packed(struct vring_packed_desc *dp, uint16_t flags, uint8_t weak_barriers) @@ -307,7 +333,7 @@ desc_is_used(struct vring_packed_desc *desc, struct virtqueue *vq) { uint16_t used, avail, flags; - flags = desc->flags; + flags = virtqueue_fetch_flags_packed(desc, vq->hw->weak_barriers); used = !!(flags & VRING_PACKED_DESC_F_USED); avail = !!(flags & VRING_PACKED_DESC_F_AVAIL);