Skip to content

Commit 4060997

Browse files
authored
增加epoll机制 (#455)
* ## 增加epoll机制 - 增加epoll机制 - 添加事件等待队列,提升socket性能 - 优化poll,删除不能poll的文件系统中的poll方法 * 添加细节注释 * 修复文件关闭后epoll还持有对应描述符的文件弱引用的bug * 将EPollEvent设计为POSIX标准 * 修改s到us转换的计算错误
1 parent 070e991 commit 4060997

File tree

27 files changed

+1667
-228
lines changed

27 files changed

+1667
-228
lines changed

kernel/src/driver/disk/ahci/ahci_inode.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use crate::filesystem::vfs::file::FileMode;
44
use crate::filesystem::vfs::syscall::ModeType;
55
use crate::filesystem::vfs::{
66
core::generate_inode_id, make_rawdev, FilePrivateData, FileSystem, FileType, IndexNode,
7-
Metadata, PollStatus,
7+
Metadata,
88
};
99
use crate::syscall::SystemError;
1010
use crate::{libs::spinlock::SpinLock, time::TimeSpec};
@@ -108,10 +108,6 @@ impl IndexNode for LockedAhciInode {
108108
return Ok(());
109109
}
110110

111-
fn poll(&self) -> Result<PollStatus, SystemError> {
112-
return Ok(PollStatus::READ | PollStatus::WRITE);
113-
}
114-
115111
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
116112
fn read_at(
117113
&self,

kernel/src/driver/keyboard/ps2_keyboard.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
devfs::{devfs_register, DevFS, DeviceINode},
99
vfs::{
1010
core::generate_inode_id, file::FileMode, syscall::ModeType, FileType, IndexNode,
11-
Metadata, PollStatus,
11+
Metadata,
1212
},
1313
},
1414
include::bindings::bindings::vfs_file_operations_t,
@@ -152,10 +152,6 @@ impl IndexNode for LockedPS2KeyBoardInode {
152152
return Ok(());
153153
}
154154

155-
fn poll(&self) -> Result<PollStatus, SystemError> {
156-
return Ok(PollStatus::READ);
157-
}
158-
159155
fn metadata(&self) -> Result<Metadata, SystemError> {
160156
return Ok(self.0.read().metadata.clone());
161157
}

kernel/src/driver/net/virtio_net.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ impl<T: Transport> phy::Device for VirtioNICDriver<T> {
165165

166166
fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
167167
// kdebug!("VirtioNet: transmit");
168-
if self.inner.lock().can_send() {
168+
if self.inner.lock_irqsave().can_send() {
169169
// kdebug!("VirtioNet: can send");
170170
return Some(VirtioNetToken::new(self.clone(), None));
171171
} else {

kernel/src/driver/tty/tty_device.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -214,10 +214,6 @@ impl IndexNode for TtyDevice {
214214
return Err(SystemError::EIO);
215215
}
216216

217-
fn poll(&self) -> Result<crate::filesystem::vfs::PollStatus, SystemError> {
218-
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
219-
}
220-
221217
fn fs(&self) -> Arc<dyn crate::filesystem::vfs::FileSystem> {
222218
return self.fs.read().upgrade().unwrap();
223219
}

kernel/src/filesystem/devfs/mod.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use super::vfs::{
66
core::{generate_inode_id, ROOT_INODE},
77
file::FileMode,
88
syscall::ModeType,
9-
FileSystem, FileType, FsInfo, IndexNode, Metadata, PollStatus,
9+
FileSystem, FileType, FsInfo, IndexNode, Metadata,
1010
};
1111
use crate::{
1212
kerror, kinfo,
@@ -489,18 +489,6 @@ impl IndexNode for LockedDevFSInode {
489489
return Ok(());
490490
}
491491

492-
fn poll(&self) -> Result<super::vfs::PollStatus, SystemError> {
493-
// 加锁
494-
let inode: SpinLockGuard<DevFSInode> = self.0.lock();
495-
496-
// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
497-
if inode.metadata.file_type == FileType::Dir {
498-
return Err(SystemError::EISDIR);
499-
}
500-
501-
return Ok(PollStatus::READ | PollStatus::WRITE);
502-
}
503-
504492
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
505493
fn read_at(
506494
&self,

kernel/src/filesystem/devfs/null_dev.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::filesystem::vfs::file::FileMode;
22
use crate::filesystem::vfs::make_rawdev;
33
use crate::filesystem::vfs::syscall::ModeType;
44
use crate::filesystem::vfs::{
5-
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
5+
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
66
};
77
use crate::{libs::spinlock::SpinLock, syscall::SystemError, time::TimeSpec};
88
use alloc::{
@@ -102,10 +102,6 @@ impl IndexNode for LockedNullInode {
102102
return Ok(());
103103
}
104104

105-
fn poll(&self) -> Result<PollStatus, SystemError> {
106-
return Ok(PollStatus::READ | PollStatus::WRITE);
107-
}
108-
109105
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
110106
fn read_at(
111107
&self,

kernel/src/filesystem/devfs/zero_dev.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::filesystem::vfs::file::FileMode;
22
use crate::filesystem::vfs::make_rawdev;
33
use crate::filesystem::vfs::syscall::ModeType;
44
use crate::filesystem::vfs::{
5-
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata, PollStatus,
5+
core::generate_inode_id, FilePrivateData, FileSystem, FileType, IndexNode, Metadata,
66
};
77
use crate::{libs::spinlock::SpinLock, syscall::SystemError, time::TimeSpec};
88
use alloc::{
@@ -102,10 +102,6 @@ impl IndexNode for LockedZeroInode {
102102
return Ok(());
103103
}
104104

105-
fn poll(&self) -> Result<PollStatus, SystemError> {
106-
return Ok(PollStatus::READ | PollStatus::WRITE);
107-
}
108-
109105
/// 读设备 - 应该调用设备的函数读写,而不是通过文件系统读写
110106
fn read_at(
111107
&self,

kernel/src/filesystem/fat/fs.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::{
1717
core::generate_inode_id,
1818
file::{FileMode, FilePrivateData},
1919
syscall::ModeType,
20-
FileSystem, FileType, IndexNode, InodeId, Metadata, PollStatus,
20+
FileSystem, FileType, IndexNode, InodeId, Metadata,
2121
},
2222
kerror,
2323
libs::{
@@ -1415,18 +1415,6 @@ impl IndexNode for LockedFATInode {
14151415
}
14161416
}
14171417

1418-
fn poll(&self) -> Result<PollStatus, SystemError> {
1419-
// 加锁
1420-
let inode: SpinLockGuard<FATInode> = self.0.lock();
1421-
1422-
// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
1423-
if inode.metadata.file_type == FileType::Dir {
1424-
return Err(SystemError::EISDIR);
1425-
}
1426-
1427-
return Ok(PollStatus::READ | PollStatus::WRITE);
1428-
}
1429-
14301418
fn create(
14311419
&self,
14321420
name: &str,

kernel/src/filesystem/kernfs/mod.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use self::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
2121

2222
use super::vfs::{
2323
core::generate_inode_id, file::FileMode, syscall::ModeType, FilePrivateData, FileSystem,
24-
FileType, FsInfo, IndexNode, InodeId, Metadata, PollStatus,
24+
FileType, FsInfo, IndexNode, InodeId, Metadata,
2525
};
2626

2727
pub mod callback;
@@ -293,11 +293,6 @@ impl IndexNode for KernFSInode {
293293
return Ok(keys);
294294
}
295295

296-
fn poll(&self) -> Result<PollStatus, SystemError> {
297-
// todo: 根据inode的具体attribute,返回PollStatus
298-
return Ok(PollStatus::READ | PollStatus::WRITE);
299-
}
300-
301296
fn read_at(
302297
&self,
303298
offset: usize,

kernel/src/filesystem/procfs/mod.rs

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use crate::{
2929
use super::vfs::{
3030
file::{FileMode, FilePrivateData},
3131
syscall::ModeType,
32-
FileSystem, FsInfo, IndexNode, InodeId, Metadata, PollStatus,
32+
FileSystem, FsInfo, IndexNode, InodeId, Metadata,
3333
};
3434

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

488-
fn poll(&self) -> Result<PollStatus, SystemError> {
489-
// 加锁
490-
let inode: SpinLockGuard<ProcFSInode> = self.0.lock();
491-
492-
// 检查当前inode是否为一个文件夹,如果是的话,就返回错误
493-
if inode.metadata.file_type == FileType::Dir {
494-
return Err(SystemError::EISDIR);
495-
}
496-
497-
return Ok(PollStatus::READ);
498-
}
499-
500488
fn fs(&self) -> Arc<dyn FileSystem> {
501489
return self.0.lock().fs.upgrade().unwrap();
502490
}

0 commit comments

Comments
 (0)