qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [Bug?]When close VM the hugepage not freed


From: Linhaifeng
Subject: Re: [Qemu-devel] [Bug?]When close VM the hugepage not freed
Date: Wed, 15 Oct 2014 15:39:42 +0800
User-agent: Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Thunderbird/31.1.0


On 2014/10/14 20:02, Linhaifeng wrote:
> Hi,all
> 
> I was trying to use hugepage with VM and found that the hugepage not freed 
> when close VM.
> 
> 
> 1.Before start VM the /proc/meminfo is:
> AnonHugePages:    124928 kB
> HugePages_Total:    4096
> HugePages_Free:     3072
> HugePages_Rsvd:        0
> HugePages_Surp:        0
> Hugepagesize:       2048 kB
> 
> 2.Start VM the /proc/meminfo is:
> AnonHugePages:    139264 kB
> HugePages_Total:    4096
> HugePages_Free:     2048
> HugePages_Rsvd:        0
> HugePages_Surp:        0
> Hugepagesize:       2048 kB
> 
> 3.Close VM the /proc/meminfo is:
> AnonHugePages:    124928 kB
> HugePages_Total:    4096
> HugePages_Free:     2048
> HugePages_Rsvd:        0
> HugePages_Surp:        0
> Hugepagesize:       2048 kB
> 
> We can see there are 1024 hugepage leak!
> 
> I try to found which function used to free hugepage but i'm not sure where 
> the qemu_ram_free is the function to free hugepage.
> I found that the qemu_ram_free function not call unlink and we know unlink is 
> used to free hugepage(see example of hugepage-mmap.c in kernel source).
> 
> void qemu_ram_free(ram_addr_t addr)
> {
>     RAMBlock *block;
> 
>     /* This assumes the iothread lock is taken here too.  */
>     qemu_mutex_lock_ramlist();
>     QTAILQ_FOREACH(block, &ram_list.blocks, next) {
>         if (addr == block->offset) {
>             QTAILQ_REMOVE(&ram_list.blocks, block, next);
>             ram_list.mru_block = NULL;
>             ram_list.version++;
>             if (block->flags & RAM_PREALLOC) {
>                 ;
>             } else if (xen_enabled()) {
>                 xen_invalidate_map_cache_entry(block->host);
> #ifndef _WIN32
>             } else if (block->fd >= 0) {
>                 munmap(block->host, block->length);
>                 close(block->fd);
>               // should we add unlink here to free hugepage?
> #endif
>             } else {
>                 qemu_anon_ram_free(block->host, block->length);
>             }
>             g_free(block);
>             break;
>         }
>     }
>     qemu_mutex_unlock_ramlist();
> 
> }
> 
> 
> 
> 

When i run the QEMU with tap backend the hugepage will be freed but not the 
vhost-user backend.
Maybe the vhost-user process should close the hugefile.

-- 
Regards,
Haifeng




reply via email to

[Prev in Thread] Current Thread [Next in Thread]