diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/xen/balloon.c | 3 | ||||
| -rw-r--r-- | drivers/xen/grant-table.c | 9 | ||||
| -rw-r--r-- | drivers/xen/xen-balloon.c | 22 |
3 files changed, 23 insertions, 11 deletions
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 50dcb68d8070..ab609255a0f3 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c | |||
| @@ -780,6 +780,9 @@ static int __init balloon_init(void) | |||
| 780 | } | 780 | } |
| 781 | #endif | 781 | #endif |
| 782 | 782 | ||
| 783 | /* Init the xen-balloon driver. */ | ||
| 784 | xen_balloon_init(); | ||
| 785 | |||
| 783 | return 0; | 786 | return 0; |
| 784 | } | 787 | } |
| 785 | subsys_initcall(balloon_init); | 788 | subsys_initcall(balloon_init); |
diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index d6786b87e13b..2c6a9114d332 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c | |||
| @@ -42,6 +42,7 @@ | |||
| 42 | #include <linux/delay.h> | 42 | #include <linux/delay.h> |
| 43 | #include <linux/hardirq.h> | 43 | #include <linux/hardirq.h> |
| 44 | #include <linux/workqueue.h> | 44 | #include <linux/workqueue.h> |
| 45 | #include <linux/ratelimit.h> | ||
| 45 | 46 | ||
| 46 | #include <xen/xen.h> | 47 | #include <xen/xen.h> |
| 47 | #include <xen/interface/xen.h> | 48 | #include <xen/interface/xen.h> |
| @@ -1072,8 +1073,14 @@ static int gnttab_expand(unsigned int req_entries) | |||
| 1072 | cur = nr_grant_frames; | 1073 | cur = nr_grant_frames; |
| 1073 | extra = ((req_entries + (grefs_per_grant_frame-1)) / | 1074 | extra = ((req_entries + (grefs_per_grant_frame-1)) / |
| 1074 | grefs_per_grant_frame); | 1075 | grefs_per_grant_frame); |
| 1075 | if (cur + extra > gnttab_max_grant_frames()) | 1076 | if (cur + extra > gnttab_max_grant_frames()) { |
| 1077 | pr_warn_ratelimited("xen/grant-table: max_grant_frames reached" | ||
| 1078 | " cur=%u extra=%u limit=%u" | ||
| 1079 | " gnttab_free_count=%u req_entries=%u\n", | ||
| 1080 | cur, extra, gnttab_max_grant_frames(), | ||
| 1081 | gnttab_free_count, req_entries); | ||
| 1076 | return -ENOSPC; | 1082 | return -ENOSPC; |
| 1083 | } | ||
| 1077 | 1084 | ||
| 1078 | rc = gnttab_map(cur, cur + extra - 1); | 1085 | rc = gnttab_map(cur, cur + extra - 1); |
| 1079 | if (rc == 0) | 1086 | if (rc == 0) |
diff --git a/drivers/xen/xen-balloon.c b/drivers/xen/xen-balloon.c index e7715cb62eef..e89136ab851e 100644 --- a/drivers/xen/xen-balloon.c +++ b/drivers/xen/xen-balloon.c | |||
| @@ -59,6 +59,8 @@ static void watch_target(struct xenbus_watch *watch, | |||
| 59 | { | 59 | { |
| 60 | unsigned long long new_target; | 60 | unsigned long long new_target; |
| 61 | int err; | 61 | int err; |
| 62 | static bool watch_fired; | ||
| 63 | static long target_diff; | ||
| 62 | 64 | ||
| 63 | err = xenbus_scanf(XBT_NIL, "memory", "target", "%llu", &new_target); | 65 | err = xenbus_scanf(XBT_NIL, "memory", "target", "%llu", &new_target); |
| 64 | if (err != 1) { | 66 | if (err != 1) { |
| @@ -69,7 +71,14 @@ static void watch_target(struct xenbus_watch *watch, | |||
| 69 | /* The given memory/target value is in KiB, so it needs converting to | 71 | /* The given memory/target value is in KiB, so it needs converting to |
| 70 | * pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10. | 72 | * pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10. |
| 71 | */ | 73 | */ |
| 72 | balloon_set_new_target(new_target >> (PAGE_SHIFT - 10)); | 74 | new_target >>= PAGE_SHIFT - 10; |
| 75 | if (watch_fired) { | ||
| 76 | balloon_set_new_target(new_target - target_diff); | ||
| 77 | return; | ||
| 78 | } | ||
| 79 | |||
| 80 | watch_fired = true; | ||
| 81 | target_diff = new_target - balloon_stats.target_pages; | ||
| 73 | } | 82 | } |
| 74 | static struct xenbus_watch target_watch = { | 83 | static struct xenbus_watch target_watch = { |
| 75 | .node = "memory/target", | 84 | .node = "memory/target", |
| @@ -94,22 +103,15 @@ static struct notifier_block xenstore_notifier = { | |||
| 94 | .notifier_call = balloon_init_watcher, | 103 | .notifier_call = balloon_init_watcher, |
| 95 | }; | 104 | }; |
| 96 | 105 | ||
| 97 | static int __init balloon_init(void) | 106 | void xen_balloon_init(void) |
| 98 | { | 107 | { |
| 99 | if (!xen_domain()) | ||
| 100 | return -ENODEV; | ||
| 101 | |||
| 102 | pr_info("Initialising balloon driver\n"); | ||
| 103 | |||
| 104 | register_balloon(&balloon_dev); | 108 | register_balloon(&balloon_dev); |
| 105 | 109 | ||
| 106 | register_xen_selfballooning(&balloon_dev); | 110 | register_xen_selfballooning(&balloon_dev); |
| 107 | 111 | ||
| 108 | register_xenstore_notifier(&xenstore_notifier); | 112 | register_xenstore_notifier(&xenstore_notifier); |
| 109 | |||
| 110 | return 0; | ||
| 111 | } | 113 | } |
| 112 | subsys_initcall(balloon_init); | 114 | EXPORT_SYMBOL_GPL(xen_balloon_init); |
| 113 | 115 | ||
| 114 | #define BALLOON_SHOW(name, format, args...) \ | 116 | #define BALLOON_SHOW(name, format, args...) \ |
| 115 | static ssize_t show_##name(struct device *dev, \ | 117 | static ssize_t show_##name(struct device *dev, \ |
