|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] backport requests for 4.x-testing
On 29/03/2012 18:06, "Stefano Stabellini" <Stefano.Stabellini@xxxxxxxxxxxxx>
wrote:
> On Thu, 29 Mar 2012, Jan Beulich wrote:
>>>>> Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> 03/29/12 1:54 PM >>>
>>> What about:
>>>
>>> xen: introduce PHYSDEVOP_pirq_eoi_gmfn_v2
>>>
>>> backport appended.
>>>
>>> ---
>>>
>>> linux/xen: support pirq_eoi_map
>>
>> As the title says, this is a Linux patch that you provided, yet talk is about
>> Xen backports here.
>
> Oops, I have appended the wrong patch. Now I am appending the right one.
>
> Please note that the patch bumps __XEN_LATEST_INTERFACE_VERSION__ but it
> is not a requirement to get Linux kernels to work correctly with it.
> I would welcome opinions on whether we would need to backport that
> change too or not.
Let's not. Please re-spin the patch to unconditionally define
PHYSDEVOP_pirq_eoi_gmfn to PHYSDEVOP_pirq_eoi_gmfn_v1, and don't touch
__XEN_LATEST_INTERFACE_VERSION__.
Thanks,
Keir
>
> ---
>
> xen: introduce PHYSDEVOP_pirq_eoi_gmfn_v2
>
> PHYSDEVOP_pirq_eoi_gmfn changes the semantics of PHYSDEVOP_eoi.
> In order to improve the interface this patch:
>
> - renames PHYSDEVOP_pirq_eoi_gmfn to PHYSDEVOP_pirq_eoi_gmfn_v1;
>
> - introduces PHYSDEVOP_pirq_eoi_gmfn_v2, that is like
> PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't modify the behaviour of
> another hypercall;
>
> - bump __XEN_LATEST_INTERFACE_VERSION__;
>
> - #define PHYSDEVOP_pirq_eoi_gmfn to PHYSDEVOP_pirq_eoi_gmfn_v1 or
> PHYSDEVOP_pirq_eoi_gmfn_v2 depending on the __XEN_INTERFACE_VERSION.
>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> ---
> xen/arch/ia64/xen/domain.c | 1 +
> xen/arch/ia64/xen/hypercall.c | 7 +++++--
> xen/arch/x86/domain.c | 1 +
> xen/arch/x86/physdev.c | 7 +++++--
> xen/include/asm-ia64/domain.h | 3 +++
> xen/include/asm-x86/domain.h | 3 +++
> xen/include/public/physdev.h | 16 +++++++++++++++-
> xen/include/public/xen-compat.h | 2 +-
> 8 files changed, 34 insertions(+), 6 deletions(-)
>
> diff --git a/xen/arch/ia64/xen/domain.c b/xen/arch/ia64/xen/domain.c
> index 271a744..7dd96bf 100644
> --- a/xen/arch/ia64/xen/domain.c
> +++ b/xen/arch/ia64/xen/domain.c
> @@ -1729,6 +1729,7 @@ int domain_relinquish_resources(struct domain *d)
> if (d->arch.pirq_eoi_map != NULL) {
> put_page(virt_to_page(d->arch.pirq_eoi_map));
> d->arch.pirq_eoi_map = NULL;
> + d->arch.auto_unmask = 0;
> }
>
> /* Tear down shadow mode stuff. */
> diff --git a/xen/arch/ia64/xen/hypercall.c b/xen/arch/ia64/xen/hypercall.c
> index 6ea15c2..22b06ec 100644
> --- a/xen/arch/ia64/xen/hypercall.c
> +++ b/xen/arch/ia64/xen/hypercall.c
> @@ -65,7 +65,7 @@ static long __do_pirq_guest_eoi(struct domain *d, int pirq)
> {
> if ( pirq < 0 || pirq >= NR_IRQS )
> return -EINVAL;
> - if ( d->arch.pirq_eoi_map )
> + if ( d->arch.auto_unmask ) {
> evtchn_unmask(d->pirq_to_evtchn[pirq]);
> return pirq_guest_eoi(d, pirq);
> }
> @@ -504,7 +504,8 @@ long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> break;
> }
>
> - case PHYSDEVOP_pirq_eoi_gmfn: {
> + case PHYSDEVOP_pirq_eoi_gmfn_v1:
> + case PHYSDEVOP_pirq_eoi_gmfn_v2: {
> struct physdev_pirq_eoi_gmfn info;
> unsigned long mfn;
>
> @@ -527,6 +528,8 @@ long do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> }
>
> current->domain->arch.pirq_eoi_map = mfn_to_virt(mfn);
> + if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 )
> + current->domain->arch.auto_unmask = 1;
> ret = 0;
> break;
> }
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index d432eb8..8472e30 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -1935,6 +1935,7 @@ int domain_relinquish_resources(struct domain *d)
> unmap_domain_page_global(d->arch.pirq_eoi_map);
> put_page_and_type(mfn_to_page(d->arch.pirq_eoi_map_mfn));
> d->arch.pirq_eoi_map = NULL;
> + d->arch.auto_unmask = 0;
> }
>
> d->arch.relmem = RELMEM_xen;
> diff --git a/xen/arch/x86/physdev.c b/xen/arch/x86/physdev.c
> index 3454c03..53c2461 100644
> --- a/xen/arch/x86/physdev.c
> +++ b/xen/arch/x86/physdev.c
> @@ -264,7 +264,7 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> ret = -EINVAL;
> if ( eoi.irq >= v->domain->nr_pirqs )
> break;
> - if ( v->domain->arch.pirq_eoi_map )
> + if ( v->domain->arch.auto_unmask )
> evtchn_unmask(v->domain->pirq_to_evtchn[eoi.irq]);
> if ( !is_hvm_domain(v->domain) ||
> domain_pirq_to_emuirq(v->domain, eoi.irq) == IRQ_PT )
> @@ -274,7 +274,8 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> break;
> }
>
> - case PHYSDEVOP_pirq_eoi_gmfn: {
> + case PHYSDEVOP_pirq_eoi_gmfn_v2:
> + case PHYSDEVOP_pirq_eoi_gmfn_v1: {
> struct physdev_pirq_eoi_gmfn info;
> unsigned long mfn;
>
> @@ -304,6 +305,8 @@ ret_t do_physdev_op(int cmd, XEN_GUEST_HANDLE(void) arg)
> ret = -ENOSPC;
> break;
> }
> + if ( cmd == PHYSDEVOP_pirq_eoi_gmfn_v1 )
> + v->domain->arch.auto_unmask = 1;
>
> ret = 0;
> break;
> diff --git a/xen/include/asm-ia64/domain.h b/xen/include/asm-ia64/domain.h
> index 14064ce..fc7b34f 100644
> --- a/xen/include/asm-ia64/domain.h
> +++ b/xen/include/asm-ia64/domain.h
> @@ -182,6 +182,9 @@ struct arch_domain {
> /* Shared page for notifying that explicit PIRQ EOI is required. */
> unsigned long *pirq_eoi_map;
> unsigned long pirq_eoi_map_mfn;
> + /* set auto_unmask to 1 if you want PHYSDEVOP_eoi to automatically
> + * unmask the event channel */
> + bool_t auto_unmask;
>
> /* Address of efi_runtime_services_t (placed in domain memory) */
> void *efi_runtime;
> diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h
> index 8056559..75f2540 100644
> --- a/xen/include/asm-x86/domain.h
> +++ b/xen/include/asm-x86/domain.h
> @@ -268,6 +268,9 @@ struct arch_domain
> /* Shared page for notifying that explicit PIRQ EOI is required. */
> unsigned long *pirq_eoi_map;
> unsigned long pirq_eoi_map_mfn;
> + /* set auto_unmask to 1 if you want PHYSDEVOP_eoi to automatically
> + * unmask the event channel */
> + bool_t auto_unmask;
>
> /* Pseudophysical e820 map (XENMEM_memory_map). */
> struct e820entry e820[3];
> diff --git a/xen/include/public/physdev.h b/xen/include/public/physdev.h
> index 82602ca..2e0ee53 100644
> --- a/xen/include/public/physdev.h
> +++ b/xen/include/public/physdev.h
> @@ -49,7 +49,15 @@ DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t);
> * will automatically get unmasked. The page registered is used as a bit
> * array indexed by Xen's PIRQ value.
> */
> -#define PHYSDEVOP_pirq_eoi_gmfn 17
> +#define PHYSDEVOP_pirq_eoi_gmfn_v1 17
> +/*
> + * Register a shared page for the hypervisor to indicate whether the
> + * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to
> + * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of
> + * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by
> + * Xen's PIRQ value.
> + */
> +#define PHYSDEVOP_pirq_eoi_gmfn_v2 28
> struct physdev_pirq_eoi_gmfn {
> /* IN */
> xen_pfn_t gmfn;
> @@ -276,6 +284,12 @@ DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t);
> #define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
> #define PHYSDEVOP_IRQ_SHARED XENIRQSTAT_shared
>
> +#if __XEN_INTERFACE_VERSION < 0x00040200
> +#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1
> +#else
> +#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2
> +#endif
> +
> #endif /* __XEN_PUBLIC_PHYSDEV_H__ */
>
> /*
> diff --git a/xen/include/public/xen-compat.h b/xen/include/public/xen-compat.h
> index 2e38003..d8c55bf 100644
> --- a/xen/include/public/xen-compat.h
> +++ b/xen/include/public/xen-compat.h
> @@ -27,7 +27,7 @@
> #ifndef __XEN_PUBLIC_XEN_COMPAT_H__
> #define __XEN_PUBLIC_XEN_COMPAT_H__
>
> -#define __XEN_LATEST_INTERFACE_VERSION__ 0x0003020a
> +#define __XEN_LATEST_INTERFACE_VERSION__ 0x00040200
>
> #if defined(__XEN__) || defined(__XEN_TOOLS__)
> /* Xen is built with matching headers and implements the latest interface. */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |