|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] Vmap allocator fails to allocate beyond 128MB
On Fri, Sep 26, 2014 at 9:21 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>> On 26.09.14 at 17:23, <vijay.kilari@xxxxxxxxx> wrote:
>> Hi Jan,
>>
>> On Fri, Sep 26, 2014 at 6:16 PM, Jan Beulich <JBeulich@xxxxxxxx> wrote:
>>>>>> On 26.09.14 at 14:17, <vijay.kilari@xxxxxxxxx> wrote:
>>>> When devices like SMMU request large ioremap space and if the total
>>>> allocation
>>>> of vmap space is beyond 128MB the allocation fails for next requests
>>>> and following warning is seen
>>>>
>>>> create_xen_entries: trying to replace an existing mapping
>>>> addr=40001000 mfn=fffd6
>>>>
>>>> I found that vm_top is allocated with only 1 page which can hold
>>>> bitmap for only 128MB
>>>> space though 1GB of vmap space is assigned.
>>>>
>>>> With 1GB vmap space following are the calculations
>>>>
>>>> vm_base = 0x4000000
>>>> vm_end = 0x3ffff
>>>> vm_low = 0x8
>>>> nr = 1
>>>> vm_top = 0x8000
>>>>
>>>> With the below patch, I could get allocations beyond 128MB.
>>>>
>>>> where nr = 8 for 1GB vmap space
>>>>
>>>> diff --git a/xen/common/vmap.c b/xen/common/vmap.c
>>>> index 783cea3..369212d 100644
>>>> --- a/xen/common/vmap.c
>>>> +++ b/xen/common/vmap.c
>>>> @@ -27,7 +27,7 @@ void __init vm_init(void)
>>>> vm_base = (void *)VMAP_VIRT_START;
>>>> vm_end = PFN_DOWN(arch_vmap_virt_end() - vm_base);
>>>> vm_low = PFN_UP((vm_end + 7) / 8);
>>>> - nr = PFN_UP((vm_low + 7) / 8);
>>>> + nr = PFN_UP((vm_end + 7) / 8);
>>>> vm_top = nr * PAGE_SIZE * 8;
>>>>
>>>> for ( i = 0, va = (unsigned long)vm_bitmap; i < nr; ++i, va +=
>>>> PAGE_SIZE
>> )
>>>
>>> Maybe there's a bug somewhere, but what you suggest as a change
>>> above doesn't look correct: You make nr == vm_low, and hence the
>>> map_pages_to_xen() after the loop do nothing. That can't be right.
>>> Is it perhaps that this second map_pages_to_xen() doesn't have the
>>> intended effect on ARM?
>>
>> Note: I am testing on arm64 platform.
>>
>> In the call map_pages_to_xen() after for loop is performing the mapping
>> for next vm_bitmap pages. In case of arm this call will set valid bit
>> is set to 1 in pte
>> entry for this mapping.
>
> So _that_ is the bug then, because ...
>
>> void __init vm_init(void)
>> {
>> ....
>> for ( i = 0, va = (unsigned long)vm_bitmap; i < nr; ++i, va +=
>> PAGE_SIZE )
>> {
>> struct page_info *pg = alloc_domheap_page(NULL, 0);
>>
>> map_pages_to_xen(va, page_to_mfn(pg), 1, PAGE_HYPERVISOR);
>> clear_page((void *)va);
>> }
>> 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);
>
> ... here we don't request any valid leaf entries to be created. All we
> want are the non-leaf page table structures.
Do we need to reserve this non-leaf page table structures?
If vm_low is reserving the virtual address, vm_alloc will not allocate
vm_bitmap reserved pages.
>
>> Queries: 1) How is x86 is updating tables even if present/valid bit is set?
>
> When not asked to set the present bit, it also doesn't set it, and
> hence also doesn't find any collisions later.
>
>> 2) Can we allocate all the pages required for vm_bitmap
>> in vm_init()?. we may be wasting few pages but
>> this makes work for both x86&arm.
>
> No - we shouldn't be wasting memory here.
>
>> 3) Can we split vm_init() into generic and arch specific?
>
> That would be kind of a last resort.
>
> Jan
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |