ia64/linux-2.6.18-xen.hg

view scripts/kconfig/lkc.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 LKC_H
7 #define LKC_H
9 #include "expr.h"
11 #ifndef KBUILD_NO_NLS
12 # include <libintl.h>
13 #else
14 # define gettext(Msgid) ((const char *) (Msgid))
15 # define textdomain(Domainname) ((const char *) (Domainname))
16 # define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname))
17 #endif
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
23 #ifdef LKC_DIRECT_LINK
24 #define P(name,type,arg) extern type name arg
25 #else
26 #include "lkc_defs.h"
27 #define P(name,type,arg) extern type (*name ## _p) arg
28 #endif
29 #include "lkc_proto.h"
30 #undef P
32 #define SRCTREE "srctree"
34 #define PACKAGE "linux"
35 #define LOCALEDIR "/usr/share/locale"
37 #define _(text) gettext(text)
38 #define N_(text) (text)
41 #define TF_COMMAND 0x0001
42 #define TF_PARAM 0x0002
43 #define TF_OPTION 0x0004
45 #define T_OPT_MODULES 1
46 #define T_OPT_DEFCONFIG_LIST 2
48 struct kconf_id {
49 int name;
50 int token;
51 unsigned int flags;
52 enum symbol_type stype;
53 };
55 int zconfparse(void);
56 void zconfdump(FILE *out);
58 extern int zconfdebug;
59 void zconf_starthelp(void);
60 FILE *zconf_fopen(const char *name);
61 void zconf_initscan(const char *name);
62 void zconf_nextfile(const char *name);
63 int zconf_lineno(void);
64 char *zconf_curname(void);
66 /* confdata.c */
67 char *conf_get_default_confname(void);
69 /* kconfig_load.c */
70 void kconfig_load(void);
72 /* menu.c */
73 void menu_init(void);
74 struct menu *menu_add_menu(void);
75 void menu_end_menu(void);
76 void menu_add_entry(struct symbol *sym);
77 void menu_end_entry(void);
78 void menu_add_dep(struct expr *dep);
79 struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
80 struct property *menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
81 void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
82 void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
83 void menu_add_option(int token, char *arg);
84 void menu_finalize(struct menu *parent);
85 void menu_set_type(int type);
87 /* util.c */
88 struct file *file_lookup(const char *name);
89 int file_write_dep(const char *name);
91 struct gstr {
92 size_t len;
93 char *s;
94 };
95 struct gstr str_new(void);
96 struct gstr str_assign(const char *s);
97 void str_free(struct gstr *gs);
98 void str_append(struct gstr *gs, const char *s);
99 void str_printf(struct gstr *gs, const char *fmt, ...);
100 const char *str_get(struct gstr *gs);
102 /* symbol.c */
103 void sym_init(void);
104 void sym_clear_all_valid(void);
105 void sym_set_all_changed(void);
106 void sym_set_changed(struct symbol *sym);
107 struct symbol *sym_check_deps(struct symbol *sym);
108 struct property *prop_alloc(enum prop_type type, struct symbol *sym);
109 struct symbol *prop_get_symbol(struct property *prop);
111 static inline tristate sym_get_tristate_value(struct symbol *sym)
112 {
113 return sym->curr.tri;
114 }
117 static inline struct symbol *sym_get_choice_value(struct symbol *sym)
118 {
119 return (struct symbol *)sym->curr.val;
120 }
122 static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
123 {
124 return sym_set_tristate_value(chval, yes);
125 }
127 static inline bool sym_is_choice(struct symbol *sym)
128 {
129 return sym->flags & SYMBOL_CHOICE ? true : false;
130 }
132 static inline bool sym_is_choice_value(struct symbol *sym)
133 {
134 return sym->flags & SYMBOL_CHOICEVAL ? true : false;
135 }
137 static inline bool sym_is_optional(struct symbol *sym)
138 {
139 return sym->flags & SYMBOL_OPTIONAL ? true : false;
140 }
142 static inline bool sym_has_value(struct symbol *sym)
143 {
144 return sym->flags & SYMBOL_DEF_USER ? true : false;
145 }
147 #ifdef __cplusplus
148 }
149 #endif
151 #endif /* LKC_H */