Hello, Liu
About the image attachments, I will keep that in mind.
Sorry I forgot to paste the evt_handler func, it just print some info.
void evt_handler(evtchn_port_t port, struct pt_regs *regs, void *data)
{
printk("[Port %d] - event received\n", port);
}
Later I print the evn_chn info by HYPERVISOR_event_channel_op after evtchn_alloc_unbound func, and I found the info is wrong, eg. u.ubound.dom = 1, not the second dom. Why didn't the hyper call set up the value in evtchn_status? I guess maybe it is because I installed xen at a ubuntu VM, it is probably there is a problem in the communication between the two domains in xen. What do you think about it?
Thanks!
At 2016-05-06 18:55:55, "Wei Liu" <wei.liu2@xxxxxxxxxx> wrote:
>Hello
>
>First thing I want to mention is that please don't send image
>attachments to mailing list. Please be considerate to those who have
>limited bandwidth. :-)
>
>On Fri, May 06, 2016 at 01:59:46PM +0800, 喻凯 wrote:
>> I want to implement event channels in two minios domains, DomA and DomB. DomA allocates the channel, DomB binds the channel to its local port and then sends a event. But DomA doesn't receive the event(maybe received but didn't handle the event). I want to know if i lost a procedure. Here is my code, main func in minios, and the two attachments are the printed results. Thanks.
>>
>>
>>
>>
>> int main()
>> {
>> sleep(1);
>> struct xs_handle *xs;
>> unsigned int domid, remote_dom;
>> evtchn_port_t local_port, remote_port;
>>
>>
>> /* Get a connection to the daemon */
>> xs = xs_daemon_open();
>> if(xs == NULL)
>> {
>> perror( "---> xs_deamon_open:" );
>> }
>> printf( "---> xs_deamon_open OK!\n" );
>>
>>
>> //get the current dom
>> domid = get_domid(xs);
>> int is_parent= domid % 2 == 0 ? 0 : 1;
>> if(is_parent == 1)
>> goto parent;
>> else
>> goto child;
>> parent:
>> printf( "---> I am first DomU!\n" );
>>
>>
>> //wait for next dom to start
>> sleep(30);
>> remote_dom = domid + 1;
>>
>>
>> //allocate a event channel
>> evtchn_alloc_unbound(remote_dom, evt_handler, NULL, &local_port);
>> printf("local port: %d\n", local_port);
>> //bind VCPU 0
>> evtchn_bind_vcpu_t bind_vcpu;
>> bind_vcpu.port = local_port;
>> bind_vcpu.vcpu = 0;
>> HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu);
>>
>>
>> //write_xenstore(domid, "evtchn_port", local_port);
>> //wait the event
>> while(1)
>> {
>> sleep(5);
>> }
>> return 0;
>>
>>
>> child:
>> printf( "---> I am child DomU!\n" );
>> remote_dom = domid - 1;
>> //wait the previous dom to allocate event channel
>> sleep(40);
>> //get the remote_port and bind the channel to local_port
>> //remote_port = read_xenstore(remote_dom, "evtchn_port");
>> remote_port = 5;
>> evtchn_bind_interdomain(remote_dom, remote_port, evt_handler, NULL, &local_port);
>> printf("local port: %d\n", local_port);
>>
>>
>
>What does your evt_handler do? Have you tried printing something inside
>the handler?
>
>Wei.
>
>
>> sleep(5);
>>
>>
>> //send the event
>> evtchn_send_t send;
>> send.port = local_port;
>> HYPERVISOR_event_channel_op(EVTCHNOP_send, &send);
>> printf("---> send the event\n");
>>
>>
>> while(1)
>> {
>> sleep(5);
>>
>>
>> }
>> return 0;
>> }
>
>
>
>
>
>
>> _______________________________________________
>> Minios-devel mailing list
>> Minios-devel@xxxxxxxxxxxxxxxxxxxx
>> http://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel
>
>
>_______________________________________________
>Minios-devel mailing list
>Minios-devel@xxxxxxxxxxxxxxxxxxxx
>http://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel