Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

增加epoll机制 #455

Merged
merged 7 commits into from
Dec 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions kernel/src/driver/disk/ahci/ahci_inode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::filesystem::vfs::file::FileMode;
use crate::filesystem::vfs::syscall::ModeType;
use crate::filesystem::vfs::{
core::generate_inode_id, make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode,
Metadata, PollStatus,
Metadata,
};
use crate::syscall::SystemError;
use crate::{libs::spinlock::SpinLock, time::TimeSpec};
Expand Down Expand Up @@ -108,10 +108,6 @@ impl IndexNode for LockedAhciInode {
return Ok(());
}

fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ | PollStatus::WRITE);
}

/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
fn read_at(
&self,
Expand Down
6 changes: 1 addition & 5 deletions kernel/src/driver/keyboard/ps2_keyboard.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use crate::{
devfs::{devfs_register, DevFS, DeviceINode},
vfs::{
core::generate_inode_id, file::FileMode, syscall::ModeType, FileType, IndexNode,
Metadata, PollStatus,
Metadata,
},
},
include::bindings::bindings::vfs_file_operations_t,
Expand Down Expand Up @@ -152,10 +152,6 @@ impl IndexNode for LockedPS2KeyBoardInode {
return Ok(());
}

fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ);
}

fn metadata(&self) -> Result<Metadata, SystemError> {
return Ok(self.0.read().metadata.clone());
}
Expand Down
2 changes: 1 addition & 1 deletion kernel/src/driver/net/virtio_net.rs
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ impl<T: Transport> phy::Device for VirtioNICDriver<T> {

fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
// kdebug!("VirtioNet: transmit");
if self.inner.lock().can_send() {
if self.inner.lock_irqsave().can_send() {
// kdebug!("VirtioNet: can send");
return Some(VirtioNetToken::new(self.clone(), None));
} else {
Expand Down
4 changes: 0 additions & 4 deletions kernel/src/driver/tty/tty_device.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,10 +214,6 @@ impl IndexNode for TtyDevice {
return Err(SystemError::EIO);
}

fn poll(&self) -> Result<crate::filesystem::vfs::PollStatus, SystemError> {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}

fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
return self.fs.read().upgrade().unwrap();
}
Expand Down
14 changes: 1 addition & 13 deletions kernel/src/filesystem/devfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use super::vfs::{
core::{generate_inode_id, ROOT_INODE},
file::FileMode,
syscall::ModeType,
FileSystem, FileType, FsInfo, IndexNode, Metadata, PollStatus,
FileSystem, FileType, FsInfo, IndexNode, Metadata,
};
use crate::{
kerror, kinfo,
Expand Down Expand Up @@ -489,18 +489,6 @@ impl IndexNode for LockedDevFSInode {
return Ok(());
}

fn poll(&self) -> Result<super::vfs::PollStatus, SystemError> {
// 加锁
let inode: SpinLockGuard<DevFSInode> = self.0.lock();

// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
if inode.metadata.file_type == FileType::Dir {
return Err(SystemError::EISDIR);
}

return Ok(PollStatus::READ | PollStatus::WRITE);
}

/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
fn read_at(
&self,
Expand Down
6 changes: 1 addition & 5 deletions kernel/src/filesystem/devfs/null_dev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::filesystem::vfs::file::FileMode;
use crate::filesystem::vfs::make_rawdev;
use crate::filesystem::vfs::syscall::ModeType;
use crate::filesystem::vfs::{
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
};
use crate::{libs::spinlock::SpinLock, syscall::SystemError, time::TimeSpec};
use alloc::{
Expand Down Expand Up @@ -102,10 +102,6 @@ impl IndexNode for LockedNullInode {
return Ok(());
}

fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ | PollStatus::WRITE);
}

/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
fn read_at(
&self,
Expand Down
6 changes: 1 addition & 5 deletions kernel/src/filesystem/devfs/zero_dev.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::filesystem::vfs::file::FileMode;
use crate::filesystem::vfs::make_rawdev;
use crate::filesystem::vfs::syscall::ModeType;
use crate::filesystem::vfs::{
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
};
use crate::{libs::spinlock::SpinLock, syscall::SystemError, time::TimeSpec};
use alloc::{
Expand Down Expand Up @@ -102,10 +102,6 @@ impl IndexNode for LockedZeroInode {
return Ok(());
}

fn poll(&self) -> Result<PollStatus, SystemError> {
return Ok(PollStatus::READ | PollStatus::WRITE);
}

/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
fn read_at(
&self,
Expand Down
14 changes: 1 addition & 13 deletions kernel/src/filesystem/fat/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
core::generate_inode_id,
file::{FileMode, FilePrivateData},
syscall::ModeType,
FileSystem, FileType, IndexNode, InodeId, Metadata, PollStatus,
FileSystem, FileType, IndexNode, InodeId, Metadata,
},
kerror,
libs::{
Expand Down Expand Up @@ -1415,18 +1415,6 @@ impl IndexNode for LockedFATInode {
}
}

fn poll(&self) -> Result<PollStatus, SystemError> {
// 加锁
let inode: SpinLockGuard<FATInode> = self.0.lock();

// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
if inode.metadata.file_type == FileType::Dir {
return Err(SystemError::EISDIR);
}

return Ok(PollStatus::READ | PollStatus::WRITE);
}

fn create(
&self,
name: &str,
Expand Down
7 changes: 1 addition & 6 deletions kernel/src/filesystem/kernfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use self::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};

use super::vfs::{
core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem,
FileType, FsInfo, IndexNode, InodeId, Metadata, PollStatus,
FileType, FsInfo, IndexNode, InodeId, Metadata,
};

pub mod callback;
Expand Down Expand Up @@ -293,11 +293,6 @@ impl IndexNode for KernFSInode {
return Ok(keys);
}

fn poll(&self) -> Result<PollStatus, SystemError> {
// todo: 根据inode的具体attribute,返回PollStatus
return Ok(PollStatus::READ | PollStatus::WRITE);
}

fn read_at(
&self,
offset: usize,
Expand Down
14 changes: 1 addition & 13 deletions kernel/src/filesystem/procfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ use crate::{
use super::vfs::{
file::{FileMode, FilePrivateData},
syscall::ModeType,
FileSystem, FsInfo, IndexNode, InodeId, Metadata, PollStatus,
FileSystem, FsInfo, IndexNode, InodeId, Metadata,
};

/// @brief 进程文件类型
Expand Down Expand Up @@ -485,18 +485,6 @@ impl IndexNode for LockedProcFSInode {
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}

fn poll(&self) -> Result<PollStatus, SystemError> {
// 加锁
let inode: SpinLockGuard<ProcFSInode> = self.0.lock();

// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
if inode.metadata.file_type == FileType::Dir {
return Err(SystemError::EISDIR);
}

return Ok(PollStatus::READ);
}

fn fs(&self) -> Arc<dyn FileSystem> {
return self.0.lock().fs.upgrade().unwrap();
}
Expand Down
14 changes: 1 addition & 13 deletions kernel/src/filesystem/ramfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ use crate::{

use super::vfs::{
file::FilePrivateData, syscall::ModeType, FileSystem, FsInfo, IndexNode, InodeId, Metadata,
PollStatus, SpecialNodeData,
SpecialNodeData,
};

/// RamFS的inode名称的最大长度
Expand Down Expand Up @@ -210,18 +210,6 @@ impl IndexNode for LockedRamFSInode {
return Ok(len);
}

fn poll(&self) -> Result<PollStatus, SystemError> {
// 加锁
let inode: SpinLockGuard<RamFSInode> = self.0.lock();

// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
if inode.metadata.file_type == FileType::Dir {
return Err(SystemError::EISDIR);
}

return Ok(PollStatus::READ | PollStatus::WRITE);
}

fn fs(&self) -> Arc<dyn FileSystem> {
return self.0.lock().fs.upgrade().unwrap();
}
Expand Down
44 changes: 43 additions & 1 deletion kernel/src/filesystem/vfs/file.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
use alloc::{string::String, sync::Arc, vec::Vec};
use alloc::{
string::String,
sync::{Arc, Weak},
vec::Vec,
};

use crate::{
driver::{
Expand All @@ -9,6 +13,10 @@ use crate::{
ipc::pipe::PipeFsPrivateData,
kerror,
libs::spinlock::SpinLock,
net::{
event_poll::{EPollItem, EPollPrivateData, EventPoll},
socket::SocketInode,
},
process::ProcessManager,
syscall::SystemError,
};
Expand All @@ -27,6 +35,8 @@ pub enum FilePrivateData {
DevFS(DevicePrivateData),
/// tty设备文件的私有信息
Tty(TtyFilePrivateData),
/// epoll私有信息
EPoll(EPollPrivateData),
/// 不需要文件私有信息
Unused,
}
Expand Down Expand Up @@ -396,6 +406,38 @@ impl File {
self.inode.resize(len)?;
return Ok(());
}

/// ## 向该文件添加一个EPollItem对象
///
/// 在文件状态发生变化时,需要向epoll通知
pub fn add_epoll(&mut self, epitem: Arc<EPollItem>) -> Result<(), SystemError> {
match self.file_type {
FileType::Socket => {
let inode = self.inode.downcast_ref::<SocketInode>().unwrap();
let mut socket = inode.inner();

return socket.add_epoll(epitem);
}
_ => return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP),
}
}

/// ## 删除一个绑定的epoll
pub fn remove_epoll(&mut self, epoll: &Weak<SpinLock<EventPoll>>) -> Result<(), SystemError> {
match self.file_type {
FileType::Socket => {
let inode = self.inode.downcast_ref::<SocketInode>().unwrap();
let mut socket = inode.inner();

return socket.remove_epoll(epoll);
}
_ => return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP),
}
}

pub fn poll(&self) -> Result<usize, SystemError> {
self.inode.poll()
}
}

impl Drop for File {
Expand Down
5 changes: 4 additions & 1 deletion kernel/src/filesystem/vfs/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,10 @@ pub trait IndexNode: Any + Sync + Send + Debug {
/// @brief 获取当前inode的状态。
///
/// @return PollStatus结构体
fn poll(&self) -> Result<PollStatus, SystemError>;
fn poll(&self) -> Result<usize, SystemError> {
// 若文件系统没有实现此方法,则返回“不支持”
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
}

/// @brief 获取inode的元数据
///
Expand Down
5 changes: 0 additions & 5 deletions kernel/src/filesystem/vfs/mount.rs
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,6 @@ impl IndexNode for MountFSInode {
return self.inner_inode.write_at(offset, len, buf, data);
}

#[inline]
fn poll(&self) -> Result<super::PollStatus, SystemError> {
return self.inner_inode.poll();
}

#[inline]
fn fs(&self) -> Arc<dyn FileSystem> {
return self.mount_fs.clone();
Expand Down
6 changes: 1 addition & 5 deletions kernel/src/ipc/pipe.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use crate::{
exception::InterruptArch,
filesystem::vfs::{
core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem,
FileType, IndexNode, Metadata, PollStatus,
FileType, IndexNode, Metadata,
},
libs::{spinlock::SpinLock, wait_queue::WaitQueue},
process::ProcessState,
Expand Down Expand Up @@ -310,10 +310,6 @@ impl IndexNode for LockedPipeInode {
return Ok(len);
}

fn poll(&self) -> Result<PollStatus, crate::syscall::SystemError> {
return Ok(PollStatus::READ | PollStatus::WRITE);
}

fn as_any_ref(&self) -> &dyn core::any::Any {
self
}
Expand Down
3 changes: 3 additions & 0 deletions kernel/src/libs/rbtree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,6 +343,9 @@ pub struct RBTree<K: Ord, V> {
len: usize,
}

unsafe impl<K: Ord, V> Send for RBTree<K, V> {}
unsafe impl<K: Ord, V> Sync for RBTree<K, V> {}

// Drop all owned pointers if the tree is dropped
impl<K: Ord, V> Drop for RBTree<K, V> {
#[inline]
Expand Down
Loading