Flexpage: shared Mem

Adam Lackorzynski adam at os.inf.tu-dresden.de
Thu May 12 23:56:16 CEST 2016


Hi,

On Thu May 12, 2016 at 16:09:47 +0200, ba_f wrote:
> Am 2016-05-12 00:20, schrieb Adam Lackorzynski:
> > Hi,
> > 
> > > /* client.c */
> > > 
> > >   l4_fpage_t fpage = l4_obj_fpage( dataspace, 0, L4_CAP_FPAGE_RW );
> > >   l4_utcb_mr()->mr[0] = size;
> > >   l4_utcb_br()->br[0] = fpage.raw;
> > 
> > That is more like a setup for a receive. Please have a look at some
> > calls in l4sys, such as l4_scheduler_run_thread or l4_task_map which
> > send caps to the callee. Note that the l4_map_obj_control+l4_obj_fpage
> > pair(s) must be at the end of the MR-array. And do not forget proper
> > values for the sending l4_msgtag.
> 
> 
> This is what my trial(!) looks now:
> 
> /* client.c */
> 
>   l4_utcb_mr()->mr[0] = size;
>   l4_utcb_mr()->mr[1] = l4_map_obj_control(dataspace, L4_ITEM_CONT);
>   l4_utcb_mr()->mr[2] = l4_obj_fpage( dataspace, 0, L4_CAP_FPAGE_RW ).raw;

Referring to the functions I pointed you to, this should look like this:

   l4_utcb_mr()->mr[0] = size;
   l4_utcb_mr()->mr[1] = l4_map_obj_control(0, 0);
   l4_utcb_mr()->mr[2] = l4_obj_fpage(dataspace, 0, L4_CAP_FPAGE_RWX).raw;

   ret = l4_ipc_call(server, l4_utcb(), l4_msgtag(your_proto, 1, 1, 0),
                     L4_IPC_NEVER)
 
> /* server.c */
> 
>   l4_utcb_br()->bdr = 0;
> //  l4_utcb_br()->br[0] = l4_map_obj_control(dataspace,
> L4_RCV_ITEM_SINGLE_CAP);
>   l4_utcb_br()->br[0] = L4_ITEM_MAP;
>   l4_utcb_br()->br[1] = l4_obj_fpage(dataspace, 0, L4_CAP_FPAGE_RW).raw;

I think this should look like this:
   l4_utcb_br()->br[0] = dataspace.cap() | L4_RCV_ITEM_SINGLE_CAP;
   l4_utcb_br()->bdr = 0;

>   tag = l4_ipc_wait(l4_utcb(), &label, L4_IPC_NEVER);
>   while(1){
>     r = l4_ipc_error(tag, l4_utcb());
>     if ( r) {
>       fprintf(stderr, "IPC error: %x\n", r);
>       tag = l4_ipc_wait(l4_utcb(), &label, L4_IPC_NEVER);
>       continue;
>     }
>    ...
>     tag = l4_ipc_reply_and_wait(l4_utcb(), l4_msgtag(0, 1, 0, 0),
> 				&label, L4_IPC_NEVER);
> 
> 
> This gives me "IPC error: 9" when doing l4_ipc_reply_and_wait().
> I don't receive a dataspace from client, neither.

9 is L4_IPC_REMSGCUT: Cut receive message, due to message buffer is too small.

Which tells us that the receive side did not provide enough receive
capacity (aka where to put the receiving cap).
 
> > > Anyway, maybe I need some more understandings about capabilities &
> > > flexpages.
> > > (Are there any precise slides or papers about this topic?)
> > > So, the client creates a dataspace capability and allocates some
> > > memory.
> > > But, what happens when the flexpage is pushed to the server?
> > > The capability is copied and both pointing to the same allocated
> > > memory, or
> > > is the Cap and(!) the memory it is pointing to copied to server?
> > 
> > When you transfer a capability to a dataspace, you just transfer the
> > access rights to that particular dataspace to the other party. Not the
> > memory. After the transfer, both can talk to the very same dataspace,
> > map it and use it. Typically when sharing dataspaces that is called
> > shared memory.
> > 
> > Adam
> 
> 
> Actually, I would like to understand what's going on.
> I know every thread has its UTCBs and an IPC_CALL just copies the MRs from
> caller to callee.

Yes...

> But, flexpages seem to be a special case.

... they are. The difference is described in the l4_msgtag, the second
param describes the number of MRs to be transmitted as pure data, the
third one describes how many items are there, such as flexpages.

> I guess, the BRs are for receiving flexpages. And there must be some kind of
> parsing of the MRs since l4_map_obj_control+l4_obj_fpage pair(s) are
> recognized.

Both right.

> And somehow the kernel must find the matching BRs.

That's right. The bdr = 0 points the kernel to the br field index.

> Where does all this stuff happen?

In the kernel :) kern/thread-ipc.cpp is probably a good place to start
exploring this, e.g. in transfer_msg_items()



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



More information about the l4-hackers mailing list