[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] Clock Interrupt not occurring. hypervisor_callback not being called. (more info)
- To: xen-devel@xxxxxxxxxxxxxxxxxxx
- From: "Ivan Kelly" <ivanbkelly@xxxxxxxxx>
- Date: Wed, 1 Mar 2006 16:17:21 +0000
- Delivery-date: Wed, 01 Mar 2006 16:17:53 +0000
- Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:mime-version:content-type:content-transfer-encoding:content-disposition; b=ZKhTBA0jFIHt9rBP2vTOWVHZDCC3uOy5t/QKfBUc/BaQweuNV5sP4BSdLsOTirfoYtWNL5Ks2aQHWBMtVbaxCIUi3Hnh+PeRyJJ3wZor+57AYwl97vz/2axBC1iV9MXHOicrYVP8rhbpyhFd3ejLOR4QZ/nczCHxXj6u7AqjVB4=
- List-id: Xen developer discussion <xen-devel.lists.xensource.com>
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
> <SNIP>
> 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);
> }
> }
> }
> }
> <ENDSNIP>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel