From 281b72c94def2db7e5fa2bf3c19f754b782aa69c Mon Sep 17 00:00:00 2001 From: ch1337 Date: Mon, 19 May 2025 11:39:13 +0200 Subject: [PATCH] mm: modify rss field only through deticated method --- qlib/kernel/kernel/shm.rs | 8 +++----- qlib/kernel/memmgr/mm.rs | 33 +++++++++++---------------------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/qlib/kernel/kernel/shm.rs b/qlib/kernel/kernel/shm.rs index 7e33f3310..f8e7b47c2 100644 --- a/qlib/kernel/kernel/shm.rs +++ b/qlib/kernel/kernel/shm.rs @@ -558,11 +558,9 @@ impl MemoryManager { if vma.mlockMode != MLockMode::MlockNone { mapping.lockedAS -= r.Len(); } - - let mut pt = self.pagetable.write(); - - pt.pt.MUnmap(r.Start(), r.Len())?; - pt.curRSS -= r.Len(); + self.pagetable.write() + .pt.MUnmap(r.Start(), r.Len())?; + self.RemoveRssLock(&r); let vgap = mapping.vmas.Remove(&vseg); vseg = vgap.NextSeg(); } else { diff --git a/qlib/kernel/memmgr/mm.rs b/qlib/kernel/memmgr/mm.rs index 4b5b7c6dd..aaae5dda5 100644 --- a/qlib/kernel/memmgr/mm.rs +++ b/qlib/kernel/memmgr/mm.rs @@ -458,24 +458,10 @@ impl MemoryManager { let vma = vseg.Value(); if !vma.kernel { - /*if vma.mappable.is_some() { - let mappable = vma.mappable.clone().unwrap(); - // todo: fix the Madvise/MADV_DONTNEED, when there are multiple process MAdviseOp::MADV_DONTNEED - // with current implementation, the first Madvise/MADV_DONTNEED will work. - mappable.RemoveMapping(self, &r, vma.offset, vma.CanWriteMappableLocked())?; - } - - mapping.usageAS -= r.Len(); - if vma.mlockMode != MLockMode::MlockNone { - mapping.lockedAS -= r.Len(); - }*/ - - let mut pt = self.pagetable.write(); - - pt.pt.MUnmap(r.Start(), r.Len())?; - pt.curRSS -= r.Len(); + self.pagetable.write() + .pt.MUnmap(r.Start(), r.Len())?; + self.RemoveRssLock(&r); } - //let vgap = mapping.vmas.Remove(&vseg); vseg = vgap.NextSeg(); } @@ -504,10 +490,9 @@ impl MemoryManager { mapping.lockedAS -= r.Len(); } - let mut pt = self.pagetable.write(); - - pt.pt.MUnmap(r.Start(), r.Len())?; - pt.curRSS -= r.Len(); + self.pagetable.write() + .pt.MUnmap(r.Start(), r.Len())?; + self.RemoveRssLock(&r); } let vgap = mapping.vmas.Remove(&vseg); vseg = vgap.NextSeg(); @@ -563,7 +548,11 @@ impl MemoryManager { pub fn RemoveRssLock(&self, ar: &Range) { let mut pt = self.pagetable.write(); - pt.curRSS -= ar.Len(); + if ar.Len() <= pt.curRSS { + pt.curRSS -= ar.Len(); + } else { + pt.curRSS = 0; + } } pub fn GenStatmSnapshot(&self, _task: &Task) -> Vec {