1 /****************************************************************************** 2 * Xen balloon driver - enables returning/claiming memory to/from Xen. 3 * 4 * Copyright (c) 2003, B Dragovic 5 * Copyright (c) 2003-2004, M Williamson, K Fraser 6 * Copyright (c) 2005 Dan M. Smith, IBM Corporation 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License version 2 10 * as published by the Free Software Foundation; or, when distributed 11 * separately from the Linux kernel or incorporated into other 12 * software packages, subject to the following license: 13 * 14 * Permission is hereby granted, free of charge, to any person obtaining a copy 15 * of this source file (the "Software"), to deal in the Software without 16 * restriction, including without limitation the rights to use, copy, modify, 17 * merge, publish, distribute, sublicense, and/or sell copies of the Software, 18 * and to permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be included in 22 * all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 25 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 26 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 27 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 28 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 29 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 30 * IN THE SOFTWARE. 31 */ 32 33 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 34 35 #include <linux/kernel.h> 36 #include <linux/errno.h> 37 #include <linux/mm_types.h> 38 #include <linux/init.h> 39 #include <linux/capability.h> 40 #include <linux/memory_hotplug.h> 41 42 #include <xen/xen.h> 43 #include <xen/interface/xen.h> 44 #include <xen/balloon.h> 45 #include <xen/xenbus.h> 46 #include <xen/features.h> 47 #include <xen/page.h> 48 #include <xen/mem-reservation.h> 49 50 #define PAGES2KB(_p) ((_p)<<(PAGE_SHIFT-10)) 51 52 #define BALLOON_CLASS_NAME "xen_memory" 53 54 #ifdef CONFIG_MEMORY_HOTPLUG 55 u64 xen_saved_max_mem_size = 0; 56 #endif 57 58 static struct device balloon_dev; 59 60 static int register_balloon(struct device *dev); 61 62 /* React to a change in the target key */ 63 static void watch_target(struct xenbus_watch *watch, 64 const char *path, const char *token) 65 { 66 unsigned long long new_target, static_max; 67 int err; 68 static bool watch_fired; 69 static long target_diff; 70 71 #ifdef CONFIG_MEMORY_HOTPLUG 72 /* The balloon driver will take care of adding memory now. */ 73 if (xen_saved_max_mem_size) 74 max_mem_size = xen_saved_max_mem_size; 75 #endif 76 77 err = xenbus_scanf(XBT_NIL, "memory", "target", "%llu", &new_target); 78 if (err != 1) { 79 /* This is ok (for domain0 at least) - so just return */ 80 return; 81 } 82 83 /* The given memory/target value is in KiB, so it needs converting to 84 * pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10. 85 */ 86 new_target >>= PAGE_SHIFT - 10; 87 88 if (!watch_fired) { 89 watch_fired = true; 90 91 if ((xenbus_scanf(XBT_NIL, "memory", "static-max", 92 "%llu", &static_max) == 1) || 93 (xenbus_scanf(XBT_NIL, "memory", "memory_static_max", 94 "%llu", &static_max) == 1)) 95 static_max >>= PAGE_SHIFT - 10; 96 else 97 static_max = new_target; 98 99 target_diff = (xen_pv_domain() || xen_initial_domain()) ? 0 100 : static_max - balloon_stats.target_pages; 101 } 102 103 balloon_set_new_target(new_target - target_diff); 104 } 105 static struct xenbus_watch target_watch = { 106 .node = "memory/target", 107 .callback = watch_target, 108 }; 109 110 111 static int balloon_init_watcher(struct notifier_block *notifier, 112 unsigned long event, 113 void *data) 114 { 115 int err; 116 117 err = register_xenbus_watch(&target_watch); 118 if (err) 119 pr_err("Failed to set balloon watcher\n"); 120 121 return NOTIFY_DONE; 122 } 123 124 static struct notifier_block xenstore_notifier = { 125 .notifier_call = balloon_init_watcher, 126 }; 127 128 void xen_balloon_init(void) 129 { 130 register_balloon(&balloon_dev); 131 132 register_xen_selfballooning(&balloon_dev); 133 134 register_xenstore_notifier(&xenstore_notifier); 135 } 136 EXPORT_SYMBOL_GPL(xen_balloon_init); 137 138 #define BALLOON_SHOW(name, format, args...) \ 139 static ssize_t show_##name(struct device *dev, \ 140 struct device_attribute *attr, \ 141 char *buf) \ 142 { \ 143 return sprintf(buf, format, ##args); \ 144 } \ 145 static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) 146 147 BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(balloon_stats.current_pages)); 148 BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_low)); 149 BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_high)); 150 151 static DEVICE_ULONG_ATTR(schedule_delay, 0444, balloon_stats.schedule_delay); 152 static DEVICE_ULONG_ATTR(max_schedule_delay, 0644, balloon_stats.max_schedule_delay); 153 static DEVICE_ULONG_ATTR(retry_count, 0444, balloon_stats.retry_count); 154 static DEVICE_ULONG_ATTR(max_retry_count, 0644, balloon_stats.max_retry_count); 155 static DEVICE_BOOL_ATTR(scrub_pages, 0644, xen_scrub_pages); 156 157 static ssize_t show_target_kb(struct device *dev, struct device_attribute *attr, 158 char *buf) 159 { 160 return sprintf(buf, "%lu\n", PAGES2KB(balloon_stats.target_pages)); 161 } 162 163 static ssize_t store_target_kb(struct device *dev, 164 struct device_attribute *attr, 165 const char *buf, 166 size_t count) 167 { 168 char *endchar; 169 unsigned long long target_bytes; 170 171 if (!capable(CAP_SYS_ADMIN)) 172 return -EPERM; 173 174 target_bytes = simple_strtoull(buf, &endchar, 0) * 1024; 175 176 balloon_set_new_target(target_bytes >> PAGE_SHIFT); 177 178 return count; 179 } 180 181 static DEVICE_ATTR(target_kb, S_IRUGO | S_IWUSR, 182 show_target_kb, store_target_kb); 183 184 185 static ssize_t show_target(struct device *dev, struct device_attribute *attr, 186 char *buf) 187 { 188 return sprintf(buf, "%llu\n", 189 (unsigned long long)balloon_stats.target_pages 190 << PAGE_SHIFT); 191 } 192 193 static ssize_t store_target(struct device *dev, 194 struct device_attribute *attr, 195 const char *buf, 196 size_t count) 197 { 198 char *endchar; 199 unsigned long long target_bytes; 200 201 if (!capable(CAP_SYS_ADMIN)) 202 return -EPERM; 203 204 target_bytes = memparse(buf, &endchar); 205 206 balloon_set_new_target(target_bytes >> PAGE_SHIFT); 207 208 return count; 209 } 210 211 static DEVICE_ATTR(target, S_IRUGO | S_IWUSR, 212 show_target, store_target); 213 214 215 static struct attribute *balloon_attrs[] = { 216 &dev_attr_target_kb.attr, 217 &dev_attr_target.attr, 218 &dev_attr_schedule_delay.attr.attr, 219 &dev_attr_max_schedule_delay.attr.attr, 220 &dev_attr_retry_count.attr.attr, 221 &dev_attr_max_retry_count.attr.attr, 222 &dev_attr_scrub_pages.attr.attr, 223 NULL 224 }; 225 226 static const struct attribute_group balloon_group = { 227 .attrs = balloon_attrs 228 }; 229 230 static struct attribute *balloon_info_attrs[] = { 231 &dev_attr_current_kb.attr, 232 &dev_attr_low_kb.attr, 233 &dev_attr_high_kb.attr, 234 NULL 235 }; 236 237 static const struct attribute_group balloon_info_group = { 238 .name = "info", 239 .attrs = balloon_info_attrs 240 }; 241 242 static const struct attribute_group *balloon_groups[] = { 243 &balloon_group, 244 &balloon_info_group, 245 NULL 246 }; 247 248 static struct bus_type balloon_subsys = { 249 .name = BALLOON_CLASS_NAME, 250 .dev_name = BALLOON_CLASS_NAME, 251 }; 252 253 static int register_balloon(struct device *dev) 254 { 255 int error; 256 257 error = subsys_system_register(&balloon_subsys, NULL); 258 if (error) 259 return error; 260 261 dev->id = 0; 262 dev->bus = &balloon_subsys; 263 dev->groups = balloon_groups; 264 265 error = device_register(dev); 266 if (error) { 267 bus_unregister(&balloon_subsys); 268 return error; 269 } 270 271 return 0; 272 } 273