Mailing List Archive

Watchdog triggered while trying to access shared page
Hi All ,

1) I am trying to learn Xen memory sharing by writing a piece of code to
share a single page from domU to dom0
I have an producer module running in domU sharing an page & consumer
module running in dom0
- Producer writes some string in page so that consumer get read the
same string if the mapping is correct

2) I am able to get the page mapped in consumer ( dom0)
But when i try to read the string written by producer ( domU) in
consumer (dom0) ,
* Xen watchdog is triggered *
Any input as to how to map a page between dom0 & domU ?

3) The logic flow of producer & consumer is shared below ( can share the
code also if required )
// ========= Page-Produmer-domU
=======================================================
*In INIT Function: *

frame = __get_free_pages(GFP_KERNEL, 1);

framenum = virt_to_gfn(frame);


gref = gnttab_grant_foreign_access(DOM0_ID, framenum, 0); //
Grant access for one page
// Write some data to frame

strcpy((char *)frame, "Data is written in frame \n");


*In EXIT function : *

gnttab_end_foreign_access(gref, 0, frame);



// ========= Page-Consumer-dom0
=======================================================

*In INIT Function:* struct gnttab_map_grant_ref ops;

struct gnttab_unmap_grant_ref unmap_ops;



typedef struct info_t {

grant_ref_t gref;

int domid; /* remote domID */

} info_t;

info_t info;



int gref; // Value obtained from producer & passed as module-param

int domid; // Domid of producer



struct vm_struct *vm_start;

info.gref = gref;

info.domid = domid;



vm_start = alloc_vm_area(PAGE_SIZE, NULL);

gnttab_set_map_op(&ops, (unsigned long)vm_start->addr,
GNTMAP_host_map,info.gref, info.domid);
HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &ops, 1)


// == This printk causes watchdog to be triggered
=====================
printk("[Consumer-INIT]: We got string as = %s\n",
(char*)vm_start->addr );


unmap_ops.host_addr = (unsigned long)(vm_start->addr);

unmap_ops.handle = ops.handle;




*In EXIT function : *
HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &unmap_ops, 1)

//
===============================================================================

Thanks
Ashish
Re: Watchdog triggered while trying to access shared page [ In reply to ]
Hi All ,

Any input / feedback w.r.t below shared approach which I am trying on
raspberry pie 4.

Or any pointers or sample implementation for sharing memory among dom0 -
domu.

Am I doing this wrongly ?


Thanks
Ashish
Re: Watchdog triggered while trying to access shared page [ In reply to ]
Hi all ,
Can member please point to sample where memory is shared between domu - dom0

I am trying to understand the usage of grant table in the shared approach
but observing
issue when tried to access shared page

Any pointers ..

Thanks ,
Ashish
Re: Watchdog triggered while trying to access shared page [ In reply to ]
Hi Ashish,

The overall model that you are trying to follow should work.
Just make sure that the EXIT function of producer-domU is not called
until the consuder-dom0 has finished reading the data.

More comments inline below, I found a couple of issues.


AshishKumar Mishra wrote:
> Hi All ,
>
> 1) I am trying to learn Xen memory sharing by writing a piece of code to
> share a single page from domU to dom0
> I have an producer module running in domU sharing an page & consumer
> module running in dom0
> - Producer writes some string in page so that consumer get read the
> same string if the mapping is correct
>
> 2) I am able to get the page mapped in consumer ( dom0)
> But when i try to read the string written by producer ( domU) in
> consumer (dom0) ,
> * Xen watchdog is triggered *
> Any input as to how to map a page between dom0 & domU ?
>
> 3) The logic flow of producer & consumer is shared below ( can share the
> code also if required )
> // ========= Page-Produmer-domU
> =======================================================
> *In INIT Function: *
>
> frame = __get_free_pages(GFP_KERNEL, 1);
>
> framenum = virt_to_gfn(frame);
>
>
> gref = gnttab_grant_foreign_access(DOM0_ID, framenum, 0); //
> Grant access for one page
> // Write some data to frame
>
> strcpy((char *)frame, "Data is written in frame \n");
>
>
> *In EXIT function : *
>
> gnttab_end_foreign_access(gref, 0, frame);
>
>
>
> // ========= Page-Consumer-dom0
> =======================================================
>
> *In INIT Function:* struct gnttab_map_grant_ref ops;
>
> struct gnttab_unmap_grant_ref unmap_ops;
>
>
>
> typedef struct info_t {
>
> grant_ref_t gref;
>
> int domid; /* remote domID */
>
> } info_t;
>
> info_t info;
>
>
>
> int gref; // Value obtained from producer & passed as module-param
>
> int domid; // Domid of producer
>
>
>
> struct vm_struct *vm_start;
>
> info.gref = gref;
>
> info.domid = domid;
>
>
>
> vm_start = alloc_vm_area(PAGE_SIZE, NULL);

Can you try to use kmalloc, or better alloc_xenballooned_pages, instead
of alloc_vm_area to allocate the page? See:
drivers/xen/xenbus/xenbus_client.c:xenbus_map_ring_valloc_hvm as a
reference.


> gnttab_set_map_op(&ops, (unsigned long)vm_start->addr,

You need to pass the guest physical address of the page/vm_area, not the
virtual address (i.e. the __pa() address).


> GNTMAP_host_map,info.gref, info.domid);
> HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &ops, 1)
>
> // == This printk causes watchdog to be triggered
> =====================
> printk("[Consumer-INIT]: We got string as = %s\n",
> (char*)vm_start->addr );
>
>
> unmap_ops.host_addr = (unsigned long)(vm_start->addr);
>
> unmap_ops.handle = ops.handle;




> *In EXIT function : *
> HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &unmap_ops, 1)
>
> //
> ===============================================================================
>
> Thanks
> Ashish
Re: Watchdog triggered while trying to access shared page [ In reply to ]
Thanks Stefano for pointer's .
Will try them

- Ashish.