|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] preparing for 4.5.1
On Tue, Apr 14, 2015 at 6:42 PM, Ian Campbell <ian.campbell@xxxxxxxxxx> wrote:
> On Mon, 2015-04-13 at 09:35 +0100, Jan Beulich wrote:
>> >>> On 02.04.15 at 12:01, <ian.campbell@xxxxxxxxxx> wrote:
>> > On Thu, 2015-03-26 at 17:07 +0000, Jan Beulich wrote:
>> >> having been released mid January, it is time to get ready for 4.5.1-rc1.
>> >> Please reply with backport requests which you consider necessary but
>> >> still missing. Please also be patient with them being pulled in - I'll be
>> >> gone the coming two weeks, and I'd hope to get an RC1 put together
>> >> soon thereafter.
>> >
>> > On my list for ARM I have this patch, which also touches x86. What do
>> > you think?
>>
>> If it fixes a real problem in 4.5 (rather than just a theoretical one,
>> exposed only in 4.6), then I'm fine with this (and assume since it's
>> mostly for ARM you'll take care of doing and applying the backport).
>
> The original impetus was a bit lost in the various iterations. I think
> it was something which was exposed by Vijay's new ITS code, which did a
> larger vmalloc than any existing code and exposed the issue. Vijay, is
> that correct?
Yes, correct.
Any allocation beyond 128MB will fail.
>
> I think it is unlikely that there is anything in 4.5 which would do a
> similarly large vmalloc, or at least I don't recall any reports of such.
>
> So I think the conclusion is not to backport the patch, unless someone
> knows of a practical issue on 4.5.
>
> For those new to the CC line the commit is below.
>
> Thanks,
> Ian.
>
> commit c2453291b177cc2e89dc104bd4233c3d8bb73922
> Author: Vijaya Kumar K <Vijaya.Kumar@xxxxxxxxxxxxxxxxxx>
> Date: Tue Mar 24 17:14:47 2015 +0530
>
> xen: Add populate_pt_range interface to reserve non-leaf level table
> entries
>
> On x86, for the pages mapped with PAGE_HYPERVISOR attribute
> non-leaf page tables are allocated with valid pte entries.
> and with MAP_SMALL_PAGES attribute only non-leaf page tables are
> allocated with invalid (valid bit set to 0) pte entries.
> However on arm this is not the case. On arm for the pages
> mapped with PAGE_HYPERVISOR and MAP_SMALL_PAGES both
> non-leaf and leaf level page table are allocated with valid bit
> in pte entries.
>
> This behaviour in arm makes common vmap code fail to
> allocate memory beyond 128MB as described below.
>
> In vm_init, map_pages_to_xen() is called for mapping
> vm_bitmap. Initially one page of vm_bitmap is allocated
> and mapped using PAGE_HYPERVISOR attribute.
> For the rest of vm_bitmap pages, MAP_SMALL_PAGES attribute
> is used to map.
>
> In ARM for both PAGE_HYPERVISOR and MAP_SMALL_PAGES, valid bit
> is set to 1 in pte entry for these mapping.
>
> In vm_alloc(), map_pages_to_xen() is failing for >128MB because
> for this next vm_bitmap page the mapping is already set in vm_init()
> with valid bit set in pte entry. So map_pages_to_xen() in
> ARM returns error.
>
> With this patch, MAP_SMALL_PAGES is dropped and arch specific
> populate_pt_range() api is introduced to populate non-leaf
> page table entries for the requested pages. Added RESERVE option
> to map non-leaf page table entries.
>
> Signed-off-by: Vijaya Kumar K<Vijaya.Kumar@xxxxxxxxxxxxxxxxxx>
> Acked-by: Jan Beulich <jbeulich@xxxxxxxx>
> Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> [ ijc -- rewrote subject line ]
>
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 7d4ba0c..d103f8f 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -827,7 +827,8 @@ static int create_xen_table(lpae_t *entry)
>
> enum xenmap_operation {
> INSERT,
> - REMOVE
> + REMOVE,
> + RESERVE
> };
>
> static int create_xen_entries(enum xenmap_operation op,
> @@ -859,12 +860,15 @@ static int create_xen_entries(enum xenmap_operation op,
>
> switch ( op ) {
> case INSERT:
> + case RESERVE:
> if ( third[third_table_offset(addr)].pt.valid )
> {
> printk("create_xen_entries: trying to replace an
> existing mapping addr=%lx mfn=%lx\n",
> addr, mfn);
> return -EINVAL;
> }
> + if ( op == RESERVE )
> + break;
> pte = mfn_to_xen_entry(mfn, ai);
> pte.pt.table = 1;
> write_pte(&third[third_table_offset(addr)], pte);
> @@ -898,6 +902,13 @@ int map_pages_to_xen(unsigned long virt,
> {
> return create_xen_entries(INSERT, virt, mfn, nr_mfns, flags);
> }
> +
> +int populate_pt_range(unsigned long virt, unsigned long mfn,
> + unsigned long nr_mfns)
> +{
> + return create_xen_entries(RESERVE, virt, mfn, nr_mfns, 0);
> +}
> +
> void destroy_xen_mappings(unsigned long v, unsigned long e)
> {
> create_xen_entries(REMOVE, v, 0, (e - v) >> PAGE_SHIFT, 0);
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index 8e29675..786ed47 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -5725,6 +5725,12 @@ int map_pages_to_xen(
> return 0;
> }
>
> +int populate_pt_range(unsigned long virt, unsigned long mfn,
> + unsigned long nr_mfns)
> +{
> + return map_pages_to_xen(virt, mfn, nr_mfns, MAP_SMALL_PAGES);
> +}
> +
> void destroy_xen_mappings(unsigned long s, unsigned long e)
> {
> bool_t locking = system_state > SYS_STATE_boot;
> diff --git a/xen/common/vmap.c b/xen/common/vmap.c
> index 783cea3..739d468 100644
> --- a/xen/common/vmap.c
> +++ b/xen/common/vmap.c
> @@ -40,7 +40,7 @@ void __init vm_init(void)
> bitmap_fill(vm_bitmap, vm_low);
>
> /* Populate page tables for the bitmap if necessary. */
> - map_pages_to_xen(va, 0, vm_low - nr, MAP_SMALL_PAGES);
> + populate_pt_range(va, 0, vm_low - nr);
> }
>
> void *vm_alloc(unsigned int nr, unsigned int align)
> diff --git a/xen/include/asm-arm/page.h b/xen/include/asm-arm/page.h
> index 3e7b0ae..8de5e26 100644
> --- a/xen/include/asm-arm/page.h
> +++ b/xen/include/asm-arm/page.h
> @@ -64,7 +64,6 @@
> #define PAGE_HYPERVISOR (WRITEALLOC)
> #define PAGE_HYPERVISOR_NOCACHE (DEV_SHARED)
> #define PAGE_HYPERVISOR_WC (DEV_WC)
> -#define MAP_SMALL_PAGES PAGE_HYPERVISOR
>
> /*
> * Stage 2 Memory Type.
> diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
> index a769084..a066363 100644
> --- a/xen/include/xen/mm.h
> +++ b/xen/include/xen/mm.h
> @@ -55,7 +55,12 @@ int map_pages_to_xen(
> unsigned long nr_mfns,
> unsigned int flags);
> void destroy_xen_mappings(unsigned long v, unsigned long e);
> -
> +/*
> + * Create only non-leaf page table entries for the
> + * page range in Xen virtual address space.
> + */
> +int populate_pt_range(unsigned long virt, unsigned long mfn,
> + unsigned long nr_mfns);
> /* Claim handling */
> unsigned long domain_adjust_tot_pages(struct domain *d, long pages);
> int domain_set_outstanding_pages(struct domain *d, unsigned long pages);
>
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |