Invalidating mapped flexpages in pagers

Philipp Eppelt philipp.eppelt at kernkonzept.com
Mon Mar 18 13:38:36 CET 2019


On 3/18/19 11:31 AM, Paul Boddie wrote:
> On Monday 18. March 2019 08.35.56 Philipp Eppelt wrote:
>>
>> AFAIK, you cannot unmap a page during a page fault reply.
> 
> I had looked into this and couldn't see a way of returning items that would 
> provide the necessary information for unmapping previously mapped pages. I 
> imagine that one could specify a flexpage with an appropriate base address and 
> size, but then it isn't clear how its invalidation would be communicated.
> 
> I looked at the kernel code somewhat to see how it processes map items, but it 
> also wasn't clear how such items might be able to cause unmapping.
> 
>> However, your pager can track the pages you mapped and call task->unmap()
>> explicitly.
>>
>> E.g.
>> // assuming pagee_task of type L4::Cap<L4::Task>
>> pagee_task->unmap(
>>   l4_fpage(addr_of_prev_page, L4_PAGESIZE, L4_FPAGE_RWX),
>>   L4_FP_ALL_SPACES);
> 
> I guess that the pager needs to know the identity of the task for which it is 
> performing paging. As far as I understand it, this information isn't 
> automatically available via the normal IPC interactions because it would 
> expose the sender to potentially undesirable operations (such as the one being 
> described) purely because it communicated with another task.
> 
> So, I imagine that the task must first provide its identity to the pager 
> before paging begins. Then, any unmapping can take place as necessary.

Actually, there is a unmap flag which allows you to unmap all child
mappings of a memory fpage. So assume you have three address spaces, A,
B, and C, and A maps a page FP to B as FP' and B maps FP' to C as FP".

So if B decides to call unmap on its own mapping FP' with
L4_FP_OTHER_SPACES [0], it will just unmap FP" in C's address space.
If A decides to call `L4Re::Env::env()->task()->unmap(FP,
L4_FP_OTHER_SPACES)` it will unmap FP' in B and FP" in C.

I suppose that's the way for your pager to eliminate the mapping in its
pagee.

To put it into code:
L4Re::Env::env()->task()->unmap(
  l4_fpage(addr_in_this_task, L4_PAGESIZE, L4_FPAGE_RWX),
  L4_FP_OTHER_SPACES);

Cheers,
Philipp

[0]
http://l4re.org/doc/group__l4__task__api.html#ga3c24e67b976870a3e911c43c83382f66


-- 
philipp.eppelt at kernkonzept.com - Tel. 0351-41 883 221
http://www.kernkonzept.com

Kernkonzept GmbH.  Sitz: Dresden.  Amtsgericht Dresden, HRB 31129.
Geschäftsführer: Dr.-Ing. Michael Hohmuth



More information about the l4-hackers mailing list