[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] Sharing grant_table pages between 2 miniOS



Dear All,
I am doing a small experiment with grant table to share 4 pages of memory between 2 miniOS, but have not been successful. For some reason, my GNTTABOP_map_grant_ref returns -1, and the 2 miniOS does not see the same machine address. I have attached here the code for the two threads i created for DomA and DomB respectively, as well as their output. Please, suggest what i should change here. I will appreciate too if you can point me to a pointer that explains grant tables with some example code.
Thank you for your reply in advance,
-- Lamia Youseff

/******************************************************************************
* kernel.c -  mini-Os-grnt-garntee (Dom A. domid = 30)
*******************************************************************************/

void UCSB_grantee_thread(void *p)
{

grant_ref_t gref[1]; // each grant_ref_t should provide me with 4k of shared memory
 void **map;
 char mystring[30]="Welcome to Shared Memory.\n";
 unsigned long mfn;

 *map = (void *) alloc_pages(2);
 memcpy(*map, mystring, 30);

 // get the machine physical address of the domain
 mfn = virt_to_mfn(*map);

 // now, share the page with remote domain (say dom 31)
 gref[0] = gnttab_grant_access(   31, //domid
                  mfn, // the page to be shared
                  0 ); // i.e. 0 == rw. 1 == ro.

 printk("My machine address is %u\n", virt_to_mach(*map));
 printk("My grant_ref_t is %d.\n",  (unsigned int) gref[0]);

 // now sleep till the other domain access the page
 for (;;){
   sleep(1000);
 }
 return;
}


/******************************************************************************
* kernel.c -- mini-Os-grnt-garnted (i.e. DomB, domid = 31)
* ****************************************************************************/
void UCSB_granted_thread(void *p)
{
 unsigned long vm_area;
 int error_val;

 gnttab_map_grant_ref_t aop[1];
 grant_handle_t ghandle[1];
 int i;

 grant_ref_t gref[1];
 gref[0] = 8;

 vm_area = (unsigned long) alloc_pages(4);

 aop[0].host_addr      = vm_area;
 aop[0].dom              =  30;  // domAid;
 aop[0].ref                =  gref[0];
 aop[0].flags             =  ( GNTMAP_host_map | GNTMAP_readonly );

 error_val = HYPERVISOR_grant_table_op( GNTTABOP_map_grant_ref, aop, 1);

 printk("My machine address is %u\n", virt_to_mach(vm_area));
printk("Error in granting_op in (HYPERVISOR_grant_table_o). Error %d....%d\n", aop[0].status, error_val);
 printk("Error ==> %s\n", gnttabop_error(aop[0].status));

 if (aop[0].status != GNTST_okay){
   printk("Error in the return status for GNTTAB_entry %d\n", i);
   return;
 }
if ( unlikely(aop[0].handle < 0) ){
   printk("Error in aop[0].handle\n");
   return;
 }
 else ghandle[0]= aop[0].handle;

 printk("My string is %s\n", (char *) vm_area);

 return ;
}

/**************************************************
*  Output from DomA
**************************************************/
Started domain Mini-OS-grantee
Xen Minimal OS!
start_info:   0001f000
 nr_pages:   8192  shared_inf: 001af000
 pt_base:    00022000  mod_start:  0x0
 mod_len:    0
 flags:      0x0
 stack:      000140e0-000160e0
MM: Init
 _text:        00000000
 _etext:       0000b19a
 _edata:       0000c7a0
 stack start:  000140e0
 _end:         00016534
 start_pfn:    2a
 max_pfn:      2000
Mapping memory range 0x400000 - 0x2000000
MM: Initialise page allocator for 38000(38000)-2000000(2000000)
MM: done
Demand map pfns start at 2200 (02200000).
Initialised demand area.
Initialising timer interface
Initialising console ... done.
gnttab_table mapped at 02200000.
Initialising scheduler
Thread "Idle": pointer: 0x3a00c, stack: 0x3c000
Initialising xenbus
Thread "xenstore": pointer: 0x3a03c, stack: 0x3e000
Dummy main: start_info=000160e0
Thread "xenbus_tester": pointer: 0x3a06c, stack: 0x40000
Thread "UCSB_grantee_thread": pointer: 0x3a09c, stack: 0x42000
Xenbus tests disabled, because of a Xend bug.
Thread "xenbus_tester" exited.
My machine address is 979255296
My grant_ref_t is 8.


/**************************************************
*  Output from DomB
**************************************************/
Started domain Mini-OS-granted
Xen Minimal OS!
start_info:   0001f000
 nr_pages:   8192  shared_inf: 001a9000
 pt_base:    00022000  mod_start:  0x0
 mod_len:    0
 flags:      0x0
cmd_line: stack: 00014180-00016180
MM: Init
 _text:        00000000
 _etext:       0000b1ce
 _edata:       0000c840
 stack start:  00014180
 _end:         000165d4
 start_pfn:    2a
 max_pfn:      2000
Mapping memory range 0x400000 - 0x2000000
MM: Initialise page allocator for 38000(38000)-2000000(2000000)
MM: done
Demand map pfns start at 2200 (02200000).
Initialised demand area.
Initialising timer interface
Initialising console ... done.
gnttab_table mapped at 02200000.
Initialising scheduler
Thread "Idle": pointer: 0x3a00c, stack: 0x3c000
Initialising xenbus
Thread "xenstore": pointer: 0x3a03c, stack: 0x3e000
Dummy main: start_info=00016180
Thread "xenbus_tester": pointer: 0x3a06c, stack: 0x40000
Thread "UCSB_granted_thread": pointer: 0x3a09c, stack: 0x42000
Xenbus tests disabled, because of a Xend bug.
Thread "xenbus_tester" exited.
My machine address is 200548352
Error in granting_op in (HYPERVISOR_grant_table_o). Error 0....-1
Error ==> okay
My string is
My string is
Thread "UCSB_granted_thread" exited.

[$$]# xm list
Name ID Mem VCPUs State Time(s)
Domain-0                                   0   256     1     r-----   1120.0
Mini-OS-granted                           31    32     1     -b----      0.0
Mini-OS-grantee                           30    32     1     -b----      0.0




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.