Commit b3d6dd09 authored by Boqun Feng's avatar Boqun Feng Committed by Wei Liu

Drivers: hv: balloon: Support status report for larger page sizes

DM_STATUS_REPORT expects the numbers of pages in the unit of 4k pages
(HV_HYP_PAGE) instead of guest pages, so to make it work when guest page
sizes are larger than 4k, convert the numbers of guest pages into the
numbers of HV_HYP_PAGEs.

Note that the numbers of guest pages are still used for tracing because
tracing is internal to the guest kernel.
Reported-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: default avatarBoqun Feng <boqun.feng@gmail.com>
Reviewed-by: default avatarMichael Kelley <mikelley@microsoft.com>
Link: https://lore.kernel.org/r/20220325023212.1570049-2-boqun.feng@gmail.comSigned-off-by: default avatarWei Liu <wei.liu@kernel.org>
parent b6cae15b
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/count_zeros.h>
#include <linux/memory_hotplug.h> #include <linux/memory_hotplug.h>
#include <linux/memory.h> #include <linux/memory.h>
#include <linux/notifier.h> #include <linux/notifier.h>
...@@ -1130,6 +1131,7 @@ static void post_status(struct hv_dynmem_device *dm) ...@@ -1130,6 +1131,7 @@ static void post_status(struct hv_dynmem_device *dm)
struct dm_status status; struct dm_status status;
unsigned long now = jiffies; unsigned long now = jiffies;
unsigned long last_post = last_post_time; unsigned long last_post = last_post_time;
unsigned long num_pages_avail, num_pages_committed;
if (pressure_report_delay > 0) { if (pressure_report_delay > 0) {
--pressure_report_delay; --pressure_report_delay;
...@@ -1154,16 +1156,21 @@ static void post_status(struct hv_dynmem_device *dm) ...@@ -1154,16 +1156,21 @@ static void post_status(struct hv_dynmem_device *dm)
* num_pages_onlined) as committed to the host, otherwise it can try * num_pages_onlined) as committed to the host, otherwise it can try
* asking us to balloon them out. * asking us to balloon them out.
*/ */
status.num_avail = si_mem_available(); num_pages_avail = si_mem_available();
status.num_committed = vm_memory_committed() + num_pages_committed = vm_memory_committed() +
dm->num_pages_ballooned + dm->num_pages_ballooned +
(dm->num_pages_added > dm->num_pages_onlined ? (dm->num_pages_added > dm->num_pages_onlined ?
dm->num_pages_added - dm->num_pages_onlined : 0) + dm->num_pages_added - dm->num_pages_onlined : 0) +
compute_balloon_floor(); compute_balloon_floor();
trace_balloon_status(status.num_avail, status.num_committed, trace_balloon_status(num_pages_avail, num_pages_committed,
vm_memory_committed(), dm->num_pages_ballooned, vm_memory_committed(), dm->num_pages_ballooned,
dm->num_pages_added, dm->num_pages_onlined); dm->num_pages_added, dm->num_pages_onlined);
/* Convert numbers of pages into numbers of HV_HYP_PAGEs. */
status.num_avail = num_pages_avail * NR_HV_HYP_PAGES_IN_PAGE;
status.num_committed = num_pages_committed * NR_HV_HYP_PAGES_IN_PAGE;
/* /*
* If our transaction ID is no longer current, just don't * If our transaction ID is no longer current, just don't
* send the status. This can happen if we were interrupted * send the status. This can happen if we were interrupted
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment