Drivers: hv: Miscellaneous fixes
cover Drivers: hv: Miscellaneous fixes
From: K. Y. Srinivasan <[email protected]>
Miscellaneous fixes.
Alex Ng (5):
Tools: hv: vss: Skip freezing filesystems backed by loop
Drivers: hv: balloon: Correctly update onlined page count
Drivers: hv: balloon: Show the max dynamic memory assigned
Drivers: hv: balloon: Initialize last_post_time on startup
Drivers: hv: kvp: Use MAX_ADAPTER_ID_SIZE for translating adapter id
drivers/hv/hv_balloon.c | 12 ++++++------ drivers/hv/hv_kvp.c | 2 +- tools/hv/hv_vss_daemon.c | 7 +++++++ 3 files changed, 14 insertions(+), 7 deletions(-)
PATCH 1/5 Tools: hv: vss: Skip freezing filesystems backed by loop
From: Alex Ng <[email protected]>
Since a loop device is backed by a file, a backup will already result in its parent filesystem being frozen. It's sufficient to just freeze the parent filesystem, so we can skip the loop device.
This avoids a situation where a loop device and its parent filesystem are both frozen and then thawed out of order. For example, if the loop device is enumerated first, we would thaw it while its parent filesystem is still frozen. The thaw operation fails and the loop device remains frozen.
--- tools/hv/hv_vss_daemon.c | 7 +++++++ 1 files changed, 7 insertions(+), 0 deletions(-)
tools/hv/hv_vss_daemon.c +7 -0
@@ -21,6 +21,7 @@#include <sys/types.h> #include <sys/poll.h> #include <sys/ioctl.h> +#include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <mntent.h>
@@ -30,6 +31,7 @@#include <ctype.h> #include <errno.h> #include <linux/fs.h> +#include <linux/major.h> #include <linux/hyperv.h> #include <syslog.h> #include <getopt.h>
@@ -70,6 +72,7 @@ static int vss_operate(int operation)char match[] ="/dev/" ;FILE *mounts;struct mntent *ent; +struct stat sb;char errdir[1024 ] = {0 };unsigned int cmd;int error =0 , root_seen =0 , save_errno =0 ;
@@ -92,6 +95,10 @@ static int vss_operate(int operation)while ((ent =getmntent (mounts))) {if (strncmp (ent->mnt_fsname, match,strlen (match)))continue ; +if (stat (ent->mnt_fsname, &sb) ==-1 ) +continue ; +if (S_ISBLK (sb.st_mode) &&major (sb.st_rdev) ==LOOP_MAJOR ) +continue ;if (hasmntopt (ent,MNTOPT_RO ) !=NULL )continue ;if (strcmp (ent->mnt_type,"vfat" ) ==0 )
Signature · 1 line
1.7.1
PATCH 2/5 Drivers: hv: balloon: Correctly update onlined page count
In reply to [email protected]From: Alex Ng <[email protected]>
Previously, num_pages_onlined was updated using value from memory online notifier. This is incorrect because they assume that all hot-added pages are online, even though we only online the amount that's backed by the host. We should update num_pages_onlined only when the balloon driver marks a page as online.
--- drivers/hv/hv_balloon.c | 7 +++---- 1 files changed, 3 insertions(+), 4 deletions(-)
drivers/hv/hv_balloon.c +3 -4
@@ -584,10 +584,6 @@ static int hv_memory_notifier(struct notifier_block *nb, unsigned long val,switch (val) {case MEM_ONLINE : -spin_lock_irqsave (&dm_device.ha_lock, flags); - dm_device.num_pages_onlined += mem->nr_pages; -spin_unlock_irqrestore (&dm_device.ha_lock, flags); -/* Fall through */ case MEM_CANCEL_ONLINE :if (dm_device.ha_waiting) { dm_device.ha_waiting = false;
@@ -644,6 +640,9 @@ static void hv_page_online_one(struct hv_hotadd_state *has, struct page *pg)__online_page_set_limits (pg);__online_page_increment_counters (pg);__online_page_free (pg); + +WARN_ON_ONCE (!spin_is_locked (&dm_device.ha_lock)); + dm_device.num_pages_onlined++; } static void hv_bring_pgs_online(struct hv_hotadd_state *has,
Signature · 1 line
1.7.1
PATCH 3/5 Drivers: hv: balloon: Show the max dynamic memory assigned
In reply to [email protected]From: Alex Ng <[email protected]>
Previously we were only showing max number of pages. We should make it more clear that this value is the max amount of dynamic memory that the Hyper-V host is willing to assign to this guest.
--- drivers/hv/hv_balloon.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
drivers/hv/hv_balloon.c +2 -2
@@ -1035,8 +1035,8 @@ static void process_info(struct hv_dynmem_device *dm, struct dm_info_msg *msg)if (info_hdr->data_size ==sizeof (__u64)) {__u64 *max_page_count = (__u64 *)&info_hdr[1 ]; -pr_info ("INFO_TYPE_MAX_PAGE_CNT = %llu\n" , - *max_page_count); +pr_info ("Max. dynamic memory size: %llu MB\n" , + (*max_page_count) >> (20 -PAGE_SHIFT )); }break ;
Signature · 1 line
1.7.1
PATCH 4/5 Drivers: hv: balloon: Initialize last_post_time on startup
In reply to [email protected]From: Alex Ng <[email protected]>
When left uninitialized, this sometimes fails the following check in post_status():
if (!time_after(now, (last_post_time + HZ))) {
return;
}This causes unnecessary delays in reporting memory pressure to host after booting up.
--- drivers/hv/hv_balloon.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
drivers/hv/hv_balloon.c +1 -0
@@ -1655,6 +1655,7 @@ static int balloon_probe(struct hv_device *dev, } dm_device.state =DM_INITIALIZED ; + last_post_time = jiffies;return 0 ;
Signature · 1 line
1.7.1
PATCH 5/5 Drivers: hv: kvp: Use MAX_ADAPTER_ID_SIZE for translating adapter id
In reply to [email protected]From: Alex Ng <[email protected]>
There's a bug which passes the output buffer size as MAX_IP_ADDR_SIZE, when converting the adapter_id field to UTF16. This is much larger than the actual size (MAX_ADAPTER_ID_SIZE). Fix this by passing the proper size.
Fortunately, the translation is limited by the length of the input. This explains why we haven't seen output buffer overflow conditions.
--- drivers/hv/hv_kvp.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
drivers/hv/hv_kvp.c +1 -1
@@ -304,7 +304,7 @@ static int process_ob_ipinfo(void *in_msg, void *out_msg, int op)strlen ((char *)in->body.kvp_ip_val.adapter_id),UTF16_HOST_ENDIAN , (wchar_t *)out->kvp_ip_val.adapter_id, - MAX_IP_ADDR_SIZE); + MAX_ADAPTER_ID_SIZE);if (len <0 )return len;
Signature · 1 line
1.7.1