Skip to content

Commit b466adf

Browse files
authored
feat(tty): 为TTY设备添加page_cache方法并处理无页面缓存的情况 (#1428)
- 在TTY设备中实现page_cache方法,返回None以表明字符设备不需要页面缓存 - 在页面错误处理中增加对无页面缓存情况的处理,避免panic并返回VM_FAULT_SIGBUS Signed-off-by: longjin <[email protected]>
1 parent 963ccde commit b466adf

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

kernel/src/driver/tty/tty_device.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,11 @@ impl IndexNode for TtyDevice {
408408
Ok(())
409409
}
410410

411+
fn page_cache(&self) -> Option<Arc<crate::filesystem::page_cache::PageCache>> {
412+
// TTY设备是字符设备,不需要页面缓存
413+
None
414+
}
415+
411416
fn close(&self, data: SpinLockGuard<FilePrivateData>) -> Result<(), SystemError> {
412417
let (tty, _flags) = if let FilePrivateData::Tty(tty_priv) = &*data {
413418
(tty_priv.tty(), tty_priv.flags)

kernel/src/mm/fault.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,17 @@ impl PageFaultHandler {
609609
let vma = pfm.vma();
610610
let vma_guard = vma.lock_irqsave();
611611
let file = vma_guard.vm_file().expect("no vm_file in vma");
612-
let page_cache = file.inode().page_cache().unwrap();
612+
let page_cache = match file.inode().page_cache() {
613+
Some(cache) => cache,
614+
None => {
615+
// 文件没有页面缓存,可能是不支持内存映射的设备文件
616+
log::warn!(
617+
"filemap_map_pages: file has no page cache, inode type: {}",
618+
crate::libs::name::get_type_name(&file.inode())
619+
);
620+
return VmFaultReason::VM_FAULT_SIGBUS;
621+
}
622+
};
613623
let mapper = &mut pfm.mapper;
614624

615625
// 起始页地址
@@ -650,7 +660,17 @@ impl PageFaultHandler {
650660
let vma = pfm.vma();
651661
let vma_guard = vma.lock_irqsave();
652662
let file = vma_guard.vm_file().expect("no vm_file in vma");
653-
let page_cache = file.inode().page_cache().unwrap();
663+
let page_cache = match file.inode().page_cache() {
664+
Some(cache) => cache,
665+
None => {
666+
// 文件没有页面缓存,可能是不支持内存映射的设备文件
667+
log::warn!(
668+
"filemap_fault: file has no page cache, inode type: {}",
669+
crate::libs::name::get_type_name(&file.inode())
670+
);
671+
return VmFaultReason::VM_FAULT_SIGBUS;
672+
}
673+
};
654674
let file_pgoff = pfm.file_pgoff.expect("no file_pgoff");
655675
let mut ret = VmFaultReason::empty();
656676

0 commit comments

Comments
 (0)