Skip to content

Commit e77e09a

Browse files
author
Jiajie Chen
committed
Use IRQ_MANAGER in drivers
1 parent dec07da commit e77e09a

File tree

12 files changed

+42
-35
lines changed

12 files changed

+42
-35
lines changed

kernel/src/arch/mipsel/interrupt.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pub use self::context::*;
22
use crate::arch::paging::get_root_page_table_ptr;
3-
use crate::drivers::DRIVERS;
3+
use crate::drivers::{DRIVERS, IRQ_MANAGER};
44
use log::*;
55
use mips::addr::*;
66
use mips::interrupts;
@@ -131,13 +131,7 @@ fn try_process_serial() -> bool {
131131
}
132132

133133
fn try_process_drivers() -> bool {
134-
// TODO
135-
for driver in DRIVERS.read().iter() {
136-
if driver.try_handle_interrupt(None) == true {
137-
return true;
138-
}
139-
}
140-
return false;
134+
IRQ_MANAGER.read().try_handle_interrupt(None)
141135
}
142136

143137
fn ipi() {

kernel/src/arch/riscv32/interrupt.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
pub use self::context::*;
2-
use crate::drivers::DRIVERS;
2+
use crate::drivers::{DRIVERS, IRQ_MANAGER};
33
use log::*;
44
use riscv::register::*;
55

@@ -99,12 +99,7 @@ fn try_process_serial() -> bool {
9999
}
100100

101101
fn try_process_drivers() -> bool {
102-
for driver in DRIVERS.read().iter() {
103-
if driver.try_handle_interrupt(None) == true {
104-
return true;
105-
}
106-
}
107-
return false;
102+
IRQ_MANAGER.read().try_handle_interrupt(None)
108103
}
109104

110105
fn ipi() {

kernel/src/arch/x86_64/interrupt/handler.rs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@
6666
6767
use super::consts::*;
6868
use super::TrapFrame;
69-
use crate::drivers::DRIVERS;
69+
use crate::drivers::{DRIVERS, IRQ_MANAGER};
7070
use bitflags::*;
7171
use log::*;
7272

@@ -96,11 +96,9 @@ pub extern "C" fn rust_trap(tf: &mut TrapFrame) {
9696
COM2 => com2(),
9797
IDE => ide(),
9898
_ => {
99-
for driver in DRIVERS.read().iter() {
100-
if driver.try_handle_interrupt(Some(irq.into())) == true {
101-
debug!("driver processed interrupt");
102-
return;
103-
}
99+
if IRQ_MANAGER.read().try_handle_interrupt(Some(irq.into())) {
100+
debug!("driver processed interrupt");
101+
return;
104102
}
105103
warn!("unhandled external IRQ number: {}", irq);
106104
}

kernel/src/drivers/block/virtio_blk.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use volatile::Volatile;
1414
use crate::sync::SpinNoIrqLock as Mutex;
1515

1616
use super::super::bus::virtio_mmio::*;
17-
use super::super::{DeviceType, Driver, BLK_DRIVERS, DRIVERS};
17+
use super::super::{DeviceType, Driver, BLK_DRIVERS, DRIVERS, IRQ_MANAGER};
1818
use crate::memory::phys_to_virt;
1919

2020
pub struct VirtIOBlk {
@@ -213,5 +213,6 @@ pub fn virtio_blk_init(node: &Node) {
213213

214214
let driver = Arc::new(driver);
215215
DRIVERS.write().push(driver.clone());
216+
IRQ_MANAGER.write().register_all(driver.clone());
216217
BLK_DRIVERS.write().push(driver);
217218
}

kernel/src/drivers/gpu/virtio_gpu.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::sync::SpinNoIrqLock as Mutex;
1616
use crate::HEAP_ALLOCATOR;
1717

1818
use super::super::bus::virtio_mmio::*;
19-
use super::super::{DeviceType, Driver, DRIVERS};
19+
use super::super::{DeviceType, Driver, DRIVERS, IRQ_MANAGER};
2020
use super::test::mandelbrot;
2121
use crate::memory::phys_to_virt;
2222

@@ -399,5 +399,6 @@ pub fn virtio_gpu_init(node: &Node) {
399399
setup_framebuffer(&mut driver);
400400

401401
let driver = Arc::new(VirtIOGpuDriver(Mutex::new(driver)));
402+
IRQ_MANAGER.write().register_all(driver.clone());
402403
DRIVERS.write().push(driver);
403404
}

kernel/src/drivers/input/virtio_input.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ use crate::arch::cpu;
1818
use crate::sync::SpinNoIrqLock as Mutex;
1919

2020
use super::super::bus::virtio_mmio::*;
21-
use super::super::{DeviceType, Driver, DRIVERS};
21+
use super::super::{DeviceType, Driver, DRIVERS, IRQ_MANAGER};
2222
use crate::memory::phys_to_virt;
2323

2424
struct VirtIOInput {
@@ -222,5 +222,6 @@ pub fn virtio_input_init(node: &Node) {
222222
.write(VirtIODeviceStatus::DRIVER_OK.bits());
223223

224224
let driver = Arc::new(VirtIOInputDriver(Mutex::new(driver)));
225+
IRQ_MANAGER.write().register_all(driver.clone());
225226
DRIVERS.write().push(driver);
226227
}

kernel/src/drivers/irq.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use alloc::collections::BTreeMap;
44
use alloc::sync::Arc;
55
use alloc::vec::Vec;
66

7-
struct IrqManager {
7+
pub struct IrqManager {
88
// drivers that only respond to specific irq
99
mapping: BTreeMap<u32, Vec<Arc<Driver>>>,
1010
// drivers that respond to all irqs
@@ -36,6 +36,14 @@ impl IrqManager {
3636
self.all.push(driver);
3737
}
3838

39+
pub fn register_opt(&mut self, irq_opt: Option<u32>, driver: Arc<Driver>) {
40+
if let Some(irq) = irq_opt {
41+
self.register_irq(irq, driver);
42+
} else {
43+
self.register_all(driver);
44+
}
45+
}
46+
3947
pub fn deregister_irq(&mut self, irq: u32, driver: Arc<Driver>) {
4048
if let Some(e) = self.mapping.get_mut(&irq) {
4149
e.retain(|d| !Arc::ptr_eq(&d, &driver));
@@ -46,17 +54,19 @@ impl IrqManager {
4654
self.all.retain(|d| !Arc::ptr_eq(&d, &driver));
4755
}
4856

49-
pub fn handle_interrupt(&self, irq: u32) -> bool {
50-
if let Some(e) = self.mapping.get(&irq) {
51-
for dri in e.iter() {
52-
if dri.try_handle_interrupt(Some(irq)) {
53-
return true;
57+
pub fn try_handle_interrupt(&self, irq_opt: Option<u32>) -> bool {
58+
if let Some(irq) = irq_opt {
59+
if let Some(e) = self.mapping.get(&irq) {
60+
for dri in e.iter() {
61+
if dri.try_handle_interrupt(Some(irq)) {
62+
return true;
63+
}
5464
}
5565
}
5666
}
5767

5868
for dri in self.all.iter() {
59-
if dri.try_handle_interrupt(Some(irq)) {
69+
if dri.try_handle_interrupt(irq_opt) {
6070
return true;
6171
}
6272
}

kernel/src/drivers/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ lazy_static! {
9797
pub static ref DRIVERS: RwLock<Vec<Arc<Driver>>> = RwLock::new(Vec::new());
9898
pub static ref NET_DRIVERS: RwLock<Vec<Arc<Driver>>> = RwLock::new(Vec::new());
9999
pub static ref BLK_DRIVERS: RwLock<Vec<Arc<Driver>>> = RwLock::new(Vec::new());
100+
pub static ref IRQ_MANAGER: RwLock<irq::IrqManager> = RwLock::new(irq::IrqManager::new());
100101
}
101102

102103
pub struct BlockDriver(pub Arc<Driver>);

kernel/src/drivers/net/e1000.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::drivers::provider::Provider;
2020
use crate::net::SOCKETS;
2121
use crate::sync::SpinNoIrqLock as Mutex;
2222

23-
use super::super::{DeviceType, Driver, DRIVERS, NET_DRIVERS, SOCKET_ACTIVITY};
23+
use super::super::{DeviceType, Driver, DRIVERS, IRQ_MANAGER, NET_DRIVERS, SOCKET_ACTIVITY};
2424

2525
#[derive(Clone)]
2626
pub struct E1000Driver(Arc<Mutex<E1000<Provider>>>);
@@ -202,5 +202,6 @@ pub fn init(name: String, irq: Option<u32>, header: usize, size: usize, index: u
202202

203203
let driver = Arc::new(e1000_iface);
204204
DRIVERS.write().push(driver.clone());
205+
IRQ_MANAGER.write().register_opt(irq, driver.clone());
205206
NET_DRIVERS.write().push(driver);
206207
}

kernel/src/drivers/net/ixgbe.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ use crate::net::SOCKETS;
1919
use crate::sync::FlagsGuard;
2020
use crate::sync::SpinNoIrqLock as Mutex;
2121

22-
use super::super::{provider::Provider, DeviceType, Driver, DRIVERS, NET_DRIVERS, SOCKET_ACTIVITY};
22+
use super::super::{
23+
provider::Provider, DeviceType, Driver, DRIVERS, IRQ_MANAGER, NET_DRIVERS, SOCKET_ACTIVITY,
24+
};
2325

2426
#[derive(Clone)]
2527
struct IXGBEDriver {
@@ -220,6 +222,7 @@ pub fn ixgbe_init(
220222
};
221223

222224
let driver = Arc::new(ixgbe_iface);
225+
IRQ_MANAGER.write().register_opt(irq, driver.clone());
223226
DRIVERS.write().push(driver.clone());
224227
NET_DRIVERS.write().push(driver.clone());
225228
driver

0 commit comments

Comments
 (0)