Lamia M. Youseff
2007-May-15 03:34 UTC
[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@lists.xensource.com
http://lists.xensource.com/xen-devel
Kieran Mansley
2007-May-15 08:44 UTC
Re: [Xen-devel] Sharing grant_table pages between 2 miniOS
On Mon, 2007-05-14 at 20:34 -0700, Lamia M. Youseff wrote:> 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 -1Is it possible that the grant_operation_permitted() call during the map_grant_ref operation is failing? The code in question is this (from include/xen/iocap.h): /* * Until TLB flushing issues are sorted out we consider it unsafe for * domains with no hardware-access privileges to perform grant map/transfer * operations. */ #define grant_operation_permitted(d) \ (!rangeset_is_empty((d)->iomem_caps)) If this is the case, giving the granting domain some iomem capability should allow you to do what you want. I''m not sure what the TLB flushing issues are, or what the plan is to get a proper solution to this. Kieran _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel