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:
parent
f875cbfd47
commit
f1b9cf07d3
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user