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

Re: [Xen-devel] freeing unused memory



On Thu, Jun 30, 2011 at 04:20:13PM +0200, Igor Mammedov wrote:
> On 06/29/2011 11:53 AM, Igor Mammedov wrote:
> >Hi,
> >
> >I have a question about how upstream patches:
> >
> >093d7b4639951 xen: release unused free memory
> >f89e048e76da7 xen: make sure pages are really part of domain
> >before freeing
> >
> >are supposed to work. Was it intended for freeing unused memory if
> >we boot
> >kernel with mem=XX option and domU is configured with more memory
> >than XX?
> >
> >
> 
> In regard to RHBZ#523130, I made additional debugging after applying
> above mentioned patches. Result: unsed memory is not freed if we pass
> mex=XXXM option to pv guest kernel.
> 
> Here is call order:
> ============
> setup_arch ->
>  ->  setup_memory_map
>    ->  x86_init.resources.memory_setup == xen_memory_setup
>            before xen_return_unused_memory call we have e820 map like this
>            that contains all memory provide by xen:
>              BIOS-provided physical RAM map:
>                Xen: 0000000000000000 - 00000000000a0000 (usable)
>                Xen: 00000000000a0000 - 0000000000100000 (reserved)
>                Xen: 0000000000100000 - 0000000200000000 (usable
> *      ->  xen_return_unused_memory
> 
> ** ->  parse_early_param
> =============
> 
> *
> code fragment:
> @xen_return_unused_memory
>         for (i = 0; i<  e820->nr_map&&  last_end<  max_addr; i++) {
>                 phys_addr_t end = e820->map[i].addr;
>                 end = min(max_addr, end);
> 
>                 released += xen_release_chunk(last_end, end);
>                 last_end = e820->map[i].addr + e820->map[i].size;
>         }
> in best case is nop since xen_release_chunk will not do anything if end<=
> last_end and with our example map pairs (last_end, end) will look like:
>   last_end   end
>   0x0        0x0
>   0xa0000    0xa0000
>   0x100000   0x100000
> i.e. last_end == end =>  xen_release_chunk is nop
> in worst case xen_release_chunk may try to release not existed gap if e820 is
> sparse.

Those are OK for memory below that region. We actually don't want to free it
as the PV guest stops booting.
> 
> last fragment of xen_return_unused_memory
>         if (last_end<  max_addr)
>                 released += xen_release_chunk(last_end, max_addr);
> 
> has sense only if
>    last_end(e820 val)<  max_addr (max hv provided addr)
> and that could be only if "mem=" parameter was applied to e820 map.

Ah.
> However ** parse_early_param is called after x86_init.resources.memory_setup 
> in
> setup_memory_map. So patches:
> 093d7b4639951 xen: release unused free memory
> f89e048e76da7 xen: make sure pages are really part of domain before freeing
> are effectively nop code now.
> 
> Problem exist not only in rhel6 code but fc15 as well and I guess upstream
> is affected to.

well, they do _some_ freeing. I see 'released XX pages' quite often on my boxes.

But yes, this a problem - we allocate more memory than we need. Do you have any
patches in mind?

> 
> 
> -- 
> Thanks,
>  Igor
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel

_______________________________________________
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®.