Diego Nieto Cid, le mar. 24 juin 2025 14:39:35 +0100, a ecrit:
> On Mon, Jun 23, 2025 at 12:51:23AM +0200, Samuel Thibault wrote:
> > > +  err = vm_deallocate(mach_task_self(), mem, M_512M);
> > > +  ASSERT_RET(err, "deallocation failed");
> > 
> > It would be also useful to check that trying to vm_protect the PROT_NONE
> > into PROT_ALL fails when that comes above the limit.
> > 
> 
> I'm tackling this test and I'm finding some trouble to implement it.
> Currently, the patch performs the calculation of PROT_NONE size based
> on the entry's max protection.
> 
> So, if I want to test for the promotion from PROT_NONE to PROT_ALL, I
> need to set the current protection to NONE and the max protection to ALL.
> 
> This is a test in between or for preparation to the one you suggested
> but that I thought it would work:
> 
>     printf("check that allocation promotions from PROT_NONE to PROT_ALL 
> account for the limit\n");
>     err = vm_map(mach_task_self(),
>       &mem, M_512M, 0, 0, MACH_PORT_NULL, 0, 1,
>       VM_PROT_NONE, VM_PROT_ALL, VM_INHERIT_COPY);
>     ASSERT_RET(err, "allocation failed");
>     /* test, again, that PROT_NONE maps do no decrease the limit */
>     err = vm_allocate(mach_task_self(), &mem2, M_512M, TRUE);
>     ASSERT_RET(err, "allocating memory below the limit must succeed");
>       ^
>       |
>       +----- this fails because vm_map used up 512M which weren't accounted as
>              NONE due to its max protection being VM_PROT_ALL
> 
> My guess is that I should account every page with current protection (instead 
> of
> max protection) set to VM_PROT_NONE and keep track of updates through 
> vm_protect.

No, that's not what we want.

> I don't remember why it was implemented against the max protection

Because that is what Linux implements: RLIMIT_AS limits what
mmap(PROT_NONE) can allocate. Then, changing with mprotect() will not
change the RLIMIT_AS counting.

Samuel

Reply via email to