ia64/linux-2.6.18-xen.hg

view scripts/kconfig/qconf.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 #include <qlistview.h>
7 #if QT_VERSION >= 300
8 #include <qsettings.h>
9 #else
10 class QSettings {
11 public:
12 void beginGroup(const QString& group) { }
13 void endGroup(void) { }
14 bool readBoolEntry(const QString& key, bool def = FALSE, bool* ok = 0) const
15 { if (ok) *ok = FALSE; return def; }
16 int readNumEntry(const QString& key, int def = 0, bool* ok = 0) const
17 { if (ok) *ok = FALSE; return def; }
18 QString readEntry(const QString& key, const QString& def = QString::null, bool* ok = 0) const
19 { if (ok) *ok = FALSE; return def; }
20 QStringList readListEntry(const QString& key, bool* ok = 0) const
21 { if (ok) *ok = FALSE; return QStringList(); }
22 template <class t>
23 bool writeEntry(const QString& key, t value)
24 { return TRUE; }
25 };
26 #endif
28 class ConfigView;
29 class ConfigList;
30 class ConfigItem;
31 class ConfigLineEdit;
32 class ConfigMainWindow;
35 class ConfigSettings : public QSettings {
36 public:
37 QValueList<int> readSizes(const QString& key, bool *ok);
38 bool writeSizes(const QString& key, const QValueList<int>& value);
39 };
41 enum colIdx {
42 promptColIdx, nameColIdx, noColIdx, modColIdx, yesColIdx, dataColIdx, colNr
43 };
44 enum listMode {
45 singleMode, menuMode, symbolMode, fullMode, listMode
46 };
48 class ConfigList : public QListView {
49 Q_OBJECT
50 typedef class QListView Parent;
51 public:
52 ConfigList(ConfigView* p, const char *name = 0);
53 void reinit(void);
54 ConfigView* parent(void) const
55 {
56 return (ConfigView*)Parent::parent();
57 }
58 ConfigItem* findConfigItem(struct menu *);
60 protected:
61 void keyPressEvent(QKeyEvent *e);
62 void contentsMousePressEvent(QMouseEvent *e);
63 void contentsMouseReleaseEvent(QMouseEvent *e);
64 void contentsMouseMoveEvent(QMouseEvent *e);
65 void contentsMouseDoubleClickEvent(QMouseEvent *e);
66 void focusInEvent(QFocusEvent *e);
67 void contextMenuEvent(QContextMenuEvent *e);
69 public slots:
70 void setRootMenu(struct menu *menu);
72 void updateList(ConfigItem *item);
73 void setValue(ConfigItem* item, tristate val);
74 void changeValue(ConfigItem* item);
75 void updateSelection(void);
76 void saveSettings(void);
77 signals:
78 void menuChanged(struct menu *menu);
79 void menuSelected(struct menu *menu);
80 void parentSelected(void);
81 void gotFocus(struct menu *);
83 public:
84 void updateListAll(void)
85 {
86 updateAll = true;
87 updateList(NULL);
88 updateAll = false;
89 }
90 ConfigList* listView()
91 {
92 return this;
93 }
94 ConfigItem* firstChild() const
95 {
96 return (ConfigItem *)Parent::firstChild();
97 }
98 int mapIdx(colIdx idx)
99 {
100 return colMap[idx];
101 }
102 void addColumn(colIdx idx, const QString& label)
103 {
104 colMap[idx] = Parent::addColumn(label);
105 colRevMap[colMap[idx]] = idx;
106 }
107 void removeColumn(colIdx idx)
108 {
109 int col = colMap[idx];
110 if (col >= 0) {
111 Parent::removeColumn(col);
112 colRevMap[col] = colMap[idx] = -1;
113 }
114 }
115 void setAllOpen(bool open);
116 void setParentMenu(void);
118 template <class P>
119 void updateMenuList(P*, struct menu*);
121 bool updateAll;
123 QPixmap symbolYesPix, symbolModPix, symbolNoPix;
124 QPixmap choiceYesPix, choiceNoPix;
125 QPixmap menuPix, menuInvPix, menuBackPix, voidPix;
127 bool showAll, showName, showRange, showData;
128 enum listMode mode;
129 struct menu *rootEntry;
130 QColorGroup disabledColorGroup;
131 QColorGroup inactivedColorGroup;
132 QPopupMenu* headerPopup;
134 private:
135 int colMap[colNr];
136 int colRevMap[colNr];
137 };
139 class ConfigItem : public QListViewItem {
140 typedef class QListViewItem Parent;
141 public:
142 ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v)
143 : Parent(parent, after), menu(m), visible(v), goParent(false)
144 {
145 init();
146 }
147 ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v)
148 : Parent(parent, after), menu(m), visible(v), goParent(false)
149 {
150 init();
151 }
152 ConfigItem(QListView *parent, ConfigItem *after, bool v)
153 : Parent(parent, after), menu(0), visible(v), goParent(true)
154 {
155 init();
156 }
157 ~ConfigItem(void);
158 void init(void);
159 #if QT_VERSION >= 300
160 void okRename(int col);
161 #endif
162 void updateMenu(void);
163 void testUpdateMenu(bool v);
164 ConfigList* listView() const
165 {
166 return (ConfigList*)Parent::listView();
167 }
168 ConfigItem* firstChild() const
169 {
170 return (ConfigItem *)Parent::firstChild();
171 }
172 ConfigItem* nextSibling() const
173 {
174 return (ConfigItem *)Parent::nextSibling();
175 }
176 void setText(colIdx idx, const QString& text)
177 {
178 Parent::setText(listView()->mapIdx(idx), text);
179 }
180 QString text(colIdx idx) const
181 {
182 return Parent::text(listView()->mapIdx(idx));
183 }
184 void setPixmap(colIdx idx, const QPixmap& pm)
185 {
186 Parent::setPixmap(listView()->mapIdx(idx), pm);
187 }
188 const QPixmap* pixmap(colIdx idx) const
189 {
190 return Parent::pixmap(listView()->mapIdx(idx));
191 }
192 void paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align);
194 ConfigItem* nextItem;
195 struct menu *menu;
196 bool visible;
197 bool goParent;
198 };
200 class ConfigLineEdit : public QLineEdit {
201 Q_OBJECT
202 typedef class QLineEdit Parent;
203 public:
204 ConfigLineEdit(ConfigView* parent);
205 ConfigView* parent(void) const
206 {
207 return (ConfigView*)Parent::parent();
208 }
209 void show(ConfigItem *i);
210 void keyPressEvent(QKeyEvent *e);
212 public:
213 ConfigItem *item;
214 };
216 class ConfigView : public QVBox {
217 Q_OBJECT
218 typedef class QVBox Parent;
219 public:
220 ConfigView(QWidget* parent, const char *name = 0);
221 ~ConfigView(void);
222 static void updateList(ConfigItem* item);
223 static void updateListAll(void);
225 bool showAll(void) const { return list->showAll; }
226 bool showName(void) const { return list->showName; }
227 bool showRange(void) const { return list->showRange; }
228 bool showData(void) const { return list->showData; }
229 public slots:
230 void setShowAll(bool);
231 void setShowName(bool);
232 void setShowRange(bool);
233 void setShowData(bool);
234 signals:
235 void showAllChanged(bool);
236 void showNameChanged(bool);
237 void showRangeChanged(bool);
238 void showDataChanged(bool);
239 public:
240 ConfigList* list;
241 ConfigLineEdit* lineEdit;
243 static ConfigView* viewList;
244 ConfigView* nextView;
245 };
247 class ConfigInfoView : public QTextBrowser {
248 Q_OBJECT
249 typedef class QTextBrowser Parent;
250 public:
251 ConfigInfoView(QWidget* parent, const char *name = 0);
252 bool showDebug(void) const { return _showDebug; }
254 public slots:
255 void setInfo(struct menu *menu);
256 void saveSettings(void);
257 void setSource(const QString& name);
258 void setShowDebug(bool);
260 signals:
261 void showDebugChanged(bool);
262 void menuSelected(struct menu *);
264 protected:
265 void symbolInfo(void);
266 void menuInfo(void);
267 QString debug_info(struct symbol *sym);
268 static QString print_filter(const QString &str);
269 static void expr_print_help(void *data, struct symbol *sym, const char *str);
270 QPopupMenu* createPopupMenu(const QPoint& pos);
271 void contentsContextMenuEvent(QContextMenuEvent *e);
273 struct symbol *sym;
274 struct menu *menu;
275 bool _showDebug;
276 };
278 class ConfigSearchWindow : public QDialog {
279 Q_OBJECT
280 typedef class QDialog Parent;
281 public:
282 ConfigSearchWindow(QWidget* parent, const char *name = 0);
284 public slots:
285 void saveSettings(void);
286 void search(void);
288 protected:
289 QLineEdit* editField;
290 QPushButton* searchButton;
291 QSplitter* split;
292 ConfigView* list;
293 ConfigInfoView* info;
295 struct symbol **result;
296 };
298 class ConfigMainWindow : public QMainWindow {
299 Q_OBJECT
300 public:
301 ConfigMainWindow(void);
302 public slots:
303 void changeMenu(struct menu *);
304 void setMenuLink(struct menu *);
305 void listFocusChanged(void);
306 void goBack(void);
307 void loadConfig(void);
308 void saveConfig(void);
309 void saveConfigAs(void);
310 void searchConfig(void);
311 void showSingleView(void);
312 void showSplitView(void);
313 void showFullView(void);
314 void showIntro(void);
315 void showAbout(void);
316 void saveSettings(void);
318 protected:
319 void closeEvent(QCloseEvent *e);
321 ConfigSearchWindow *searchWindow;
322 ConfigView *menuView;
323 ConfigList *menuList;
324 ConfigView *configView;
325 ConfigList *configList;
326 ConfigInfoView *helpText;
327 QToolBar *toolBar;
328 QAction *backAction;
329 QSplitter* split1;
330 QSplitter* split2;
331 };