hi,
what is the purpose of the ping-pong task in l4linux? I can see that it handles vmalloc requests for the kernel, but why does it need its own task for this?
thanks, Jacob
Jacob Gorm Hansen jg@ioi.dk writes:
what is the purpose of the ping-pong task in l4linux? I can see that it handles vmalloc requests for the kernel, but why does it need its own task for this?
For some reasons intra task mapping where forbidden in the original L4 implementation from Jochen Liedtke, so we had to play ping pong with the mapping. Unfortunatly nobody can remember what the real reason for this design decision was...
Regards, Jean
On Tue, Oct 01, 2002 at 04:36:34PM +0200, Jean Wolter wrote:
Jacob Gorm Hansen jg@ioi.dk writes:
what is the purpose of the ping-pong task in l4linux? I can see that it handles vmalloc requests for the kernel, but why does it need its own task for this?
For some reasons intra task mapping where forbidden in the original L4 implementation from Jochen Liedtke, so we had to play ping pong with the mapping. Unfortunatly nobody can remember what the real reason for this design decision was...
So this is if I wish for a page to be mapped multiple places in my space, correct?
When is this needed? It seems this could be solved by some decent book-keeping internally?
thanks, Jacob
Jacob Gorm Hansen jg@ioi.dk writes:
On Tue, Oct 01, 2002 at 04:36:34PM +0200, Jean Wolter wrote:
Jacob Gorm Hansen jg@ioi.dk writes:
what is the purpose of the ping-pong task in l4linux? I can see that it handles vmalloc requests for the kernel, but why does it need its own task for this?
For some reasons intra task mapping where forbidden in the original L4 implementation from Jochen Liedtke, so we had to play ping pong with the mapping. Unfortunatly nobody can remember what the real reason for this design decision was...
So this is if I wish for a page to be mapped multiple places in my space, correct?
This is needed if you want to map one page of your own address space to another place in your own address space without asking the pager whether he can supply the same page again.
Sigma0 rejected requests for a page it had already given away and had no interface for flush requests which where needed for vmfree(). So we use the ping pong task to establish mappings (by mapping the page to the ping pong address space and granting it back immediately) and are able to unmap the page ourself.
Jean
On Tue, Oct 01, 2002 at 05:06:16PM +0200, Jean Wolter wrote:
Jacob Gorm Hansen jg@ioi.dk writes: Sigma0 rejected requests for a page it had already given away and had no interface for flush requests which where needed for vmfree(). So we use the ping pong task to establish mappings (by mapping the page to the ping pong address space and granting it back immediately) and are able to unmap the page ourself.
OK, but with a modern L4 I should be able to convert pingpong into a thread, correct?
Jean
best, Jacob
On Tue, Oct 01, 2002 at 06:04:08PM +0200, Jacob Gorm Hansen wrote:
On Tue, Oct 01, 2002 at 05:06:16PM +0200, Jean Wolter wrote:
Jacob Gorm Hansen jg@ioi.dk writes: Sigma0 rejected requests for a page it had already given away and had no interface for flush requests which where needed for vmfree(). So we use the ping pong task to establish mappings (by mapping the page to the ping pong address space and granting it back immediately) and are able to unmap the page ourself.
OK, but with a modern L4 I should be able to convert pingpong into a thread, correct?
Just to answer my own question: There is no need for a separate thread, I just to demand paging now and that works fine.
/Jacob
[Jacob Gorm Hansen]
On Tue, Oct 01, 2002 at 05:06:16PM +0200, Jean Wolter wrote:
Jacob Gorm Hansen jg@ioi.dk writes: Sigma0 rejected requests for a page it had already given away and had no interface for flush requests which where needed for vmfree(). So we use the ping pong task to establish mappings (by mapping the page to the ping pong address space and granting it back immediately) and are able to unmap the page ourself.
OK, but with a modern L4 I should be able to convert pingpong into a thread, correct?
The reason why a task can not map a page within its own address space is that it opens up the possibility for DOS attacks from a single task; mapping database entries take up space, and for some mapping database implementations one might want to limit the depth of the mapping tree. Of course, two colluding tasks can still perform the same attacks, but in the two-task scenario one can (at least in theory) prevent the attacks by inserting an IPC monitoring task in between the colluding tasks.
eSk
On Tue, Oct 01, 2002 at 09:59:42PM +0200, Espen Skoglund wrote:
The reason why a task can not map a page within its own address space is that it opens up the possibility for DOS attacks from a single task; mapping database entries take up space, and for some mapping database implementations one might want to limit the depth of the mapping tree. Of course, two colluding tasks can still perform the same attacks, but in the two-task scenario one can (at least in theory) prevent the attacks by inserting an IPC monitoring task in between the colluding tasks.
Uh I see. Yesterday I removed pingpong and demand paged everything (under Fiasco). Our version of l4linux is now 100% demand paged (no preallocation of superpages or anything, we like the backing pager to be able to decide about the pagesizes and so on), and that is harder to do if we have to keep a ping-pong task synced accross migrations.
How about fixing the number of mappings possible to a decent default value, then let tasks with special needs ask rmgr for a higher limit if needed? There is never going to be such a thing as an infinite mapping database anyhow.
Best, Jacob
l4-hackers@os.inf.tu-dresden.de