From 962836aa47028cec6ffcffcf13d73a7718e773af Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Thu, 20 Oct 2016 15:49:17 -0600 Subject: [PATCH] Do not block on IRQ read, add more debugging to RTL8168/9 --- scheme/irq.rs | 34 ++++++++++------------------------ 1 file changed, 10 insertions(+), 24 deletions(-) diff --git a/scheme/irq.rs b/scheme/irq.rs index ce99c423..f91118e8 100644 --- a/scheme/irq.rs +++ b/scheme/irq.rs @@ -1,10 +1,9 @@ use core::{mem, str}; use core::sync::atomic::{AtomicUsize, ATOMIC_USIZE_INIT, Ordering}; -use spin::{Mutex, Once}; +use spin::Mutex; use arch::interrupt::irq::acknowledge; use context; -use sync::WaitCondition; use syscall::error::*; use syscall::flag::EVENT_READ; use syscall::scheme::Scheme; @@ -14,22 +13,11 @@ pub static IRQ_SCHEME_ID: AtomicUsize = ATOMIC_USIZE_INIT; /// IRQ queues static ACKS: Mutex<[usize; 16]> = Mutex::new([0; 16]); static COUNTS: Mutex<[usize; 16]> = Mutex::new([0; 16]); -static WAITS: Once<[WaitCondition; 16]> = Once::new(); - -fn init_waits() -> [WaitCondition; 16] { - [ - WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), - WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), - WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), - WaitCondition::new(), WaitCondition::new(), WaitCondition::new(), WaitCondition::new() - ] -} /// Add to the input queue #[no_mangle] pub extern fn irq_trigger(irq: u8) { COUNTS.lock()[irq as usize] += 1; - WAITS.call_once(init_waits)[irq as usize].notify(); context::event::trigger(IRQ_SCHEME_ID.load(Ordering::SeqCst), irq as usize, EVENT_READ, mem::size_of::<usize>()); } @@ -59,17 +47,15 @@ impl Scheme for IrqScheme { fn read(&self, file: usize, buffer: &mut [u8]) -> Result<usize> { // Ensures that the length of the buffer is larger than the size of a usize if buffer.len() >= mem::size_of::<usize>() { - loop { - let ack = ACKS.lock()[file]; - let current = COUNTS.lock()[file]; - if ack != current { - // Safe if the length of the buffer is larger than the size of a usize - assert!(buffer.len() >= mem::size_of::<usize>()); - unsafe { *(buffer.as_mut_ptr() as *mut usize) = current; } - return Ok(mem::size_of::<usize>()); - } else { - WAITS.call_once(init_waits)[file].wait(); - } + let ack = ACKS.lock()[file]; + let current = COUNTS.lock()[file]; + if ack != current { + // Safe if the length of the buffer is larger than the size of a usize + assert!(buffer.len() >= mem::size_of::<usize>()); + unsafe { *(buffer.as_mut_ptr() as *mut usize) = current; } + Ok(mem::size_of::<usize>()) + } else { + Ok(0) } } else { Err(Error::new(EINVAL)) -- GitLab