From 611d0ecc81bf948f6f9c592afdd6c2aebcfaaadb Mon Sep 17 00:00:00 2001 From: David Vrabel Date: Mon, 14 Oct 2013 10:17:14 +0200 Subject: evtchn: print ABI specific state with the 'e' debug key In the output of the 'e' debug key, print some ABI specific state in addition to the (p)ending and (m)asked bits. For the 2-level ABI, print the state of that event's selector bit. e.g., (XEN) port [p/m/s] (XEN) 1 [0/0/1]: s=3 n=0 x=0 d=0 p=74 (XEN) 2 [0/0/1]: s=3 n=0 x=0 d=0 p=75 Signed-off-by: David Vrabel Reviewed-by: Jan Beulich Acked-by: Keir Fraser --- xen/common/event_2l.c | 10 ++++++++++ xen/common/event_channel.c | 8 +++++--- xen/include/xen/event.h | 7 +++++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/xen/common/event_2l.c b/xen/common/event_2l.c index 7b28942933..a9d99d3e92 100644 --- a/xen/common/event_2l.c +++ b/xen/common/event_2l.c @@ -74,6 +74,15 @@ static bool_t evtchn_2l_is_masked(struct domain *d, return test_bit(evtchn->port, &shared_info(d, evtchn_mask)); } +static void evtchn_2l_print_state(struct domain *d, + const struct evtchn *evtchn) +{ + struct vcpu *v = d->vcpu[evtchn->notify_vcpu_id]; + + printk("%d", !!test_bit(evtchn->port / BITS_PER_EVTCHN_WORD(d), + &vcpu_info(v, evtchn_pending_sel))); +} + static const struct evtchn_port_ops evtchn_port_ops_2l = { .set_pending = evtchn_2l_set_pending, @@ -81,6 +90,7 @@ static const struct evtchn_port_ops evtchn_port_ops_2l = .unmask = evtchn_2l_unmask, .is_pending = evtchn_2l_is_pending, .is_masked = evtchn_2l_is_masked, + .print_state = evtchn_2l_print_state, }; void evtchn_2l_init(struct domain *d) diff --git a/xen/common/event_channel.c b/xen/common/event_channel.c index 7290a21dc0..f73c7a9afd 100644 --- a/xen/common/event_channel.c +++ b/xen/common/event_channel.c @@ -1232,7 +1232,7 @@ static void domain_dump_evtchn_info(struct domain *d) d->poll_mask, d->max_vcpus); printk("Event channel information for domain %d:\n" "Polling vCPUs: {%s}\n" - " port [p/m]\n", d->domain_id, keyhandler_scratch); + " port [p/m/s]\n", d->domain_id, keyhandler_scratch); spin_lock(&d->event_lock); @@ -1247,10 +1247,12 @@ static void domain_dump_evtchn_info(struct domain *d) if ( chn->state == ECS_FREE ) continue; - printk(" %4u [%d/%d]: s=%d n=%d x=%d", + printk(" %4u [%d/%d/", port, !!evtchn_port_is_pending(d, chn), - !!evtchn_port_is_masked(d, chn), + !!evtchn_port_is_masked(d, chn)); + evtchn_port_print_state(d, chn); + printk("]: s=%d n=%d x=%d", chn->state, chn->notify_vcpu_id, chn->xen_consumer); switch ( chn->state ) diff --git a/xen/include/xen/event.h b/xen/include/xen/event.h index 30c59c9979..2445562ecd 100644 --- a/xen/include/xen/event.h +++ b/xen/include/xen/event.h @@ -115,6 +115,7 @@ struct evtchn_port_ops { void (*unmask)(struct domain *d, struct evtchn *evtchn); bool_t (*is_pending)(struct domain *d, const struct evtchn *evtchn); bool_t (*is_masked)(struct domain *d, const struct evtchn *evtchn); + void (*print_state)(struct domain *d, const struct evtchn *evtchn); }; static inline void evtchn_port_set_pending(struct vcpu *v, @@ -147,4 +148,10 @@ static inline bool_t evtchn_port_is_masked(struct domain *d, return d->evtchn_port_ops->is_masked(d, evtchn); } +static inline void evtchn_port_print_state(struct domain *d, + const struct evtchn *evtchn) +{ + d->evtchn_port_ops->print_state(d, evtchn); +} + #endif /* __XEN_EVENT_H__ */ -- cgit v1.2.3