diff options
Diffstat (limited to 'drivers/xen/balloon.c')
| -rw-r--r-- | drivers/xen/balloon.c | 41 | 
1 files changed, 40 insertions, 1 deletions
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 8dc7109d61b7..efa4b363ce72 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -298,6 +298,14 @@ static int decrease_reservation(unsigned long nr_pages)  		frame_list[i] = pfn_to_mfn(pfn);  		scrub_page(page); + +		if (!PageHighMem(page)) { +			ret = HYPERVISOR_update_va_mapping( +				(unsigned long)__va(pfn << PAGE_SHIFT), +				__pte_ma(0), 0); +			BUG_ON(ret); +                } +  	}  	/* Ensure that ballooned highmem pages don't have kmaps. */ @@ -490,7 +498,7 @@ static ssize_t store_target_kb(struct sys_device *dev,  	if (!capable(CAP_SYS_ADMIN))  		return -EPERM; -	target_bytes = memparse(buf, &endchar); +	target_bytes = simple_strtoull(buf, &endchar, 0) * 1024;  	balloon_set_new_target(target_bytes >> PAGE_SHIFT); @@ -500,8 +508,39 @@ static ssize_t store_target_kb(struct sys_device *dev,  static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR,  		   show_target_kb, store_target_kb); + +static ssize_t show_target(struct sys_device *dev, struct sysdev_attribute *attr, +			      char *buf) +{ +	return sprintf(buf, "%llu\n", +		       (u64)balloon_stats.target_pages << PAGE_SHIFT); +} + +static ssize_t store_target(struct sys_device *dev, +			    struct sysdev_attribute *attr, +			    const char *buf, +			    size_t count) +{ +	char *endchar; +	unsigned long long target_bytes; + +	if (!capable(CAP_SYS_ADMIN)) +		return -EPERM; + +	target_bytes = memparse(buf, &endchar); + +	balloon_set_new_target(target_bytes >> PAGE_SHIFT); + +	return count; +} + +static SYSDEV_ATTR(target, S_IRUGO | S_IWUSR, +		   show_target, store_target); + +  static struct sysdev_attribute *balloon_attrs[] = {  	&attr_target_kb, +	&attr_target,  };  static struct attribute *balloon_info_attrs[] = {  | 
