[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [Bug?]When close VM the hugepage not freed
From: |
Linhaifeng |
Subject: |
[Qemu-devel] [Bug?]When close VM the hugepage not freed |
Date: |
Tue, 14 Oct 2014 20:02:38 +0800 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; rv:31.0) Gecko/20100101 Thunderbird/31.1.0 |
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();
}
- [Qemu-devel] [Bug?]When close VM the hugepage not freed,
Linhaifeng <=