static int balloon_read(char *page, char **start, off_t off, int count, int *eof, void *data) { int len; len = sprintf( page, "Current allocation: %8lu kB\n" "Requested target: %8lu kB\n" "Low-mem balloon: %8lu kB\n" "High-mem balloon: %8lu kB\n" "Driver pages: %8lu kB\n" "Xen hard limit: ", PAGES2KB(current_pages), PAGES2KB(target_pages), PAGES2KB(balloon_low), PAGES2KB(balloon_high), PAGES2KB(driver_pages)); if (hard_limit != ~0UL) len += sprintf(page + len, "%8lu kB\n", PAGES2KB(hard_limit)); else len += sprintf(page + len, " ??? kB\n"); *eof = 1; return len; }
static ssize_t show_target_kb(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(bs.target_pages)); }
#ifdef HAVE_XEN_PLATFORM_COMPAT_H #include <xen/platform-compat.h> #endif #define BALLOON_CLASS_NAME "xen_memory" #define BALLOON_SHOW(name, format, args...) \ static ssize_t show_##name(struct sys_device *dev, \ struct sysdev_attribute *attr, \ char *buf) \ { \ return sprintf(buf, format, ##args); \ } \ static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(bs.current_pages)); BALLOON_SHOW(min_kb, "%lu\n", PAGES2KB(balloon_minimum_target())); BALLOON_SHOW(max_kb, "%lu\n", PAGES2KB(num_physpages)); BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(bs.balloon_low)); BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(bs.balloon_high)); BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(bs.driver_pages)); static ssize_t show_target_kb(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(bs.target_pages)); } static ssize_t store_target_kb(struct sys_device *dev, struct sysdev_attribute *attr, const char *buf, size_t count)
static ssize_t show_oom_pages(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(oom_freed_pages)); }
} else if (loaned_pages_target < loaned_pages) cmm_free_pages(loaned_pages - loaned_pages_target); } return 0; } #define CMM_SHOW(name, format, args...) \ static ssize_t show_##name(struct sys_device *dev, \ struct sysdev_attribute *attr, \ char *buf) \ { \ return sprintf(buf, format, ##args); \ } \ static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) CMM_SHOW(loaned_kb, "%lu\n", PAGES2KB(loaned_pages)); CMM_SHOW(loaned_target_kb, "%lu\n", PAGES2KB(loaned_pages_target)); static ssize_t show_oom_pages(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(oom_freed_pages)); } static ssize_t store_oom_pages(struct sys_device *dev, struct sysdev_attribute *attr, const char *buf, size_t count) { unsigned long val = simple_strtoul (buf, NULL, 10); if (!capable(CAP_SYS_ADMIN))
/* XXX - release balloon here */ return; } module_exit(balloon_exit); #define BALLOON_SHOW(name, format, args...) \ static ssize_t show_##name(struct device *dev, \ struct device_attribute *attr, \ char *buf) \ { \ return sprintf(buf, format, ##args); \ } \ static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL) BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(balloon_stats.current_pages)); BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_low)); BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_high)); static DEVICE_ULONG_ATTR(schedule_delay, 0444, balloon_stats.schedule_delay); static DEVICE_ULONG_ATTR(max_schedule_delay, 0644, balloon_stats.max_schedule_delay); static DEVICE_ULONG_ATTR(retry_count, 0444, balloon_stats.retry_count); static DEVICE_ULONG_ATTR(max_retry_count, 0644, balloon_stats.max_retry_count); static ssize_t show_target_kb(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(balloon_stats.target_pages)); } static ssize_t store_target_kb(struct device *dev,
/* XXX - release balloon here */ return; } module_exit(balloon_exit); #define BALLOON_SHOW(name, format, args...) \ static ssize_t show_##name(struct sys_device *dev, \ struct sysdev_attribute *attr, \ char *buf) \ { \ return sprintf(buf, format, ##args); \ } \ static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL) BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(balloon_stats.current_pages)); BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_low)); BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(balloon_stats.balloon_high)); BALLOON_SHOW(hard_limit_kb, (balloon_stats.hard_limit!=~0UL) ? "%lu\n" : "???\n", (balloon_stats.hard_limit!=~0UL) ? PAGES2KB(balloon_stats.hard_limit) : 0); BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(balloon_stats.driver_pages)); static ssize_t show_target_kb(struct sys_device *dev, struct sysdev_attribute *attr, char *buf) { return sprintf(buf, "%lu\n", PAGES2KB(balloon_stats.target_pages)); } static ssize_t store_target_kb(struct sys_device *dev, struct sysdev_attribute *attr,