[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.0-testing] Extended PHYSDEVOP_irq_status_query to obtain sharing status
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID 694a37bf37068610e6167564096e99984815a7be # Parent 05f07acd3be2fac0c66ef6e9a94b129f7f7e37b5 Extended PHYSDEVOP_irq_status_query to obtain sharing status (bound to multiple guests?). Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> xen-unstable changeset: 10295:1a500cc4fcd5648ce52d782be30948ed9a3e28d9 xen-unstable date: Wed Jun 7 15:46:05 2006 +0100 --- xen/arch/x86/irq.c | 22 ++++++++++++++++++++++ xen/arch/x86/physdev.c | 9 ++++----- xen/include/asm-x86/irq.h | 3 +++ xen/include/public/physdev.h | 2 ++ 4 files changed, 31 insertions(+), 5 deletions(-) diff -r 05f07acd3be2 -r 694a37bf3706 xen/arch/x86/irq.c --- a/xen/arch/x86/irq.c Wed Jun 07 14:24:14 2006 +0100 +++ b/xen/arch/x86/irq.c Wed Jun 07 15:51:19 2006 +0100 @@ -376,6 +376,28 @@ int pirq_acktype(int irq) BUG(); return 0; +} + +int pirq_shared(int irq) +{ + unsigned int vector; + irq_desc_t *desc; + irq_guest_action_t *action; + unsigned long flags; + int shared; + + vector = irq_to_vector(irq); + if ( vector == 0 ) + return 0; + + desc = &irq_desc[vector]; + + spin_lock_irqsave(&desc->lock, flags); + action = (irq_guest_action_t *)desc->action; + shared = ((desc->status & IRQ_GUEST) && (action->nr_guests > 1)); + spin_unlock_irqrestore(&desc->lock, flags); + + return shared; } int pirq_guest_bind(struct vcpu *v, int irq, int will_share) diff -r 05f07acd3be2 -r 694a37bf3706 xen/arch/x86/physdev.c --- a/xen/arch/x86/physdev.c Wed Jun 07 14:24:14 2006 +0100 +++ b/xen/arch/x86/physdev.c Wed Jun 07 15:51:19 2006 +0100 @@ -12,15 +12,12 @@ #include <public/xen.h> #include <public/physdev.h> -extern int +int ioapic_guest_read( unsigned long physbase, unsigned int reg, u32 *pval); -extern int +int ioapic_guest_write( unsigned long physbase, unsigned int reg, u32 pval); -extern int -pirq_acktype( - int irq); /* * Demuxing hypercall. @@ -48,6 +45,8 @@ long do_physdev_op(GUEST_HANDLE(physdev_ op.u.irq_status_query.flags = 0; if ( pirq_acktype(irq) != 0 ) op.u.irq_status_query.flags |= PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY; + if ( pirq_shared(irq) ) + op.u.irq_status_query.flags |= PHYSDEVOP_IRQ_SHARED; ret = 0; break; diff -r 05f07acd3be2 -r 694a37bf3706 xen/include/asm-x86/irq.h --- a/xen/include/asm-x86/irq.h Wed Jun 07 14:24:14 2006 +0100 +++ b/xen/include/asm-x86/irq.h Wed Jun 07 15:51:19 2006 +0100 @@ -47,4 +47,7 @@ extern atomic_t irq_err_count; extern atomic_t irq_err_count; extern atomic_t irq_mis_count; +int pirq_acktype(int irq); +int pirq_shared(int irq); + #endif /* _ASM_HW_IRQ_H */ diff -r 05f07acd3be2 -r 694a37bf3706 xen/include/public/physdev.h --- a/xen/include/public/physdev.h Wed Jun 07 14:24:14 2006 +0100 +++ b/xen/include/public/physdev.h Wed Jun 07 15:51:19 2006 +0100 @@ -17,6 +17,8 @@ typedef struct physdevop_irq_status_quer /* OUT */ /* Need to call PHYSDEVOP_IRQ_UNMASK_NOTIFY when the IRQ has been serviced? */ #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY (1<<0) +/* IRQ shared by multiple guests? */ +#define PHYSDEVOP_IRQ_SHARED (1<<1) uint32_t flags; } physdevop_irq_status_query_t; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |