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