net/virtio: replace SMP barrier with IO barrier

Replace rte_smp_wmb/rmb with rte_io_wmb/rmb as they are the same on x86
and ppc platforms. Then, for function virtqueue_fetch_flags_packed/
virtqueue_store_flags_packed, the if and else branch are still identical
for the platforms except Arm.

Signed-off-by: Joyce Kong <joyce.kong@arm.com>
Reviewed-by: Ruifeng Wang <ruifeng.wang@arm.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
This commit is contained in:
Joyce Kong 2020-12-21 22:23:19 +08:00 committed by Ferruh Yigit
parent f875cbfd47
commit f1b9cf07d3

View File

@ -66,16 +66,15 @@ virtqueue_fetch_flags_packed(struct vring_packed_desc *dp,
uint16_t flags;
if (weak_barriers) {
/* x86 prefers to using rte_smp_rmb over __atomic_load_n as it reports
/* x86 prefers to using rte_io_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 io barriers both
* defined as compiler barriers on x86.
* The if and else branch are identical on the platforms except Arm.
*/
#ifdef RTE_ARCH_X86_64
flags = dp->flags;
rte_smp_rmb();
#else
#ifdef RTE_ARCH_ARM
flags = __atomic_load_n(&dp->flags, __ATOMIC_ACQUIRE);
#else
flags = dp->flags;
rte_io_rmb();
#endif
} else {
flags = dp->flags;
@ -90,22 +89,22 @@ virtqueue_store_flags_packed(struct vring_packed_desc *dp,
uint16_t flags, uint8_t weak_barriers)
{
if (weak_barriers) {
/* x86 prefers to using rte_smp_wmb over __atomic_store_n as it reports
/* x86 prefers to using rte_io_wmb over __atomic_store_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 io barriers both
* defined as compiler barriers on x86.
* The if and else branch are identical on the platforms except Arm.
*/
#ifdef RTE_ARCH_X86_64
rte_smp_wmb();
dp->flags = flags;
#else
#ifdef RTE_ARCH_ARM
__atomic_store_n(&dp->flags, flags, __ATOMIC_RELEASE);
#else
rte_io_wmb();
dp->flags = flags;
#endif
} else {
rte_io_wmb();
dp->flags = flags;
}
}
#ifdef RTE_PMD_PACKET_PREFETCH
#define rte_packet_prefetch(p) rte_prefetch1(p)
#else