Use latest virtio-drivers && add huge_write_mt but it cannot work now

This commit is contained in:
Yifan Wu 2022-02-08 10:53:21 -08:00
parent 6ef566faac
commit d3bd19867c
4 changed files with 67 additions and 10 deletions

View File

@ -12,8 +12,7 @@ lazy_static = { version = "1.4.0", features = ["spin_no_std"] }
buddy_system_allocator = "0.6" buddy_system_allocator = "0.6"
bitflags = "1.2.1" bitflags = "1.2.1"
xmas-elf = "0.7.0" xmas-elf = "0.7.0"
#virtio-drivers = { git = "https://github.com/wyfcyx/virtio-drivers" } virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers" }
virtio-drivers = { path = "../../virtio-drivers" }
k210-pac = { git = "https://github.com/wyfcyx/k210-pac" } k210-pac = { git = "https://github.com/wyfcyx/k210-pac" }
k210-hal = { git = "https://github.com/wyfcyx/k210-hal" } k210-hal = { git = "https://github.com/wyfcyx/k210-hal" }
k210-soc = { git = "https://github.com/wyfcyx/k210-soc" } k210-soc = { git = "https://github.com/wyfcyx/k210-soc" }

View File

@ -5,7 +5,7 @@ use crate::mm::{
}; };
use crate::sync::{UPSafeCell, Condvar}; use crate::sync::{UPSafeCell, Condvar};
use lazy_static::*; use lazy_static::*;
use virtio_drivers::{VirtIOBlk, VirtIOHeader}; use virtio_drivers::{VirtIOBlk, VirtIOHeader, BlkResp, RespStatus};
use crate::DEV_NON_BLOCKING_ACCESS; use crate::DEV_NON_BLOCKING_ACCESS;
use alloc::collections::BTreeMap; use alloc::collections::BTreeMap;
use alloc::vec::Vec; use alloc::vec::Vec;
@ -27,11 +27,13 @@ impl BlockDevice for VirtIOBlock {
let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access(); let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access();
if nb { if nb {
let mut blk = self.virtio_blk.exclusive_access(); let mut blk = self.virtio_blk.exclusive_access();
let mut resp = 0xffu8; let mut resp = BlkResp::default();
let token = blk.read_block_nb(block_id, buf, &mut resp).unwrap(); let token = unsafe {
blk.read_block_nb(block_id, buf, &mut resp).unwrap()
};
drop(blk); drop(blk);
self.condvars.get(&token).unwrap().wait(); self.condvars.get(&token).unwrap().wait();
assert_eq!(resp, 0x0, "Error when reading VirtIOBlk"); assert_eq!(resp.status(), RespStatus::Ok, "Error when reading VirtIOBlk");
} else { } else {
self.virtio_blk self.virtio_blk
.exclusive_access() .exclusive_access()
@ -43,11 +45,13 @@ impl BlockDevice for VirtIOBlock {
let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access(); let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access();
if nb { if nb {
let mut blk = self.virtio_blk.exclusive_access(); let mut blk = self.virtio_blk.exclusive_access();
let mut resp = 0xffu8; let mut resp = BlkResp::default();
let token = blk.write_block_nb(block_id, buf, &mut resp).unwrap(); let token = unsafe {
blk.write_block_nb(block_id, buf, &mut resp).unwrap()
};
drop(blk); drop(blk);
self.condvars.get(&token).unwrap().wait(); self.condvars.get(&token).unwrap().wait();
assert_eq!(resp, 0x0, "Error when reading VirtIOBlk"); assert_eq!(resp.status(), RespStatus::Ok, "Error when writing VirtIOBlk");
} else { } else {
self.virtio_blk self.virtio_blk
.exclusive_access() .exclusive_access()

View File

@ -24,7 +24,7 @@ pub fn main() -> i32 {
} }
close(f); close(f);
let time_ms = (get_time() - start) as usize; let time_ms = (get_time() - start) as usize;
let speed_kbs = size_mb * 1000000 / time_ms; let speed_kbs = (size_mb << 20) / time_ms;
println!( println!(
"{}MiB written, time cost = {}ms, write speed = {}KiB/s", "{}MiB written, time cost = {}ms, write speed = {}KiB/s",
size_mb, time_ms, speed_kbs size_mb, time_ms, speed_kbs

View File

@ -0,0 +1,54 @@
#![no_std]
#![no_main]
#[macro_use]
extern crate user_lib;
extern crate alloc;
use alloc::vec::Vec;
use user_lib::{exit, thread_create, waittid};
use user_lib::{close, get_time, open, write, OpenFlags};
fn worker(size_kib: usize) {
let mut buffer = [0u8; 1024]; // 1KiB
for (i, ch) in buffer.iter_mut().enumerate() {
*ch = i as u8;
}
for _ in 0..size_kib {
write(3, &buffer);
}
exit(0)
}
#[no_mangle]
pub fn main(argc: usize, argv: &[&str]) -> i32 {
let f = open("testf\0", OpenFlags::CREATE | OpenFlags::WRONLY);
if f < 0 {
panic!("Open test file failed!");
}
let f = f as usize;
assert_eq!(f, 3);
assert_eq!(argc, 2, "wrong argument");
let workers = argv[1].parse::<usize>().expect("wrong argument");
assert!(workers >= 1 && 1024 % workers == 0, "wrong argument");
let start = get_time();
let mut v = Vec::new();
let size_mb = 1usize;
for i in 0..workers {
v.push(thread_create(worker as usize, size_mb * 1024 / workers));
}
for tid in v.iter() {
assert_eq!(0, waittid(*tid as usize));
}
close(f);
let time_ms = (get_time() - start) as usize;
let speed_kbs = (size_mb << 20) / time_ms;
println!(
"{}MiB written, time cost = {}ms, write speed = {}KiB/s",
size_mb, time_ms, speed_kbs
);
0
}