Skip to content

Commit

Permalink
修复脏页未自动回写的问题
Browse files Browse the repository at this point in the history
  • Loading branch information
MemoryShore committed Dec 11, 2024
1 parent 14bf62b commit b863ac3
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 14 deletions.
2 changes: 1 addition & 1 deletion kernel/src/filesystem/fat/fs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ impl FATInode {

/// 更新访问时间
pub fn update_time(&mut self) {
log::warn!("update_time has not yet been implemented");
// log::warn!("update_time has not yet been implemented");
}

fn find(&mut self, name: &str) -> Result<Arc<LockedFATInode>, SystemError> {
Expand Down
12 changes: 7 additions & 5 deletions kernel/src/filesystem/page_cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -249,20 +249,22 @@ impl InnerPageCache {
MMArch::PAGE_SIZE
};

let exist = self.get_page(page_index).is_some();
let mut page = self.get_page(page_index);

if !exist {
if page.is_none() {
let page_buf = vec![0u8; MMArch::PAGE_SIZE];
self.create_pages(page_index, &page_buf)?;
page = self.get_page(page_index);
}

if let Some(page) = self.get_page(page_index) {
if let Some(page) = page {
let sub_buf = &buf[buf_offset..(buf_offset + sub_len)];

let mut page_guard = page.write_irqsave();
unsafe {
page.write_irqsave().as_slice_mut()[page_offset..page_offset + sub_len]
page_guard.as_slice_mut()[page_offset..page_offset + sub_len]
.copy_from_slice(sub_buf);
}
page_guard.add_flags(PageFlags::PG_DIRTY);

ret += sub_len;

Expand Down
24 changes: 16 additions & 8 deletions kernel/src/mm/page.rs
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ impl PageReclaimer {
for _ in 0..count.data() {
let (_, page) = self.lru.pop_lru().expect("pagecache is empty");
if page.read_irqsave().flags.contains(PageFlags::PG_DIRTY) {
Self::page_writeback(&page, true);
self.page_writeback(&page, true);
}
}
}
Expand All @@ -322,8 +322,8 @@ impl PageReclaimer {
///
/// ## 返回值
/// - VmFaultReason: 页面错误处理信息标志
pub fn page_writeback(page: &Arc<Page>, unmap: bool) {
// log::debug!("page writeback: {page:?}");
pub fn page_writeback(&mut self, page: &Arc<Page>, unmap: bool) {
log::debug!("page writeback: {page:?}");

let guard = page.read_irqsave();
let (page_cache, page_index) = match guard.page_type() {
Expand Down Expand Up @@ -372,7 +372,7 @@ impl PageReclaimer {
};

inode
.write_at(
.write_direct(
page_index * MMArch::PAGE_SIZE,
len,
unsafe {
Expand All @@ -389,19 +389,27 @@ impl PageReclaimer {
// 删除页面
page_cache.lock_irqsave().remove_page(page_index);
page_manager_lock_irqsave().remove_page(&paddr);
self.remove_page(&paddr);
} else {
// 清除标记
page.write_irqsave().remove_flags(PageFlags::PG_DIRTY);
}
}

/// lru脏页刷新
pub fn flush_dirty_pages(&self) {
pub fn flush_dirty_pages(&mut self) {
// log::info!("flush_dirty_pages");
let iter = self.lru.iter();
for (_, page) in iter {
let iter = self.lru.iter().filter_map(|(_, page)| {
if page.read_irqsave().flags().contains(PageFlags::PG_DIRTY) {
Self::page_writeback(page, false);
Some(page.clone())
} else {
None
}
});
let collection: Vec<Arc<Page>> = iter.collect();
for page in collection {
if page.read_irqsave().flags().contains(PageFlags::PG_DIRTY) {
self.page_writeback(&page, false);
}
}
}
Expand Down

0 comments on commit b863ac3

Please sign in to comment.