On Thu, Jan 25, 2024 at 09:34:53AM +0800, zhiguojiang wrote:Hi,
Ah, we're talking about an OOM scenario. OK, that makes some sense.1 Yes, this patch has been tested.In the scenarios of the low memory system and mutil backed-applications,What testing have you done of this patch? How often does it happen?
the time-consuming problem caused by shrinking the exiting task's folios
will be more severe.
Are there particular workloads that benefit from this? (I'm not sure
what "mutil backed-applications" are?)
2 When the exiting tasks and shrink_inactive_list occur at the same time,
the folios which shrink_inactive_list reclaims may be the exiting tasks's
folios
in lruvecs. And when system is low memory, it more likely to occur,
because
more backend applidatuions will be killed.
The shrink_inactive_list reclaims the exiting tasks's folios in lruvecs
and
transforms the exiting tasks's anon folios into swap memory, which leads
to the increasing load of the current exiting tasks.
You should have mentioned that in the patch description.
You're right, I overlooked the situation with the 32-bit system.3 This patch can alleviate the load of the tasks exiting process. This patchThat's odd. I thought GCC used to complain about
can make that the exiting tasks release its anon folios faster instead of
releasing its swap memory from its anon folios swap-in in
shrink_inactive_list.
4 "mutil backed-applications" means that there are a large number of
the backend applications in the system.
Thanks
And I do mean specifically of this patch, because to my eyes itHas been tested.
shouldn't even compile.
long x = 0x100000000;
but it does the right thing. Except on 32-bit where it'll say
"warning: integer constant out of range".
In any case, the number you chose is not going to work on 32-bit systems
or on ARM or x86. It conflicts with protection keys on x86 and MTE on
ARM.
We can do it without any new magic numbers. I'm not sure this is aI agree with your point of view. I think this is currently the best solution,
great approach, but this should work:
+++ b/mm/rmap.c
@@ -840,6 +840,12 @@ static bool folio_referenced_one(struct folio *folio,
int referenced = 0;
unsigned long start = address, ptes = 0;
+ /* Skip this folio if it's mapped by an exiting task */
+ if (test_bit(MMF_OOM_SKIP, &vma->vm_mm->flags)) {
+ pra->referenced = -1;
+ return false;
+ }
+
while (page_vma_mapped_walk(&pvmw)) {
address = pvmw.address;