about the L4Linux scheduler

Lin bugeaterk at gmail.com
Tue Oct 2 23:35:28 CEST 2007


Hello, Adam.

Thanks for your comment, it is quite helpful for me.

I could make sure many about the L4Linux scheduler, but still have a
little question.


> It's the idle thread. It is running when no other activity is in the
> L4Linux system. It just sits there are waits for things to happen.
>
> > And more, What is the thread "l4lx.idler" used for ??
>
> It wakes up the idle thread when work is to be done.

"l4lx.idler" is created by "l4lx.cpu0" in "l4x_idle" and its start
function is "idler_func" (in "arch/l4/kernel/dispatch.c").

But this function only executes

  while(1) l4_sleep_forever();

so I can't understand how "l4lx_idler" wakes up "l4lx_cpu0".

It seems to only sleep.


> >   (4) What does the function "l4x_user_dispatcher" do ?
> >       How to switch contexts in Linux and in L4 almost at the same
> >       time ? (in 3)
>
> Context switching in L4 is done by the kernel (Fiasco). Also note that
> the L4Linux server itself runs in an L4 thread and thus Fiasco is doing
> context switches when switching from a user process (L4 thread) to the
> L4Linux server (another L4 thread). This basically happens when the IPCs
> are sent. The context switch in the other direction happens when the
> L4Linux server replies the user process.
> The context switches in the Linux server happen inside the schedule()
> call, the L4 side is not affected by this, as it basically only means
> that the Linux server switches to another stack.

> >   - If Linux server gets IPC for some reasons, it wakes up and check
> >     the IPC sender. Then, if the sender is a thread corresponds to
> >     certain Linux task, Linux server wakes up this Linux task and
> >     reschedules by calling "schedule()".
>
> I don't quite understand what you want to say. If the Linux server gets
> an IPC it has to handle this request (Pagefault, syscall...). If the
> Linux system wants to reschedule, schedule() is called so that another
> context may be selected.

I may have some misunderstanding...

Could you check the following things ?


(1) When a L4 thread which is runnig as a Linux task is scheduled by
    L4, is the Linux task ("task_struct" instance) corresponds to the
    L4 thread scheduled as "l4lx.cpu0" by Linux scheduler ?
    (Of course, "l4lx.cpu0" is not scheduled by L4 at this time.)

For example, there are two user processes A and B in Linux server now.

There are two threads (tasks) corresponds to A and B in L4, and there
are two "task_struct" instances (both of them only execute the loop of
"l4x_user_dispatcher") in Linux system.

When the L4 thread of A is running (scheduled by Fiasco), the context
of "l4lx.cpu0" is "task_struct" of A.

If Fiasco switches the running thread from A to B, the context of
"l4lx.cpu0" is changed to "task_struct" of B after ? (or no change ?)

In other words, are the active L4 thread of Linux process and the L4
thread the context of "l4lx.cpu0" corresponds to always the same ?


If (1) is true (if false, please skip the following...),

(2) How does the Linux server (l4lx.cpu0) notice context switches on
    L4 to change its internal context ?

If the active L4 thread is changed from A to B, Linux server needs to
switch its context to "task_struct" of B (by calling "schedule()").

But the way Linux server knows the active L4 thread is only IPC.

I assume the following section in "l4lx_user_dispatcher"

  if(!l4_thread_equal(src_id, t->user_thread_id)) {
    ...
    l4x_hybrid_return(...);
    ...
  }

might relate to preparation of such context switch in Linux server,
but it is not still clear ...


Regards,
Lin




More information about the l4-hackers mailing list