diff --git a/os/Cargo.toml b/os/Cargo.toml index 18d68849..5652cd26 100644 --- a/os/Cargo.toml +++ b/os/Cargo.toml @@ -12,8 +12,7 @@ lazy_static = { version = "1.4.0", features = ["spin_no_std"] } buddy_system_allocator = "0.6" bitflags = "1.2.1" xmas-elf = "0.7.0" -#virtio-drivers = { git = "https://github.com/wyfcyx/virtio-drivers" } -virtio-drivers = { path = "../../virtio-drivers" } +virtio-drivers = { git = "https://github.com/rcore-os/virtio-drivers" } k210-pac = { git = "https://github.com/wyfcyx/k210-pac" } k210-hal = { git = "https://github.com/wyfcyx/k210-hal" } k210-soc = { git = "https://github.com/wyfcyx/k210-soc" } diff --git a/os/src/drivers/block/virtio_blk.rs b/os/src/drivers/block/virtio_blk.rs index 170416c4..19f64f60 100644 --- a/os/src/drivers/block/virtio_blk.rs +++ b/os/src/drivers/block/virtio_blk.rs @@ -5,7 +5,7 @@ use crate::mm::{ }; use crate::sync::{UPSafeCell, Condvar}; use lazy_static::*; -use virtio_drivers::{VirtIOBlk, VirtIOHeader}; +use virtio_drivers::{VirtIOBlk, VirtIOHeader, BlkResp, RespStatus}; use crate::DEV_NON_BLOCKING_ACCESS; use alloc::collections::BTreeMap; use alloc::vec::Vec; @@ -27,11 +27,13 @@ impl BlockDevice for VirtIOBlock { let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access(); if nb { let mut blk = self.virtio_blk.exclusive_access(); - let mut resp = 0xffu8; - let token = blk.read_block_nb(block_id, buf, &mut resp).unwrap(); + let mut resp = BlkResp::default(); + let token = unsafe { + blk.read_block_nb(block_id, buf, &mut resp).unwrap() + }; drop(blk); 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 { self.virtio_blk .exclusive_access() @@ -43,11 +45,13 @@ impl BlockDevice for VirtIOBlock { let nb = *DEV_NON_BLOCKING_ACCESS.exclusive_access(); if nb { let mut blk = self.virtio_blk.exclusive_access(); - let mut resp = 0xffu8; - let token = blk.write_block_nb(block_id, buf, &mut resp).unwrap(); + let mut resp = BlkResp::default(); + let token = unsafe { + blk.write_block_nb(block_id, buf, &mut resp).unwrap() + }; drop(blk); 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 { self.virtio_blk .exclusive_access() diff --git a/user/src/bin/huge_write.rs b/user/src/bin/huge_write.rs index e93f8b8e..2a977c96 100644 --- a/user/src/bin/huge_write.rs +++ b/user/src/bin/huge_write.rs @@ -24,7 +24,7 @@ pub fn main() -> i32 { } close(f); 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!( "{}MiB written, time cost = {}ms, write speed = {}KiB/s", size_mb, time_ms, speed_kbs diff --git a/user/src/bin/huge_write_mt.rs b/user/src/bin/huge_write_mt.rs new file mode 100644 index 00000000..04717c84 --- /dev/null +++ b/user/src/bin/huge_write_mt.rs @@ -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::().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 +}