xref: /DragonOS/kernel/src/mm/madvise.rs (revision cf7f801e1d50ee5b04cb728e4251a57f4183bfbc)
1a17651b1SMemoryShore use system_error::SystemError;
2a17651b1SMemoryShore 
3a17651b1SMemoryShore use crate::arch::{mm::PageMapper, MMArch};
4a17651b1SMemoryShore 
5a17651b1SMemoryShore use super::{page::Flusher, syscall::MadvFlags, ucontext::LockedVMA, VmFlags};
6a17651b1SMemoryShore 
7a17651b1SMemoryShore impl LockedVMA {
do_madvise( &self, behavior: MadvFlags, _mapper: &mut PageMapper, _flusher: impl Flusher<MMArch>, ) -> Result<(), SystemError>8a17651b1SMemoryShore     pub fn do_madvise(
9a17651b1SMemoryShore         &self,
10a17651b1SMemoryShore         behavior: MadvFlags,
11a17651b1SMemoryShore         _mapper: &mut PageMapper,
12a17651b1SMemoryShore         _flusher: impl Flusher<MMArch>,
13a17651b1SMemoryShore     ) -> Result<(), SystemError> {
14a17651b1SMemoryShore         //TODO https://code.dragonos.org.cn/xref/linux-6.6.21/mm/madvise.c?fi=madvise#do_madvise
15*cf7f801eSMemoryShore         let mut vma = self.lock_irqsave();
16a17651b1SMemoryShore         let mut new_flags = *vma.vm_flags();
17a17651b1SMemoryShore         match behavior {
18a17651b1SMemoryShore             MadvFlags::MADV_REMOVE => {
19a17651b1SMemoryShore                 // TODO
20a17651b1SMemoryShore             }
21a17651b1SMemoryShore 
22a17651b1SMemoryShore             MadvFlags::MADV_WILLNEED => {
23a17651b1SMemoryShore                 // TODO
24a17651b1SMemoryShore             }
25a17651b1SMemoryShore 
26a17651b1SMemoryShore             MadvFlags::MADV_COLD => {
27a17651b1SMemoryShore                 // TODO
28a17651b1SMemoryShore             }
29a17651b1SMemoryShore 
30a17651b1SMemoryShore             MadvFlags::MADV_PAGEOUT => {
31a17651b1SMemoryShore                 // TODO
32a17651b1SMemoryShore             }
33a17651b1SMemoryShore 
34a17651b1SMemoryShore             MadvFlags::MADV_FREE => {
35a17651b1SMemoryShore                 // TODO
36a17651b1SMemoryShore             }
37a17651b1SMemoryShore 
38a17651b1SMemoryShore             MadvFlags::MADV_POPULATE_READ | MadvFlags::MADV_POPULATE_WRITE => {
39a17651b1SMemoryShore                 // TODO
40a17651b1SMemoryShore             }
41a17651b1SMemoryShore 
42a17651b1SMemoryShore             MadvFlags::MADV_NORMAL => {
43a17651b1SMemoryShore                 new_flags = new_flags & !VmFlags::VM_RAND_READ & !VmFlags::VM_SEQ_READ
44a17651b1SMemoryShore             }
45a17651b1SMemoryShore 
46a17651b1SMemoryShore             MadvFlags::MADV_SEQUENTIAL => {
47a17651b1SMemoryShore                 new_flags = (new_flags & !VmFlags::VM_RAND_READ) | VmFlags::VM_SEQ_READ
48a17651b1SMemoryShore             }
49a17651b1SMemoryShore             MadvFlags::MADV_RANDOM => {
50a17651b1SMemoryShore                 new_flags = (new_flags & !VmFlags::VM_SEQ_READ) | VmFlags::VM_RAND_READ
51a17651b1SMemoryShore             }
52a17651b1SMemoryShore 
53a17651b1SMemoryShore             MadvFlags::MADV_DONTFORK => new_flags |= VmFlags::VM_DONTCOPY,
54a17651b1SMemoryShore 
55a17651b1SMemoryShore             MadvFlags::MADV_DOFORK => {
56a17651b1SMemoryShore                 if vma.vm_flags().contains(VmFlags::VM_IO) {
57a17651b1SMemoryShore                     return Err(SystemError::EINVAL);
58a17651b1SMemoryShore                 }
59a17651b1SMemoryShore                 new_flags &= !VmFlags::VM_DONTCOPY;
60a17651b1SMemoryShore             }
61a17651b1SMemoryShore 
62a17651b1SMemoryShore             MadvFlags::MADV_WIPEONFORK => {
63a17651b1SMemoryShore                 //MADV_WIPEONFORK仅支持匿名映射,后续实现其他映射方式后要在此处添加判断条件
64a17651b1SMemoryShore                 new_flags |= VmFlags::VM_WIPEONFORK;
65a17651b1SMemoryShore             }
66a17651b1SMemoryShore 
67a17651b1SMemoryShore             MadvFlags::MADV_KEEPONFORK => new_flags &= !VmFlags::VM_WIPEONFORK,
68a17651b1SMemoryShore 
69a17651b1SMemoryShore             MadvFlags::MADV_DONTDUMP => new_flags |= VmFlags::VM_DONTDUMP,
70a17651b1SMemoryShore 
71a17651b1SMemoryShore             //MADV_DODUMP不支持巨页映射,后续需要添加判断条件
72a17651b1SMemoryShore             MadvFlags::MADV_DODUMP => new_flags &= !VmFlags::VM_DONTDUMP,
73a17651b1SMemoryShore 
74a17651b1SMemoryShore             MadvFlags::MADV_MERGEABLE | MadvFlags::MADV_UNMERGEABLE => {}
75a17651b1SMemoryShore 
76a17651b1SMemoryShore             MadvFlags::MADV_HUGEPAGE | MadvFlags::MADV_NOHUGEPAGE => {}
77a17651b1SMemoryShore 
78a17651b1SMemoryShore             MadvFlags::MADV_COLLAPSE => {}
79a17651b1SMemoryShore             _ => {}
80a17651b1SMemoryShore         }
81a17651b1SMemoryShore         vma.set_vm_flags(new_flags);
82a17651b1SMemoryShore         Ok(())
83a17651b1SMemoryShore     }
84a17651b1SMemoryShore }
85