|
@@ -498,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);
|
|
|
|
|
@@ -508,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[] = {
|