WIP: Asyncify namespace identification.

This commit is contained in:
4lDO2
2020-04-29 20:44:38 +02:00
parent 737870439a
commit cbeb0070ec
3 changed files with 36 additions and 44 deletions
Generated
+1
View File
@@ -736,6 +736,7 @@ dependencies = [
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
"block-io-wrapper 0.1.0",
"crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)",
"partitionlib 0.1.0 (git+https://gitlab.redox-os.org/redox-os/partitionlib.git)",
"pcid 0.1.0",
+1
View File
@@ -7,6 +7,7 @@ edition = "2018"
arrayvec = "0.5"
bitflags = "0.7"
crossbeam-channel = "0.4"
futures = "0.3"
log = "0.4"
redox-log = { git = "https://gitlab.redox-os.org/redox-os/redox-log.git", tag = "v0.1.0" }
redox_syscall = { git = "https://gitlab.redox-os.org/redox-os/syscall.git" }
+34 -44
View File
@@ -586,55 +586,45 @@ impl Nvme {
// println!(" - Dumping namespace ID list");
data.iter().copied().take_while(|&nsid| nsid != 0).collect()
}
pub async fn identify_namespace(&self, nsid: u32) -> NvmeNamespace {
//TODO: Use buffer
let data: Dma<[u8; 4096]> = Dma::zeroed().unwrap();
// println!(" - Attempting to identify namespace {}", nsid);
let cmd_id = self.submit_admin_command(|cid| NvmeCmd::identify_namespace(
cid, data.physical(), nsid
));
// println!(" - Waiting to identify namespace {}", nsid);
let comp = self.admin_queue_completion(cmd_id).await;
// println!(" - Dumping identify namespace");
let size = *(data.as_ptr().offset(0) as *const u64);
let capacity = *(data.as_ptr().offset(8) as *const u64);
println!(
" - ID: {} Size: {} Capacity: {}",
nsid,
size,
capacity
);
//TODO: Read block size
NvmeNamespace {
id: nsid,
blocks: size,
block_size: 512, // TODO
}
}
pub async fn init_with_queues(&self) -> BTreeMap<u32, NvmeNamespace> {
self.identify_controller().await;
let nsids = self.identify_namespace_list(0).await;
let ((), nsids) = futures::join!(self.identify_controller(), self.identify_namespace_list(0));
let mut namespaces = BTreeMap::new();
for &nsid in nsids.iter() {
//TODO: Use buffer
let data: Dma<[u8; 4096]> = Dma::zeroed().unwrap();
// println!(" - Attempting to identify namespace {}", nsid);
{
let qid = 0;
let queue = &mut self.submission_queues[qid];
let cid = queue.i as u16;
let entry = NvmeCmd::identify_namespace(
cid, data.physical(), nsid
);
let tail = queue.submit(entry);
self.submission_queue_tail(qid as u16, tail as u16);
}
// println!(" - Waiting to identify namespace {}", nsid);
{
let qid = 0;
let queue = &mut self.completion_queues[qid];
let (head, entry) = queue.complete_spin();
self.completion_queue_head(qid as u16, head as u16);
}
// println!(" - Dumping identify namespace");
let size = *(data.as_ptr().offset(0) as *const u64);
let capacity = *(data.as_ptr().offset(8) as *const u64);
println!(
" - ID: {} Size: {} Capacity: {}",
nsid,
size,
capacity
);
//TODO: Read block size
namespaces.insert(nsid, NvmeNamespace {
id: nsid,
blocks: size,
block_size: 512, // TODO
});
for nsid in nsids.iter().copied() {
namespaces.insert(nsid, self.identify_namespace(nsid).await);
}
for io_qid in 1..self.completion_queues.len() {