Thank you so much.
I think I have found the reson. But I cannot understand the logic of that code.
In the Context::enqueue_drq method, there is a piece of code to determin if IPI is needed.
          if (!_pending_rq.queued())
          {
              if (!q.first())
                    ipi = true;
              q.enqueue(&_pending_rq);
          }
In my understanding, the logic behind this is to check if _pending_rq is queued first, if it is queued, it's done; else enqueue it.
And check if the queue is empty. If it is empty, IPI is needed, else this request can be picked up by IPI of other request.
The problem is I cannot image in what case the _pending_rq is already queued, at least in my program.
My scenario is: there is only one client and one server in different core, and client sends ipc in a tight loop. I think each time the server receives the request, it should dequeue _pending_rq, so it is not possible for client to see the _pending_rq is queued when it wants to ipc.But I observed this indeed happan sometime.
I hope I descibe my question clearly.
Could you give me some hints?

Best,
Yuxin


On Mon, Jul 21, 2014 at 5:23 AM, Adam Lackorzynski <adam@os.inf.tu-dresden.de> wrote:
On Thu Jul 17, 2014 at 13:03:31 -0400, Yuxin Ren wrote:
> Now I want to how many IPIs are sent during an IPC. So I add a counter for
> IPI in the kernel, and in the user level, there is a client sending IPC to
> a server on another core.
> But I found some behavior are very strange.
>
> 1. The total number of IPI are not multiple times of the number of IPC. It
> seems that there are some "extra IPIs", and with the number of IPC
> increases, the number of "extra IPIs" are also increasing.

Well, as we already discussed, depending on the situation there might be
two or four IPIs. Do you mean that with 'extra IPIs'?

>   So my question is if there are some background program in the kernel or
> L4Re to send IPIs?

In user-land there's nothing per default that runs on other CPUs, so no.
The kernel will also only send IPIs around when necessary (what else :) )
such as when doing IPC.

> 2. If I add printf statement in the kernel, the number of IPIs are also
> increasing. Does printf in the kernel cause sending IPI? If it does, is
> there any methods to avoid this. Like in Linux, it has printk function in
> the kernel.

printf in the kernel does not use IPIs. But I could image that is alters
timing and thus order which can lead to more IPIs for IPC (as above).



Adam
--
Adam                 adam@os.inf.tu-dresden.de
  Lackorzynski         http://os.inf.tu-dresden.de/~adam/

_______________________________________________
l4-hackers mailing list
l4-hackers@os.inf.tu-dresden.de
http://os.inf.tu-dresden.de/mailman/listinfo/l4-hackers