[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] Event channels in minios
I only skim the code -- I don't think people on the list will have time to look into details and debug your code. You also seem to make some assumptions on how things are arranged which make it impossible for other people to debug your code even if they want to. On Sun, May 08, 2016 at 01:59:39PM +0800, Kai Yu wrote: > I try to implement event channels in two minios domains. I call the > evtchn_alloc_unbound function to allocate a unbounded channel, then I check > channel's status and found it is not correct. The state should be > unbound(1),and the remote_dom is wrong, too. Where is my mistake? > > Below are the two domains' output and the code. Please help me to check it. > Thanks. > > parent dom console output: > xs_daemon_open -> 3, 0x94dc8 > ---> xs_deamon_open OK! > ---> domid : 21 > ---> I am parent DomU! > alloc_unbound rc: 0 > local port: 5 > > unbound chn: > domid: 21 > local_port: 5 > state: 4 > remote_dom: 25408 > > bind_vcpu rc: -14 > > unbound chn: > state: 4 > vcpu: 0 > remote_dom: 25408 > > child dom console output: > xs_daemon_open -> 3, 0x94dc8 > ---> xs_deamon_open OK! > ---> domid : 22 > ---> I am child DomU! > bind_interdomain rc: 0 > local port: 5 > > interdomain lchn: > state: 322320 > remote_dom: 50614 > remote_port: 0 > > interdomain rchn: > state: 463702 > remote_dom: 65416 > remote_port: 0 > vcpu: 0 > > ---> send the event > > Code: > unsigned int get_domid(struct xs_handle * xs) > { > //unsigned int domid; > char *buf; > unsigned int len, domid; > buf = xs_read(xs, XBT_NULL, "domid", &len); > domid = atoi(buf); > printf( "---> domid : %d\n" , domid); > return domid; > } > > > //the event handler > void evt_handler(evtchn_port_t port, struct pt_regs *regs, void *data) > { > printk("[Port %d] - event received\n", port); > } > > 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" ); > > domid = get_domid(xs); > int is_parent = domid % 2 == 0 ? 0 : 1; > > This is a very strange assumption. Presumably this is part of your design so I just take it for granted. But... > if(is_parent == 1) > goto parent; > else > goto child; > > parent: > printf( "---> I am parent DomU!\n" ); > //wait the next dom to start > sleep(30); > > //alloc a unbounded event channel > remote_dom = domid + 1; You'd better not assume you "child" domain happens to use the next domid. > int rc; > rc = evtchn_alloc_unbound(remote_dom, evt_handler, NULL, &local_port); > printf("alloc_unbound rc: %d\n", rc); > printf("local port: %d\n\n", local_port); > > //check the channel status > evtchn_status_t chn; > chn.dom = domid; > chn.port = local_port; > HYPERVISOR_event_channel_op(EVTCHNOP_status, &chn); > printf("unbound chn: \n"); > printf("domid: %d\n", chn.dom); > printf("local_port: %d\n", chn.port); > printf("state: %d\n", chn.status); > printf("remote_dom: %d\n\n", chn.u.unbound.dom); > This is wrong. You assume the port in unbound state. Please have a look at event_channel.h on how to interpret the union. > //bind the event chanel to VCPU 0 > evtchn_bind_vcpu_t bind_vcpu; > bind_vcpu.port = local_port; > bind_vcpu.vcpu = 0; > rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu); > printf("bind_vcpu rc: %d\n\n", rc); > > //check the channel status > HYPERVISOR_event_channel_op(EVTCHNOP_status, &chn); > printf("unbound chn: \n"); > printf("state: %d\n", chn.status); > printf("vcpu: %d\n", chn.vcpu); > printf("remote_dom: %d\n\n", chn.u.unbound.dom); > > //write the port to xenstore > //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 remote event channel to be allocated > sleep(40); > > //get the remote port from xenstore > //remote_port = read_xenstore(remote_dom, "evtchn_port"); > remote_port = 5; > Hardcoded port? How would this work? This assumption is wrong. > //bind the interdomain > int rc2; > rc2 = evtchn_bind_interdomain(remote_dom, remote_port, evt_handler, NULL, > &local_port); > printf("bind_interdomain rc: %d\n", rc2); > printf("local port: %d\n\n", local_port); > > //check the status > evtchn_status_t lchn, rchn; > lchn.dom = domid; > lchn.port = local_port; > rchn.dom = remote_dom; > rchn.port = remote_port; > HYPERVISOR_event_channel_op(EVTCHNOP_status, &lchn); > HYPERVISOR_event_channel_op(EVTCHNOP_status, &rchn); > printf("interdomain lchn: \n"); > printf("state: %d\n", lchn.status); > printf("remote_dom: %d\n", lchn.u.interdomain.dom); > printf("remote_port: %d\n\n", lchn.u.interdomain.port); > I don't think you should expect to be able to get the status of the port which belongs to another domain. > printf("interdomain rchn: \n"); > printf("state: %d\n", rchn.status); > printf("remote_dom: %d\n", rchn.u.interdomain.dom); > printf("remote_port: %d\n", rchn.u.interdomain.port); > printf("vcpu: %d\n\n", rchn.vcpu); > > //send the event > evtchn_send_t send; > send.port = local_port; > HYPERVISOR_event_channel_op(EVTCHNOP_send, &send); > printf("---> send the event\n"); > > int i = 0; > while(1) > { > sleep(1); > } > 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |