From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48510) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xe0ox-0000oc-GI for qemu-devel@nongnu.org; Tue, 14 Oct 2014 08:03:25 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xe0or-0005Zq-CS for qemu-devel@nongnu.org; Tue, 14 Oct 2014 08:03:19 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:4960) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xe0oq-0005UM-ML for qemu-devel@nongnu.org; Tue, 14 Oct 2014 08:03:13 -0400 Message-ID: <543D10DE.2080109@huawei.com> Date: Tue, 14 Oct 2014 20:02:38 +0800 From: Linhaifeng MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [Bug?]When close VM the hugepage not freed List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: lilijun , "Michael S. Tsirkin" 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(); }