[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] RE: [Question] Why code differs in construct_dom0?



So you mean in the release build we make the mapping discontiguous to detect 
possible bugs, while in debug build it is not discontiguous?

And another question from problems we encountered recently, system with more 
than 4G memory installed will crash when X server shutdown. The reason is:
1> dom0 allocates memory for agp by calling agp_allocate_memory with GFP_DMA32 
set. This implies the pfn comes from memory lower than 4G, while mfn are likely 
to be from memory above 4G.
2> dom0 then call map_pages_to_apg, since the kernel of handles 32bit gart 
table, dom0 uses hypercall to change its memory mappings 
(xen_create_contiguous_region). Xen will pick proper memory below 4G and free 
those from the guest (likely to be from memory above 4G).
3> As the process goes on. More and more memory below 4G is return to dom0 
while leaving memory above 4G in xen. Finally, xen's reservation of memory 
below 4G for DMA are exhausted. This creates severe problems for us.

What is your comments on this? Both increase the reservation in Xen and using 
contiguous mappings are helpful in this cases. Which one do you prefer? 

Best Regards
Haitao Shan

Keir Fraser wrote:
> By deliberately making dom0's p2m mapping discontiguous we can detect
> bugs where dom0 is incorrectly assuming pseudophys contiguous memory
> is machine contiguous. We had nasty bugs of this sort in dom0's block
> layer many years ago.
> 
>  -- Keir
> 
> On 20/11/08 09:07, "Shan, Haitao" <haitao.shan@xxxxxxxxx> wrote:
> 
>> Hi, Keir,
>> 
>> Please see the code shown below. I don't understand why pfn's
>> definitions are different depending on whether NDEBUG is defined or
>> not. Can you tell me why? 
>> 
>>     while ( pfn < nr_pages )
>>     {
>>         if ( (page = alloc_chunk(d, nr_pages - d->tot_pages)) ==
>>             NULL ) panic("Not enough RAM for DOM0 reservation.\n");
>>         while ( pfn < d->tot_pages )
>>         {
>>             mfn = page_to_mfn(page);
>> #ifndef NDEBUG
>> #define pfn (nr_pages - 1 - (pfn - (alloc_epfn - alloc_spfn))) #endif
>>             if ( !is_pv_32on64_domain(d) )
>>                 ((unsigned long *)vphysmap_start)[pfn] = mfn;       
>>                 else ((unsigned int *)vphysmap_start)[pfn] = mfn;
>>             set_gpfn_from_mfn(mfn, pfn);
>> #undef pfn
>>             page++; pfn++;
>>         }
>>     }
>> 
>> Best Regards
>> Haitao Shan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.