ia64/linux-2.6.18-xen.hg

view scripts/kconfig/expr.h @ 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 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
3 * Released under the terms of the GNU GPL v2.0.
4 */
6 #ifndef EXPR_H
7 #define EXPR_H
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
13 #include <stdio.h>
14 #ifndef __cplusplus
15 #include <stdbool.h>
16 #endif
18 struct file {
19 struct file *next;
20 struct file *parent;
21 char *name;
22 int lineno;
23 int flags;
24 };
26 #define FILE_BUSY 0x0001
27 #define FILE_SCANNED 0x0002
28 #define FILE_PRINTED 0x0004
30 typedef enum tristate {
31 no, mod, yes
32 } tristate;
34 enum expr_type {
35 E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
36 };
38 union expr_data {
39 struct expr *expr;
40 struct symbol *sym;
41 };
43 struct expr {
44 enum expr_type type;
45 union expr_data left, right;
46 };
48 #define E_OR(dep1, dep2) (((dep1)>(dep2))?(dep1):(dep2))
49 #define E_AND(dep1, dep2) (((dep1)<(dep2))?(dep1):(dep2))
50 #define E_NOT(dep) (2-(dep))
52 struct expr_value {
53 struct expr *expr;
54 tristate tri;
55 };
57 struct symbol_value {
58 void *val;
59 tristate tri;
60 };
62 enum symbol_type {
63 S_UNKNOWN, S_BOOLEAN, S_TRISTATE, S_INT, S_HEX, S_STRING, S_OTHER
64 };
66 enum {
67 S_DEF_USER, /* main user value */
68 S_DEF_AUTO,
69 };
71 struct symbol {
72 struct symbol *next;
73 char *name;
74 char *help;
75 enum symbol_type type;
76 struct symbol_value curr;
77 struct symbol_value def[4];
78 tristate visible;
79 int flags;
80 struct property *prop;
81 struct expr *dep, *dep2;
82 struct expr_value rev_dep;
83 };
85 #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
87 #define SYMBOL_CONST 0x0001
88 #define SYMBOL_CHECK 0x0008
89 #define SYMBOL_CHOICE 0x0010
90 #define SYMBOL_CHOICEVAL 0x0020
91 #define SYMBOL_PRINTED 0x0040
92 #define SYMBOL_VALID 0x0080
93 #define SYMBOL_OPTIONAL 0x0100
94 #define SYMBOL_WRITE 0x0200
95 #define SYMBOL_CHANGED 0x0400
96 #define SYMBOL_AUTO 0x1000
97 #define SYMBOL_CHECKED 0x2000
98 #define SYMBOL_WARNED 0x8000
99 #define SYMBOL_DEF 0x10000
100 #define SYMBOL_DEF_USER 0x10000
101 #define SYMBOL_DEF_AUTO 0x20000
102 #define SYMBOL_DEF3 0x40000
103 #define SYMBOL_DEF4 0x80000
105 #define SYMBOL_MAXLENGTH 256
106 #define SYMBOL_HASHSIZE 257
107 #define SYMBOL_HASHMASK 0xff
109 enum prop_type {
110 P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
111 };
113 struct property {
114 struct property *next;
115 struct symbol *sym;
116 enum prop_type type;
117 const char *text;
118 struct expr_value visible;
119 struct expr *expr;
120 struct menu *menu;
121 struct file *file;
122 int lineno;
123 };
125 #define for_all_properties(sym, st, tok) \
126 for (st = sym->prop; st; st = st->next) \
127 if (st->type == (tok))
128 #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
129 #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
130 #define for_all_prompts(sym, st) \
131 for (st = sym->prop; st; st = st->next) \
132 if (st->text)
134 struct menu {
135 struct menu *next;
136 struct menu *parent;
137 struct menu *list;
138 struct symbol *sym;
139 struct property *prompt;
140 struct expr *dep;
141 unsigned int flags;
142 //char *help;
143 struct file *file;
144 int lineno;
145 void *data;
146 };
148 #define MENU_CHANGED 0x0001
149 #define MENU_ROOT 0x0002
151 #ifndef SWIG
153 extern struct file *file_list;
154 extern struct file *current_file;
155 struct file *lookup_file(const char *name);
157 extern struct symbol symbol_yes, symbol_no, symbol_mod;
158 extern struct symbol *modules_sym;
159 extern struct symbol *sym_defconfig_list;
160 extern int cdebug;
161 struct expr *expr_alloc_symbol(struct symbol *sym);
162 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
163 struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
164 struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
165 struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
166 struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
167 struct expr *expr_copy(struct expr *org);
168 void expr_free(struct expr *e);
169 int expr_eq(struct expr *e1, struct expr *e2);
170 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2);
171 tristate expr_calc_value(struct expr *e);
172 struct expr *expr_eliminate_yn(struct expr *e);
173 struct expr *expr_trans_bool(struct expr *e);
174 struct expr *expr_eliminate_dups(struct expr *e);
175 struct expr *expr_transform(struct expr *e);
176 int expr_contains_symbol(struct expr *dep, struct symbol *sym);
177 bool expr_depends_symbol(struct expr *dep, struct symbol *sym);
178 struct expr *expr_extract_eq_and(struct expr **ep1, struct expr **ep2);
179 struct expr *expr_extract_eq_or(struct expr **ep1, struct expr **ep2);
180 void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, struct expr **ep2);
181 struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
183 void expr_fprint(struct expr *e, FILE *out);
184 struct gstr; /* forward */
185 void expr_gstr_print(struct expr *e, struct gstr *gs);
187 static inline int expr_is_yes(struct expr *e)
188 {
189 return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
190 }
192 static inline int expr_is_no(struct expr *e)
193 {
194 return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
195 }
196 #endif
198 #ifdef __cplusplus
199 }
200 #endif
202 #endif /* EXPR_H */