From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Winchell Subject: Re: Clock Interrupt not occurring. hypervisor_callback not being called. (more info) Date: Wed, 01 Mar 2006 15:16:12 -0500 Message-ID: <4406010C.4080303@virtualiron.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Ivan Kelly Cc: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org Ivan, How about a memory barrier right before the call to evtchn_notify in evtchn_set_pending and one before l1 = x86_atomic_xchg(&s->evtchn_pending_sel, 0) in do_hypervisor_callback? Regards, Dave Ivan Kelly wrote: >Some more info on this problem. >The problem seems to be that evtchn_pending[0] is not being updated >fast enough after the callback is made. Therefore the callback is >running and seeing nothing as pending and discarding anything that >happens. >If i put in something that delays before the start of the inner loop >somewhere, it will work fine. It doesn't have to be a printf, can be a >for(i=0;i<100000;i++) or something similar. >evtchn_pending is set as volatile. Im not sure if this is actually >helping at all though, since I have to use the ACK compiler which is >the only thing that minix will compile with. > >Does anyone have any idea on how i can get evtchn_pending to update on time? >Regards >Ivan > > > >> >>PUBLIC void >>do_hypervisor_callback(struct stackframe_s *regs) >>{ >> unsigned long l1, l2; >> unsigned int l1i, l2i, port; >> int irq; >> shared_info_t *s = hypervisor_shared_info; >> >> s->vcpu_data[0].evtchn_upcall_pending = 0; >> >> l1 = x86_atomic_xchg(&s->evtchn_pending_sel, 0); >> >> while ( l1 != 0 ) >> { >>/* kprintf("l1: %x\n");*/ >> l1i = x86_scan_forward(l1); >> l1 &= ~(1 << l1i); >> >> l2 = s->evtchn_pending[l1i] & ~s->evtchn_mask[l1i]; >> while ( l2 != 0 ) >> { >> kprintf("l2: %x\n", l2); >> l2i = x86_scan_forward(l2); >> l2 &= ~(1 << l2i); >> >> port = (l1i << 5) + l2i; >> >> if ( (irq = event_to_action[port]) != -1 ) { >> do_event(irq, regs); >> } >> } >> } >>} >> >> >> >> > >_______________________________________________ >Xen-devel mailing list >Xen-devel@lists.xensource.com >http://lists.xensource.com/xen-devel > >