Given the existance of lsevtchn, perhaps this should be done only for
Dom0, where the information may be necessary but unavailable (i.e.
because the domain is hanging).
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Index: 2008-09-19/xen/common/event_channel.c
===================================================================
--- 2008-09-19.orig/xen/common/event_channel.c 2008-09-08 12:57:38.000000000
+0200
+++ 2008-09-19/xen/common/event_channel.c 2008-09-19 13:59:54.000000000
+0200
@@ -1079,6 +1079,56 @@ void evtchn_destroy(struct domain *d)
spin_unlock(&d->evtchn_lock);
}
+void dump_evtchn_info(struct domain *d)
+{
+ unsigned int port;
+
+ printk("Domain %d polling vCPUs: %08lx\n", d->domain_id, d->poll_mask[0]);
+
+ if ( !spin_trylock(&d->evtchn_lock) )
+ return;
+
+ printk("Event channel information for domain %d:\n",
+ d->domain_id);
+
+ for ( port = 1; port < MAX_EVTCHNS(d); ++port )
+ {
+ const struct evtchn *chn;
+
+ if ( !port_is_valid(d, port) )
+ continue;
+ chn = evtchn_from_port(d, port);
+ if ( chn->state == ECS_FREE )
+ continue;
+
+ printk(" %4u[%d/%d]: s=%d n=%d",
+ port,
+ test_bit(port, &shared_info(d, evtchn_pending)),
+ test_bit(port, &shared_info(d, evtchn_mask)),
+ chn->state, chn->notify_vcpu_id);
+ switch ( chn->state )
+ {
+ case ECS_UNBOUND:
+ printk(" d=%d", chn->u.unbound.remote_domid);
+ break;
+ case ECS_INTERDOMAIN:
+ printk(" d=%d p=%d",
+ chn->u.interdomain.remote_dom->domain_id,
+ chn->u.interdomain.remote_port);
+ break;
+ case ECS_PIRQ:
+ printk(" p=%d", chn->u.pirq);
+ break;
+ case ECS_VIRQ:
+ printk(" v=%d", chn->u.virq);
+ break;
+ }
+ printk(" x=%d\n", chn->consumer_is_xen);
+ }
+
+ spin_unlock(&d->evtchn_lock);
+}
+
/*
* Local variables:
* mode: C
Index: 2008-09-19/xen/common/keyhandler.c
===================================================================
--- 2008-09-19.orig/xen/common/keyhandler.c 2008-09-19 13:59:19.000000000
+0200
+++ 2008-09-19/xen/common/keyhandler.c 2008-09-19 13:59:54.000000000 +0200
@@ -205,11 +205,11 @@ static void dump_domains(unsigned char k
printk("VCPU information and callbacks for domain %u:\n",
d->domain_id);
for_each_vcpu ( d, v ) {
- printk(" VCPU%d: CPU%d [has=%c] flags=%lx "
+ printk(" VCPU%d: CPU%d [has=%c] flags=%lx poll=%d "
"upcall_pend = %02x, upcall_mask = %02x ",
v->vcpu_id, v->processor,
v->is_running ? 'T':'F',
- v->pause_flags,
+ v->pause_flags, v->poll_evtchn,
vcpu_info(v, evtchn_upcall_pending),
vcpu_info(v, evtchn_upcall_mask));
cpuset_print(tmpstr, sizeof(tmpstr), v->vcpu_dirty_cpumask);
@@ -230,6 +230,8 @@ static void dump_domains(unsigned char k
&vcpu_info(v, evtchn_pending_sel)));
send_guest_vcpu_virq(v, VIRQ_DEBUG);
}
+
+ dump_evtchn_info(d);
}
rcu_read_unlock(&domlist_read_lock);
Index: 2008-09-19/xen/include/xen/event.h
===================================================================
--- 2008-09-19.orig/xen/include/xen/event.h 2008-09-16 15:56:35.000000000
+0200
+++ 2008-09-19/xen/include/xen/event.h 2008-09-19 13:59:54.000000000 +0200
@@ -79,4 +79,6 @@ void notify_via_xen_event_channel(int lp
mb(); /* set blocked status /then/ caller does his work */ \
} while ( 0 )
+void dump_evtchn_info(struct domain *);
+
#endif /* __XEN_EVENT_H__ */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|