Skip to contentSkip to conversation

qemu-dm: add command to flush buffer cache

PATCH In review Olaf Hering 2 participants 5 messages Jan 12, 2012 – Jan 13, 2012

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 qemu-dm: add command to flush buffer cache

Add support for a xenstore dm command to flush qemu's buffer cache.

qemu will just keep mapping pages and not release them, which causes problems for the memory pager (since the page is mapped, it won't get paged out). When the pager has trouble finding a page to page out, it asks qemu to flush its buffer, which releases all the page mappings. This makes it possible to find pages to swap out agian.

---
 ioemu-remote/xenstore.c |    3 +++
 1 file changed, 3 insertions(+)
xenstore.c +3 -0
@@ -927,6 +927,9 @@ static void xenstore_process_dm_command_
         do_pci_add(par);
         free(par);
 #endif
+    } else if (!strncmp(command, "flush-cache", len)) {
+        fprintf(logfile, "dm-command: flush caches\n");
+        qemu_invalidate_map_cache();
     } else {
         fprintf(logfile, "dm-command: unknown command\"%*s\"\n", len, command);
     }
#1 lore raw
Quoted 1 line · Olaf Hering

Add support for a xenstore dm command to flush qemu's buffer cache.

Something like this is most likely also needed in mainline qemu. My search in the qemu.org git web UI did not show any of the commands in ioemu-remote, so its not clear how to forward port this change.

Olaf

Quoted 12 lines
xenstore.c +3 -0
@@ -927,6 +927,9 @@ static void xenstore_process_dm_command_
         do_pci_add(par);
         free(par);
 #endif
+    } else if (!strncmp(command, "flush-cache", len)) {
+        fprintf(logfile, "dm-command: flush caches\n");
+        qemu_invalidate_map_cache();
     } else {
         fprintf(logfile, "dm-command: unknown command\"%*s\"\n", len, command);
     }
#2 lore raw
Quoted 7 lines · Olaf Hering
Quoted 1 line · Olaf Hering

Add support for a xenstore dm command to flush qemu's buffer cache.

Something like this is most likely also needed in mainline qemu. My search in the qemu.org git web UI did not show any of the commands in ioemu-remote, so its not clear how to forward port this change.

Yes, upstream qemu is going to need this too.
So far we haven't needed any xenstore command in upstream qemu, because we have been using qemu's own rpc mechanism, called qmp. There is qmp support in libxl already, so it shouldn't be difficult to use it, instead of sending the command through xenstore.

#3 lore raw
In reply to Olaf Hering
Quoted 18 lines · Olaf Hering

Add support for a xenstore dm command to flush qemu's buffer cache.

qemu will just keep mapping pages and not release them, which causes problems for the memory pager (since the page is mapped, it won't get paged out). When the pager has trouble finding a page to page out, it asks qemu to flush its buffer, which releases all the page mappings. This makes it possible to find pages to swap out agian.

---
 ioemu-remote/xenstore.c |    3 +++
 1 file changed, 3 insertions(+)

xenstore.c static void xenstore_process_dm_command_ · line 935

Quoted 9 lines
xenstore.c +3 -0
@@ -927,6 +927,9 @@ static void xenstore_process_dm_command_
         do_pci_add(par);
         free(par);
 #endif
+    } else if (!strncmp(command, "flush-cache", len)) {
+        fprintf(logfile, "dm-command: flush caches\n");
+        qemu_invalidate_map_cache();
     } else {
         fprintf(logfile, "dm-command: unknown command\"%*s\"\n", len, command);
     }

I guess it is not possible to send the usual ioreq with type == IOREQ_TYPE_INVALIDATE because the pager is separate from the hypervisor, correct?

#4 lore raw
Quoted 3 lines · Stefano Stabellini

I guess it is not possible to send the usual ioreq with type == IOREQ_TYPE_INVALIDATE because the pager is separate from the hypervisor, correct?

Maybe send_invalidate_req() could be triggerd by the pager in some way? Andres sent a patch to move from domctl to memop. Maybe the paging part of it could be extended to issue another command which just calls send_invalidate_req(). If thats possible, then I assume the upstream qemu does not need changing as well.

Olaf