On 2014/10/17 16:27, haifeng....@huawei.com wrote:
From: linhaifeng <haifeng....@huawei.com>
The VM start with share hugepage should close the hugefile fd
when exit.Because the hugepage fd may be send to other process
e.g vhost-user If qemu not close the fd the other process can
not free the hugepage otherwise exit process,this is ugly,so
qemu should close all shared fd when exit.
Signed-off-by: linhaifeng <haifeng....@huawei.com>
---
exec.c | 12 ++++++++++++
vl.c | 7 +++++++
2 files changed, 19 insertions(+)
diff --git a/exec.c b/exec.c
index 759055d..d120b73 100644
--- a/exec.c
+++ b/exec.c
@@ -1535,6 +1535,18 @@ void qemu_ram_remap(ram_addr_t addr, ram_addr_t length)
}
}
}
+
+void qemu_close_all_ram_fd(void)
+{
+ RAMBlock *block;
+
+ qemu_mutex_lock_ramlist();
+ QTAILQ_FOREACH(block, &ram_list.blocks, next) {
+ close(block->fd);
+ }
+ qemu_mutex_unlock_ramlist();
+}
+
#endif /* !_WIN32 */
int qemu_get_ram_fd(ram_addr_t addr)
diff --git a/vl.c b/vl.c
index aee73e1..0b78f3f 100644
--- a/vl.c
+++ b/vl.c
@@ -1658,6 +1658,7 @@ static int qemu_shutdown_requested(void)
return r;
}
+extern void qemu_close_all_ram_fd(void);
static void qemu_kill_report(void)
{
if (!qtest_driver() && shutdown_signal != -1) {
@@ -1671,6 +1672,12 @@ static void qemu_kill_report(void)
fprintf(stderr, " from pid " FMT_pid "\n", shutdown_pid);
}
shutdown_signal = -1;
+
+ /* Close all ram fd when exit. If the ram is shared by othter process
s/othter/other/
+ * e.g vhost-user, it can free the hugepage by close fd after qemu
exit,
+ * otherwise the process have to exit to free hugepage.
+ */
+ qemu_close_all_ram_fd();
}
}