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