Compare commits
1 Commits
96cb71ccdc
...
872895e769
Author | SHA1 | Date |
---|---|---|
mwojcik | 872895e769 |
|
@ -935,7 +935,7 @@ impl Packet {
|
||||||
Packet::SubkernelLoadRunRequest { destination, .. } => Some(*destination),
|
Packet::SubkernelLoadRunRequest { destination, .. } => Some(*destination),
|
||||||
Packet::SubkernelLoadRunReply { destination, .. } => Some(*destination),
|
Packet::SubkernelLoadRunReply { destination, .. } => Some(*destination),
|
||||||
Packet::SubkernelMessage { destination, .. } => Some(*destination),
|
Packet::SubkernelMessage { destination, .. } => Some(*destination),
|
||||||
Packet::SubkernelMessageAck { destination } => Some(*destination),
|
Packet::SubkernelMessageAck { destination, .. } => Some(*destination),
|
||||||
Packet::DmaPlaybackStatus { destination, .. } => Some(*destination),
|
Packet::DmaPlaybackStatus { destination, .. } => Some(*destination),
|
||||||
Packet::SubkernelFinished { destination, .. } => Some(*destination),
|
Packet::SubkernelFinished { destination, .. } => Some(*destination),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
|
|
@ -489,6 +489,7 @@ fn process_aux_packet(
|
||||||
_routing_table,
|
_routing_table,
|
||||||
*rank,
|
*rank,
|
||||||
*self_destination,
|
*self_destination,
|
||||||
|
_repeaters,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
drtioaux::Packet::DmaRemoveTraceRequest {
|
drtioaux::Packet::DmaRemoveTraceRequest {
|
||||||
|
@ -506,6 +507,7 @@ fn process_aux_packet(
|
||||||
_routing_table,
|
_routing_table,
|
||||||
*rank,
|
*rank,
|
||||||
*self_destination,
|
*self_destination,
|
||||||
|
_repeaters,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
drtioaux::Packet::DmaPlaybackRequest {
|
drtioaux::Packet::DmaPlaybackRequest {
|
||||||
|
@ -528,6 +530,7 @@ fn process_aux_packet(
|
||||||
_routing_table,
|
_routing_table,
|
||||||
*rank,
|
*rank,
|
||||||
*self_destination,
|
*self_destination,
|
||||||
|
_repeaters,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -568,6 +571,7 @@ fn process_aux_packet(
|
||||||
_routing_table,
|
_routing_table,
|
||||||
*rank,
|
*rank,
|
||||||
*self_destination,
|
*self_destination,
|
||||||
|
_repeaters,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
drtioaux::Packet::SubkernelLoadRunReply {
|
drtioaux::Packet::SubkernelLoadRunReply {
|
||||||
|
@ -614,10 +618,7 @@ fn process_aux_packet(
|
||||||
} => {
|
} => {
|
||||||
forward!(_routing_table, _destination, *rank, _repeaters, &packet, timer);
|
forward!(_routing_table, _destination, *rank, _repeaters, &packet, timer);
|
||||||
kernel_manager.message_handle_incoming(status, length as usize, &data);
|
kernel_manager.message_handle_incoming(status, length as usize, &data);
|
||||||
router.send(drtioaux::Packet::SubkernelMessageAck { destination: source },
|
drtioaux::send(0, &drtioaux::Packet::SubkernelMessageAck { destination: source })
|
||||||
_routing_table,
|
|
||||||
*rank,
|
|
||||||
*self_destination)
|
|
||||||
}
|
}
|
||||||
drtioaux::Packet::SubkernelMessageAck {
|
drtioaux::Packet::SubkernelMessageAck {
|
||||||
destination: _destination,
|
destination: _destination,
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use alloc::collections::vec_deque::VecDeque;
|
use alloc::collections::vec_deque::VecDeque;
|
||||||
|
|
||||||
use libboard_artiq::{drtio_routing, drtioaux, pl::csr};
|
use libboard_artiq::{drtio_routing, drtioaux, pl::csr};
|
||||||
|
use repeater::Repeater;
|
||||||
|
|
||||||
// Packets from downstream (further satellites) are received and routed appropriately.
|
// Packets from downstream (further satellites) are received and routed appropriately.
|
||||||
// they're passed as soon as possible downstream (within the subtree), or sent upstream,
|
// they're passed as soon as possible downstream (within the subtree), or sent upstream,
|
||||||
|
@ -67,6 +68,7 @@ impl Router {
|
||||||
_routing_table: &drtio_routing::RoutingTable,
|
_routing_table: &drtio_routing::RoutingTable,
|
||||||
_rank: u8,
|
_rank: u8,
|
||||||
_destination: u8,
|
_destination: u8,
|
||||||
|
_repeaters: &[Repeater],
|
||||||
) -> Result<(), drtioaux::Error> {
|
) -> Result<(), drtioaux::Error> {
|
||||||
#[cfg(has_drtio_routing)]
|
#[cfg(has_drtio_routing)]
|
||||||
{
|
{
|
||||||
|
|
|
@ -104,8 +104,8 @@ struct Session {
|
||||||
kernel_state: KernelState,
|
kernel_state: KernelState,
|
||||||
last_exception: Option<Sliceable>,
|
last_exception: Option<Sliceable>,
|
||||||
messages: MessageManager,
|
messages: MessageManager,
|
||||||
source: u8, // which destination requested running the kernel
|
source: u8, // which destination requested running the kernel
|
||||||
subkernels_finished: Vec<u32>,
|
subkernels_finished: VecDeque<(u32, bool, u8)>, // tuple of id, with_exception, exception_source
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Session {
|
impl Session {
|
||||||
|
@ -116,7 +116,7 @@ impl Session {
|
||||||
last_exception: None,
|
last_exception: None,
|
||||||
messages: MessageManager::new(),
|
messages: MessageManager::new(),
|
||||||
source: 0,
|
source: 0,
|
||||||
subkernels_finished: Vec::new(),
|
subkernels_finished: VecDeque::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,24 +474,6 @@ impl<'a> Manager<'_> {
|
||||||
destination: u8,
|
destination: u8,
|
||||||
timer: &GlobalTimer,
|
timer: &GlobalTimer,
|
||||||
) {
|
) {
|
||||||
if let Some(subkernel_finished) = self.last_finished.take() {
|
|
||||||
info!(
|
|
||||||
"subkernel {} finished, with exception: {}",
|
|
||||||
subkernel_finished.id, subkernel_finished.with_exception
|
|
||||||
);
|
|
||||||
router.route(
|
|
||||||
drtioaux::Packet::SubkernelFinished {
|
|
||||||
destination: subkernel_finished.source,
|
|
||||||
id: subkernel_finished.id,
|
|
||||||
with_exception: subkernel_finished.with_exception,
|
|
||||||
exception_src: subkernel_finished.exception_source,
|
|
||||||
},
|
|
||||||
&routing_table,
|
|
||||||
rank,
|
|
||||||
destination,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if !self.running() {
|
if !self.running() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -550,13 +532,29 @@ impl<'a> Manager<'_> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let Some(subkernel_finished) = self.last_finished.take() {
|
||||||
|
info!(
|
||||||
|
"subkernel {} finished, with exception: {}",
|
||||||
|
subkernel_finished.id, subkernel_finished.with_exception
|
||||||
|
);
|
||||||
|
router.route(
|
||||||
|
drtioaux::Packet::SubkernelFinished {
|
||||||
|
destination: subkernel_finished.source,
|
||||||
|
id: subkernel_finished.id,
|
||||||
|
with_exception: subkernel_finished.with_exception,
|
||||||
|
exception_src: destination,
|
||||||
|
},
|
||||||
|
&routing_table,
|
||||||
|
rank,
|
||||||
|
destination,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn subkernel_load_run_reply(&mut self, succeeded: bool) {
|
pub fn subkernel_load_run_reply(&mut self, succeeded: bool) {
|
||||||
if self.session.kernel_state == KernelState::SubkernelAwaitLoad {
|
if self.session.kernel_state == KernelState::SubkernelAwaitLoad {
|
||||||
self.control
|
self.control.tx.send(kernel::Message::SubkernelLoadRunReply { succeeded: succeeded });
|
||||||
.tx
|
|
||||||
.send(kernel::Message::SubkernelLoadRunReply { succeeded: succeeded });
|
|
||||||
self.session.kernel_state = KernelState::Running;
|
self.session.kernel_state = KernelState::Running;
|
||||||
} else {
|
} else {
|
||||||
warn!("received unsolicited SubkernelLoadRunReply");
|
warn!("received unsolicited SubkernelLoadRunReply");
|
||||||
|
@ -564,17 +562,9 @@ impl<'a> Manager<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn remote_subkernel_finished(&mut self, id: u32, with_exception: bool, exception_source: u8) {
|
pub fn remote_subkernel_finished(&mut self, id: u32, with_exception: bool, exception_source: u8) {
|
||||||
if with_exception {
|
self.session
|
||||||
self.kernel_stop();
|
.subkernels_finished
|
||||||
self.last_finished = Some(SubkernelFinished {
|
.push_back((id, with_exception, exception_source));
|
||||||
source: self.session.source,
|
|
||||||
id: self.session.id,
|
|
||||||
with_exception: true,
|
|
||||||
exception_source: exception_source,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
self.session.subkernels_finished.push(id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn process_kern_message(
|
fn process_kern_message(
|
||||||
|
@ -714,16 +704,27 @@ impl<'a> Manager<'_> {
|
||||||
self.session.kernel_state = KernelState::Running;
|
self.session.kernel_state = KernelState::Running;
|
||||||
} else {
|
} else {
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
for status in &self.session.subkernels_finished {
|
for status in self.session.subkernels_finished.iter() {
|
||||||
if *status == *id {
|
if status.0 == *id {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
}
|
||||||
|
if let Some(finish_status) = self.session.subkernels_finished.remove(i) {
|
||||||
|
if finish_status.1 {
|
||||||
|
self.kernel_stop();
|
||||||
|
self.last_finished = Some(SubkernelFinished {
|
||||||
|
source: self.session.source,
|
||||||
|
id: self.session.id,
|
||||||
|
with_exception: true,
|
||||||
|
exception_source: finish_status.2,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
self.control.tx.send(kernel::Message::SubkernelAwaitFinishReply {
|
self.control.tx.send(kernel::Message::SubkernelAwaitFinishReply {
|
||||||
status: kernel::SubkernelStatus::NoError,
|
status: kernel::SubkernelStatus::NoError,
|
||||||
});
|
});
|
||||||
self.session.kernel_state = KernelState::Running;
|
self.session.kernel_state = KernelState::Running;
|
||||||
self.session.subkernels_finished.swap_remove(i);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
i += 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
Loading…
Reference in New Issue