Skip to content

缺少对于PG_UPTODATE标志的处理 #1401

@xboHodx

Description

@xboHodx

描述错误
PG_UPTODATE描述page的数据是否是新的、正确的、能立即使用的,应该在页面创建并且写入数据完成后等情况下设置标志,在数据失效、io错误等情况之后擦除标志。
DragonOS目前没有关于这个标志的处理逻辑。
在kernel/src/filesystem/page_cache.rs的create_pages函数最后面add_page之后加上
page.write_irqsave().add_flags(PageFlags::PG_UPTODATE);,之后在一些情况下就会panic

链接: #1391 (comment)

重现步骤
在kernel/src/filesystem/page_cache.rs的create_pages函数的
self.add_page(page_index, &page);
之后加上
page.write_irqsave().add_flags(PageFlags::PG_UPTODATE);
然后执行gvisor的bad_test这个测试就会panic
Image
bad_test在执行test之前就panic了。

当前情况
在检测到缺页时会先走这个路径
do_read_fault
→ do_fault_around
→ fs.map_pages
→ filemap_map_pages
然后if page_guard.flags().contains(PageFlags::PG_UPTODATE)分支全部进不去,因为PG_UPTODATE从来没有设置过,然后就会走
do_read_fault
→ fs.fault
→ filemap_fault
把页面映射进进程空间

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug-report这是一个bug报告(如果确认是一个bug,请管理人员添加`bug` label)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions