ia64/linux-2.6.18-xen.hg

view lib/cmdline.c @ 897:329ea0ccb344

balloon: try harder to balloon up under memory pressure.

Currently if the balloon driver is unable to increase the guest's
reservation it assumes the failure was due to reaching its full
allocation, gives up on the ballooning operation and records the limit
it reached as the "hard limit". The driver will not try again until
the target is set again (even to the same value).

However it is possible that ballooning has in fact failed due to
memory pressure in the host and therefore it is desirable to keep
attempting to reach the target in case memory becomes available. The
most likely scenario is that some guests are ballooning down while
others are ballooning up and therefore there is temporary memory
pressure while things stabilise. You would not expect a well behaved
toolstack to ask a domain to balloon to more than its allocation nor
would you expect it to deliberately over-commit memory by setting
balloon targets which exceed the total host memory.

This patch drops the concept of a hard limit and causes the balloon
driver to retry increasing the reservation on a timer in the same
manner as when decreasing the reservation.

Also if we partially succeed in increasing the reservation
(i.e. receive less pages than we asked for) then we may as well keep
those pages rather than returning them to Xen.

Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
author Keir Fraser <keir.fraser@citrix.com>
date Fri Jun 05 14:01:20 2009 +0100 (2009-06-05)
parents 831230e53067
children
line source
1 /*
2 * linux/lib/cmdline.c
3 * Helper functions generally used for parsing kernel command line
4 * and module options.
5 *
6 * Code and copyrights come from init/main.c and arch/i386/kernel/setup.c.
7 *
8 * This source code is licensed under the GNU General Public License,
9 * Version 2. See the file COPYING for more details.
10 *
11 * GNU Indent formatting options for this file: -kr -i8 -npsl -pcs
12 *
13 */
15 #include <linux/module.h>
16 #include <linux/kernel.h>
17 #include <linux/string.h>
20 /**
21 * get_option - Parse integer from an option string
22 * @str: option string
23 * @pint: (output) integer value parsed from @str
24 *
25 * Read an int from an option string; if available accept a subsequent
26 * comma as well.
27 *
28 * Return values:
29 * 0 : no int in string
30 * 1 : int found, no subsequent comma
31 * 2 : int found including a subsequent comma
32 */
34 int get_option (char **str, int *pint)
35 {
36 char *cur = *str;
38 if (!cur || !(*cur))
39 return 0;
40 *pint = simple_strtol (cur, str, 0);
41 if (cur == *str)
42 return 0;
43 if (**str == ',') {
44 (*str)++;
45 return 2;
46 }
48 return 1;
49 }
51 /**
52 * get_options - Parse a string into a list of integers
53 * @str: String to be parsed
54 * @nints: size of integer array
55 * @ints: integer array
56 *
57 * This function parses a string containing a comma-separated
58 * list of integers. The parse halts when the array is
59 * full, or when no more numbers can be retrieved from the
60 * string.
61 *
62 * Return value is the character in the string which caused
63 * the parse to end (typically a null terminator, if @str is
64 * completely parseable).
65 */
67 char *get_options(const char *str, int nints, int *ints)
68 {
69 int res, i = 1;
71 while (i < nints) {
72 res = get_option ((char **)&str, ints + i);
73 if (res == 0)
74 break;
75 i++;
76 if (res == 1)
77 break;
78 }
79 ints[0] = i - 1;
80 return (char *)str;
81 }
83 /**
84 * memparse - parse a string with mem suffixes into a number
85 * @ptr: Where parse begins
86 * @retptr: (output) Pointer to next char after parse completes
87 *
88 * Parses a string into a number. The number stored at @ptr is
89 * potentially suffixed with %K (for kilobytes, or 1024 bytes),
90 * %M (for megabytes, or 1048576 bytes), or %G (for gigabytes, or
91 * 1073741824). If the number is suffixed with K, M, or G, then
92 * the return value is the number multiplied by one kilobyte, one
93 * megabyte, or one gigabyte, respectively.
94 */
96 unsigned long long memparse (char *ptr, char **retptr)
97 {
98 unsigned long long ret = simple_strtoull (ptr, retptr, 0);
100 switch (**retptr) {
101 case 'G':
102 case 'g':
103 ret <<= 10;
104 case 'M':
105 case 'm':
106 ret <<= 10;
107 case 'K':
108 case 'k':
109 ret <<= 10;
110 (*retptr)++;
111 default:
112 break;
113 }
114 return ret;
115 }
118 EXPORT_SYMBOL(memparse);
119 EXPORT_SYMBOL(get_option);
120 EXPORT_SYMBOL(get_options);