ia64/linux-2.6.18-xen.hg

view lib/parser.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 * lib/parser.c - simple parser for mount, etc. options.
3 *
4 * This source code is licensed under the GNU General Public License,
5 * Version 2. See the file COPYING for more details.
6 */
8 #include <linux/ctype.h>
9 #include <linux/module.h>
10 #include <linux/parser.h>
11 #include <linux/slab.h>
12 #include <linux/string.h>
14 /**
15 * match_one: - Determines if a string matches a simple pattern
16 * @s: the string to examine for presense of the pattern
17 * @p: the string containing the pattern
18 * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
19 * locations.
20 *
21 * Description: Determines if the pattern @p is present in string @s. Can only
22 * match extremely simple token=arg style patterns. If the pattern is found,
23 * the location(s) of the arguments will be returned in the @args array.
24 */
25 static int match_one(char *s, char *p, substring_t args[])
26 {
27 char *meta;
28 int argc = 0;
30 if (!p)
31 return 1;
33 while(1) {
34 int len = -1;
35 meta = strchr(p, '%');
36 if (!meta)
37 return strcmp(p, s) == 0;
39 if (strncmp(p, s, meta-p))
40 return 0;
42 s += meta - p;
43 p = meta + 1;
45 if (isdigit(*p))
46 len = simple_strtoul(p, &p, 10);
47 else if (*p == '%') {
48 if (*s++ != '%')
49 return 0;
50 p++;
51 continue;
52 }
54 if (argc >= MAX_OPT_ARGS)
55 return 0;
57 args[argc].from = s;
58 switch (*p++) {
59 case 's':
60 if (strlen(s) == 0)
61 return 0;
62 else if (len == -1 || len > strlen(s))
63 len = strlen(s);
64 args[argc].to = s + len;
65 break;
66 case 'd':
67 simple_strtol(s, &args[argc].to, 0);
68 goto num;
69 case 'u':
70 simple_strtoul(s, &args[argc].to, 0);
71 goto num;
72 case 'o':
73 simple_strtoul(s, &args[argc].to, 8);
74 goto num;
75 case 'x':
76 simple_strtoul(s, &args[argc].to, 16);
77 num:
78 if (args[argc].to == args[argc].from)
79 return 0;
80 break;
81 default:
82 return 0;
83 }
84 s = args[argc].to;
85 argc++;
86 }
87 }
89 /**
90 * match_token: - Find a token (and optional args) in a string
91 * @s: the string to examine for token/argument pairs
92 * @table: match_table_t describing the set of allowed option tokens and the
93 * arguments that may be associated with them. Must be terminated with a
94 * &struct match_token whose pattern is set to the NULL pointer.
95 * @args: array of %MAX_OPT_ARGS &substring_t elements. Used to return match
96 * locations.
97 *
98 * Description: Detects which if any of a set of token strings has been passed
99 * to it. Tokens can include up to MAX_OPT_ARGS instances of basic c-style
100 * format identifiers which will be taken into account when matching the
101 * tokens, and whose locations will be returned in the @args array.
102 */
103 int match_token(char *s, match_table_t table, substring_t args[])
104 {
105 struct match_token *p;
107 for (p = table; !match_one(s, p->pattern, args) ; p++)
108 ;
110 return p->token;
111 }
113 /**
114 * match_number: scan a number in the given base from a substring_t
115 * @s: substring to be scanned
116 * @result: resulting integer on success
117 * @base: base to use when converting string
118 *
119 * Description: Given a &substring_t and a base, attempts to parse the substring
120 * as a number in that base. On success, sets @result to the integer represented
121 * by the string and returns 0. Returns either -ENOMEM or -EINVAL on failure.
122 */
123 static int match_number(substring_t *s, int *result, int base)
124 {
125 char *endp;
126 char *buf;
127 int ret;
129 buf = kmalloc(s->to - s->from + 1, GFP_KERNEL);
130 if (!buf)
131 return -ENOMEM;
132 memcpy(buf, s->from, s->to - s->from);
133 buf[s->to - s->from] = '\0';
134 *result = simple_strtol(buf, &endp, base);
135 ret = 0;
136 if (endp == buf)
137 ret = -EINVAL;
138 kfree(buf);
139 return ret;
140 }
142 /**
143 * match_int: - scan a decimal representation of an integer from a substring_t
144 * @s: substring_t to be scanned
145 * @result: resulting integer on success
146 *
147 * Description: Attempts to parse the &substring_t @s as a decimal integer. On
148 * success, sets @result to the integer represented by the string and returns 0.
149 * Returns either -ENOMEM or -EINVAL on failure.
150 */
151 int match_int(substring_t *s, int *result)
152 {
153 return match_number(s, result, 0);
154 }
156 /**
157 * match_octal: - scan an octal representation of an integer from a substring_t
158 * @s: substring_t to be scanned
159 * @result: resulting integer on success
160 *
161 * Description: Attempts to parse the &substring_t @s as an octal integer. On
162 * success, sets @result to the integer represented by the string and returns
163 * 0. Returns either -ENOMEM or -EINVAL on failure.
164 */
165 int match_octal(substring_t *s, int *result)
166 {
167 return match_number(s, result, 8);
168 }
170 /**
171 * match_hex: - scan a hex representation of an integer from a substring_t
172 * @s: substring_t to be scanned
173 * @result: resulting integer on success
174 *
175 * Description: Attempts to parse the &substring_t @s as a hexadecimal integer.
176 * On success, sets @result to the integer represented by the string and
177 * returns 0. Returns either -ENOMEM or -EINVAL on failure.
178 */
179 int match_hex(substring_t *s, int *result)
180 {
181 return match_number(s, result, 16);
182 }
184 /**
185 * match_strcpy: - copies the characters from a substring_t to a string
186 * @to: string to copy characters to.
187 * @s: &substring_t to copy
188 *
189 * Description: Copies the set of characters represented by the given
190 * &substring_t @s to the c-style string @to. Caller guarantees that @to is
191 * large enough to hold the characters of @s.
192 */
193 void match_strcpy(char *to, substring_t *s)
194 {
195 memcpy(to, s->from, s->to - s->from);
196 to[s->to - s->from] = '\0';
197 }
199 /**
200 * match_strdup: - allocate a new string with the contents of a substring_t
201 * @s: &substring_t to copy
202 *
203 * Description: Allocates and returns a string filled with the contents of
204 * the &substring_t @s. The caller is responsible for freeing the returned
205 * string with kfree().
206 */
207 char *match_strdup(substring_t *s)
208 {
209 char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL);
210 if (p)
211 match_strcpy(p, s);
212 return p;
213 }
215 EXPORT_SYMBOL(match_token);
216 EXPORT_SYMBOL(match_int);
217 EXPORT_SYMBOL(match_octal);
218 EXPORT_SYMBOL(match_hex);
219 EXPORT_SYMBOL(match_strcpy);
220 EXPORT_SYMBOL(match_strdup);