From 847a1c75765aaf038285a6e20239b6f5ed002824 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Tue, 29 Jan 2019 16:08:00 +0800 Subject: [PATCH] use core::sync::atomic::fence --- kernel/src/arch/aarch64/cpu.rs | 4 ---- kernel/src/arch/riscv32/cpu.rs | 4 ---- kernel/src/arch/x86_64/cpu.rs | 4 ---- kernel/src/drivers/net/virtio_net.rs | 5 +++-- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/kernel/src/arch/aarch64/cpu.rs b/kernel/src/arch/aarch64/cpu.rs index 701150d..bf495bc 100644 --- a/kernel/src/arch/aarch64/cpu.rs +++ b/kernel/src/arch/aarch64/cpu.rs @@ -6,7 +6,3 @@ pub fn id() -> usize { // TODO: cpu id 0 } - -pub fn fence() { - unsafe { asm!("dmb ish" ::: "memory"); } -} diff --git a/kernel/src/arch/riscv32/cpu.rs b/kernel/src/arch/riscv32/cpu.rs index b42f447..0a33080 100644 --- a/kernel/src/arch/riscv32/cpu.rs +++ b/kernel/src/arch/riscv32/cpu.rs @@ -35,7 +35,3 @@ pub unsafe fn start_others(hart_mask: usize) { pub fn halt() { unsafe { riscv::asm::wfi() } } - -pub fn fence() { - unsafe { asm!("fence" ::: "memory"); } -} diff --git a/kernel/src/arch/x86_64/cpu.rs b/kernel/src/arch/x86_64/cpu.rs index 6a1ff41..3229554 100644 --- a/kernel/src/arch/x86_64/cpu.rs +++ b/kernel/src/arch/x86_64/cpu.rs @@ -30,7 +30,3 @@ pub fn halt() { use x86_64::instructions::hlt; hlt(); } - -pub fn fence() { - unsafe { asm!("mfence" ::: "memory"); } -} diff --git a/kernel/src/drivers/net/virtio_net.rs b/kernel/src/drivers/net/virtio_net.rs index 69b2b3c..595b6ab 100644 --- a/kernel/src/drivers/net/virtio_net.rs +++ b/kernel/src/drivers/net/virtio_net.rs @@ -4,6 +4,7 @@ use alloc::prelude::*; use alloc::sync::Arc; use core::mem::size_of; use core::slice; +use core::sync::atomic::{fence, Ordering}; use bitflags::*; use device_tree::Node; @@ -215,7 +216,7 @@ impl phy::TxToken for VirtIONetTxToken { desc.len.write((len + size_of::()) as u32); // memory barrier - crate::arch::cpu::fence(); + fence(Ordering::SeqCst); // add desc to available ring ring.idx.write(ring.idx.read() + 1); @@ -376,7 +377,7 @@ pub fn virtio_net_init(node: &Node) { desc.flags.write(0); } // memory barrier - crate::arch::cpu::fence(); + fence(Ordering::SeqCst); if queue == VIRTIO_QUEUE_RECEIVE {