Stefano Stabellini
2012-Jul-04 11:14 UTC
[PATCH WIP 0/5] xen/arm: grant_table, blkfront and blkback
Hi all, this patch series initializes the grant_table and xenbus on ARM. It also get blkfront and blkback to compile and run properly. With this patch series and the corresponding xen patch series applied, I am able to boot a Linux domU with a root filesystem on a xen PV disk. Stefano Stabellini (5): xen/arm: initialize grant_table on ARM xen/arm: set xen_platform_pci_unplug to XEN_UNPLUG_ALL xen/arm: implement alloc/free_xenballooned_pages with alloc_pages/kfree xen: allow privcmd for hvm guests xen/arm: compile blkfront and blkback arch/arm/include/asm/hypervisor.h | 6 +++++ arch/arm/xen/enlighten.c | 39 +++++++++++++++++++++++++++++++++- drivers/block/xen-blkback/blkback.c | 1 + drivers/block/xen-blkfront.c | 1 + drivers/xen/grant-table.c | 2 +- drivers/xen/xenfs/privcmd.c | 7 ------ include/xen/interface/hvm/params.h | 4 ++- include/xen/interface/io/protocols.h | 3 ++ 8 files changed, 53 insertions(+), 10 deletions(-) git://xenbits.xen.org/people/sstabellini/linux-pvhvm.git xenarmv7-3 Cheers, Stefano
Stefano Stabellini
2012-Jul-04 11:15 UTC
[PATCH WIP 1/5] xen/arm: initialize grant_table on ARM
Initialize the grant table mapping it at HVM_PARAM_GRANT_START_PFN. After the grant table is initialized, call xenbus_probe (if not dom0). Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 18 ++++++++++++++++++ drivers/xen/grant-table.c | 2 +- include/xen/interface/hvm/params.h | 4 +++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index ddacecf..6901e37 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -1,9 +1,13 @@ #include <xen/xen.h> #include <xen/interface/xen.h> #include <xen/interface/memory.h> +#include <xen/interface/hvm/params.h> #include <asm/xen/hypervisor.h> #include <asm/xen/hypercall.h> #include <xen/features.h> +#include <xen/grant_table.h> +#include <xen/hvm.h> +#include <xen/xenbus.h> #include <linux/module.h> @@ -133,6 +137,7 @@ static void __init xen_hvm_init_shared_info(void) int cpu; struct xen_add_to_physmap xatp; static struct shared_info *shared_info_page = 0; + uint64_t val; xen_setup_features(); if (xen_feature(XENFEAT_dom0)) @@ -171,6 +176,19 @@ static void __init xen_hvm_init_shared_info(void) for_each_online_cpu(cpu) { per_cpu(xen_vcpu, cpu) = &HYPERVISOR_shared_info->vcpu_info[cpu]; } + + if (!xen_hvm_resume_frames) { + if (hvm_get_parameter(HVM_PARAM_GRANT_START_PFN, &val) >= 0) + xen_hvm_resume_frames = val << PAGE_SHIFT; + else { + printk(KERN_ERR "error getting " + "HVM_PARAM_GRANT_START_PFN"); + return; + } + } + gnttab_init(); + if (!xen_initial_domain()) + xenbus_probe(NULL); } core_initcall(xen_hvm_init_shared_info); diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index db3964b..766fc35 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -58,7 +58,7 @@ static grant_ref_t **gnttab_list; static unsigned int nr_grant_frames; -static unsigned int boot_max_nr_grant_frames; +static unsigned int boot_max_nr_grant_frames = 1; static int gnttab_free_count; static grant_ref_t gnttab_free_head; static DEFINE_SPINLOCK(gnttab_list_lock); diff --git a/include/xen/interface/hvm/params.h b/include/xen/interface/hvm/params.h index 1b4f923..e51269b 100644 --- a/include/xen/interface/hvm/params.h +++ b/include/xen/interface/hvm/params.h @@ -94,6 +94,8 @@ #define HVM_PARAM_CONSOLE_PFN 17 #define HVM_PARAM_CONSOLE_EVTCHN 18 -#define HVM_NR_PARAMS 19 +#define HVM_PARAM_GRANT_START_PFN 30 + +#define HVM_NR_PARAMS 31 #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */ -- 1.7.2.5
Stefano Stabellini
2012-Jul-04 11:15 UTC
[PATCH WIP 2/5] xen/arm: set xen_platform_pci_unplug to XEN_UNPLUG_ALL
Set xen_platform_pci_unplug to XEN_UNPLUG_ALL by default to make blkfront happy. The parameter doesn''t make sense on ARM and should be removed. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index 6901e37..a6dc9eb 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -8,6 +8,7 @@ #include <xen/grant_table.h> #include <xen/hvm.h> #include <xen/xenbus.h> +#include <xen/platform_pci.h> #include <linux/module.h> @@ -33,7 +34,7 @@ __read_mostly int xen_have_vector_callback; EXPORT_SYMBOL_GPL(xen_have_vector_callback); /* XXX: to be removed */ -int xen_platform_pci_unplug; +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); #define FOREIGN_MAP_BUFFER 0x90000000UL -- 1.7.2.5
Stefano Stabellini
2012-Jul-04 11:15 UTC
[PATCH WIP 3/5] xen/arm: implement alloc/free_xenballooned_pages with alloc_pages/kfree
Only until we get the balloon driver to work. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/xen/enlighten.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index a6dc9eb..924c9aa 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c @@ -199,3 +199,21 @@ int __init xen_guest_init(void) return 0; } EXPORT_SYMBOL(xen_guest_init); + +/* XXX: only until balloon is properly working */ +int alloc_xenballooned_pages(int nr_pages, struct page **pages, bool highmem) +{ + *pages = alloc_pages(highmem ? GFP_HIGHUSER : GFP_KERNEL, + get_order(nr_pages)); + if (*pages == NULL) + return -ENOMEM; + return 0; +} +EXPORT_SYMBOL(alloc_xenballooned_pages); + +void free_xenballooned_pages(int nr_pages, struct page **pages) +{ + kfree(*pages); + *pages = NULL; +} +EXPORT_SYMBOL(free_xenballooned_pages); -- 1.7.2.5
Stefano Stabellini
2012-Jul-04 11:15 UTC
[PATCH WIP 4/5] xen: allow privcmd for hvm guests
Ian''s initial XENMAPSPACE_gmfn_foreign implementation is enough to get privcmd mmap to work for XENFEAT_auto_translated_physmap guests. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- drivers/xen/xenfs/privcmd.c | 7 ------- 1 files changed, 0 insertions(+), 7 deletions(-) diff --git a/drivers/xen/xenfs/privcmd.c b/drivers/xen/xenfs/privcmd.c index c200b49..5c2b9e9 100644 --- a/drivers/xen/xenfs/privcmd.c +++ b/drivers/xen/xenfs/privcmd.c @@ -387,13 +387,6 @@ static int privcmd_mmap(struct file *file, struct vm_area_struct *vma) { //printk(KERN_CRIT "privcmd_mmap\n"); - /* Unsupported for auto-translate guests. */ - if (xen_feature(XENFEAT_auto_translated_physmap)) - { - printk(KERN_CRIT "privcmd_mmap -- no auto translated..\n"); - return -ENOSYS; - } - /* DONTCOPY is essential for Xen because copy_page_range doesn''t know * how to recreate these mappings */ vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY | VM_PFNMAP; -- 1.7.2.5
Stefano Stabellini
2012-Jul-04 11:15 UTC
[PATCH WIP 5/5] xen/arm: compile blkfront and blkback
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> --- arch/arm/include/asm/hypervisor.h | 6 ++++++ drivers/block/xen-blkback/blkback.c | 1 + drivers/block/xen-blkfront.c | 1 + include/xen/interface/io/protocols.h | 3 +++ 4 files changed, 11 insertions(+), 0 deletions(-) create mode 100644 arch/arm/include/asm/hypervisor.h diff --git a/arch/arm/include/asm/hypervisor.h b/arch/arm/include/asm/hypervisor.h new file mode 100644 index 0000000..b90d9e5 --- /dev/null +++ b/arch/arm/include/asm/hypervisor.h @@ -0,0 +1,6 @@ +#ifndef _ASM_ARM_HYPERVISOR_H +#define _ASM_ARM_HYPERVISOR_H + +#include <asm/xen/hypervisor.h> + +#endif diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index fbffdf0..78ce4c0 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -45,6 +45,7 @@ #include <xen/events.h> #include <xen/page.h> +#include <xen/xen.h> #include <asm/xen/hypervisor.h> #include <asm/xen/hypercall.h> #include "common.h" diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 9fd3ee2..dd1589e 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -56,6 +56,7 @@ #include <xen/interface/io/protocols.h> #include <asm/xen/hypervisor.h> +#include <asm/xen/mmu.h> enum blkif_state { BLKIF_STATE_DISCONNECTED, diff --git a/include/xen/interface/io/protocols.h b/include/xen/interface/io/protocols.h index 01fc8ae..e85cc64 100644 --- a/include/xen/interface/io/protocols.h +++ b/include/xen/interface/io/protocols.h @@ -5,6 +5,7 @@ #define XEN_IO_PROTO_ABI_X86_64 "x86_64-abi" #define XEN_IO_PROTO_ABI_IA64 "ia64-abi" #define XEN_IO_PROTO_ABI_POWERPC64 "powerpc64-abi" +#define XEN_IO_PROTO_ABI_ARM "arm-abi" #if defined(__i386__) # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_X86_32 @@ -14,6 +15,8 @@ # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_IA64 #elif defined(__powerpc64__) # define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_POWERPC64 +#elif defined(__arm__) +# define XEN_IO_PROTO_ABI_NATIVE XEN_IO_PROTO_ABI_ARM #else # error arch fixup needed here #endif -- 1.7.2.5
David Vrabel
2012-Jul-04 11:25 UTC
Re: [PATCH WIP 2/5] xen/arm: set xen_platform_pci_unplug to XEN_UNPLUG_ALL
On 04/07/12 12:15, Stefano Stabellini wrote:> Set xen_platform_pci_unplug to XEN_UNPLUG_ALL by default to make > blkfront happy. The parameter doesn''t make sense on ARM and should be > removed.Why is this parameter nonsensical on ARM? ARM systems can have PCI devices. David> Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> > --- > arch/arm/xen/enlighten.c | 3 ++- > 1 files changed, 2 insertions(+), 1 deletions(-) > > diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c > index 6901e37..a6dc9eb 100644 > --- a/arch/arm/xen/enlighten.c > +++ b/arch/arm/xen/enlighten.c > @@ -8,6 +8,7 @@ > #include <xen/grant_table.h> > #include <xen/hvm.h> > #include <xen/xenbus.h> > +#include <xen/platform_pci.h> > > #include <linux/module.h> > > @@ -33,7 +34,7 @@ __read_mostly int xen_have_vector_callback; > EXPORT_SYMBOL_GPL(xen_have_vector_callback); > > /* XXX: to be removed */ > -int xen_platform_pci_unplug; > +int xen_platform_pci_unplug = XEN_UNPLUG_ALL; > EXPORT_SYMBOL_GPL(xen_platform_pci_unplug); > > #define FOREIGN_MAP_BUFFER 0x90000000UL
Stefano Stabellini
2012-Jul-04 11:27 UTC
Re: [PATCH WIP 2/5] xen/arm: set xen_platform_pci_unplug to XEN_UNPLUG_ALL
On Wed, 4 Jul 2012, David Vrabel wrote:> On 04/07/12 12:15, Stefano Stabellini wrote: > > Set xen_platform_pci_unplug to XEN_UNPLUG_ALL by default to make > > blkfront happy. The parameter doesn''t make sense on ARM and should be > > removed. > > Why is this parameter nonsensical on ARM? ARM systems can have PCI devices.Because we shouldn''t assume the presence of a PCI bus on ARM. Moreover it would be nice to avoid the ugly unplug protocol entirely if we can.
Ian Campbell
2012-Jul-04 11:49 UTC
Re: [PATCH WIP 2/5] xen/arm: set xen_platform_pci_unplug to XEN_UNPLUG_ALL
On Wed, 2012-07-04 at 12:27 +0100, Stefano Stabellini wrote:> On Wed, 4 Jul 2012, David Vrabel wrote: > > On 04/07/12 12:15, Stefano Stabellini wrote: > > > Set xen_platform_pci_unplug to XEN_UNPLUG_ALL by default to make > > > blkfront happy. The parameter doesn''t make sense on ARM and should be > > > removed. > > > > Why is this parameter nonsensical on ARM? ARM systems can have PCI devices. > > Because we shouldn''t assume the presence of a PCI bus on ARM. Moreover > it would be nice to avoid the ugly unplug protocol entirely if we can.Also "pci" here refers to the "platform_pci" device not to PCI devices in general. SO I think this option is indeed nonsensical at least until such a time as we have HVM like ARM guests (i.e. ones with a DM emulating specific platforms) which require a PCI device which serves as the "you are running under Xen" hook intp to the non-PV aware OSes driver subsystem. And it''s not clear that when we have such guests that a platform pci device will be the correct solution on ARM anyway. Ian.