ia64/linux-2.6.18-xen.hg

view lib/klist.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 * klist.c - Routines for manipulating klists.
3 *
4 *
5 * This klist interface provides a couple of structures that wrap around
6 * struct list_head to provide explicit list "head" (struct klist) and
7 * list "node" (struct klist_node) objects. For struct klist, a spinlock
8 * is included that protects access to the actual list itself. struct
9 * klist_node provides a pointer to the klist that owns it and a kref
10 * reference count that indicates the number of current users of that node
11 * in the list.
12 *
13 * The entire point is to provide an interface for iterating over a list
14 * that is safe and allows for modification of the list during the
15 * iteration (e.g. insertion and removal), including modification of the
16 * current node on the list.
17 *
18 * It works using a 3rd object type - struct klist_iter - that is declared
19 * and initialized before an iteration. klist_next() is used to acquire the
20 * next element in the list. It returns NULL if there are no more items.
21 * Internally, that routine takes the klist's lock, decrements the reference
22 * count of the previous klist_node and increments the count of the next
23 * klist_node. It then drops the lock and returns.
24 *
25 * There are primitives for adding and removing nodes to/from a klist.
26 * When deleting, klist_del() will simply decrement the reference count.
27 * Only when the count goes to 0 is the node removed from the list.
28 * klist_remove() will try to delete the node from the list and block
29 * until it is actually removed. This is useful for objects (like devices)
30 * that have been removed from the system and must be freed (but must wait
31 * until all accessors have finished).
32 *
33 * Copyright (C) 2005 Patrick Mochel
34 *
35 * This file is released under the GPL v2.
36 */
38 #include <linux/klist.h>
39 #include <linux/module.h>
42 /**
43 * klist_init - Initialize a klist structure.
44 * @k: The klist we're initializing.
45 * @get: The get function for the embedding object (NULL if none)
46 * @put: The put function for the embedding object (NULL if none)
47 *
48 * Initialises the klist structure. If the klist_node structures are
49 * going to be embedded in refcounted objects (necessary for safe
50 * deletion) then the get/put arguments are used to initialise
51 * functions that take and release references on the embedding
52 * objects.
53 */
55 void klist_init(struct klist * k, void (*get)(struct klist_node *),
56 void (*put)(struct klist_node *))
57 {
58 INIT_LIST_HEAD(&k->k_list);
59 spin_lock_init(&k->k_lock);
60 k->get = get;
61 k->put = put;
62 }
64 EXPORT_SYMBOL_GPL(klist_init);
67 static void add_head(struct klist * k, struct klist_node * n)
68 {
69 spin_lock(&k->k_lock);
70 list_add(&n->n_node, &k->k_list);
71 spin_unlock(&k->k_lock);
72 }
74 static void add_tail(struct klist * k, struct klist_node * n)
75 {
76 spin_lock(&k->k_lock);
77 list_add_tail(&n->n_node, &k->k_list);
78 spin_unlock(&k->k_lock);
79 }
82 static void klist_node_init(struct klist * k, struct klist_node * n)
83 {
84 INIT_LIST_HEAD(&n->n_node);
85 init_completion(&n->n_removed);
86 kref_init(&n->n_ref);
87 n->n_klist = k;
88 if (k->get)
89 k->get(n);
90 }
93 /**
94 * klist_add_head - Initialize a klist_node and add it to front.
95 * @n: node we're adding.
96 * @k: klist it's going on.
97 */
99 void klist_add_head(struct klist_node * n, struct klist * k)
100 {
101 klist_node_init(k, n);
102 add_head(k, n);
103 }
105 EXPORT_SYMBOL_GPL(klist_add_head);
108 /**
109 * klist_add_tail - Initialize a klist_node and add it to back.
110 * @n: node we're adding.
111 * @k: klist it's going on.
112 */
114 void klist_add_tail(struct klist_node * n, struct klist * k)
115 {
116 klist_node_init(k, n);
117 add_tail(k, n);
118 }
120 EXPORT_SYMBOL_GPL(klist_add_tail);
123 static void klist_release(struct kref * kref)
124 {
125 struct klist_node * n = container_of(kref, struct klist_node, n_ref);
126 void (*put)(struct klist_node *) = n->n_klist->put;
127 list_del(&n->n_node);
128 complete(&n->n_removed);
129 n->n_klist = NULL;
130 if (put)
131 put(n);
132 }
134 static int klist_dec_and_del(struct klist_node * n)
135 {
136 return kref_put(&n->n_ref, klist_release);
137 }
140 /**
141 * klist_del - Decrement the reference count of node and try to remove.
142 * @n: node we're deleting.
143 */
145 void klist_del(struct klist_node * n)
146 {
147 struct klist * k = n->n_klist;
149 spin_lock(&k->k_lock);
150 klist_dec_and_del(n);
151 spin_unlock(&k->k_lock);
152 }
154 EXPORT_SYMBOL_GPL(klist_del);
157 /**
158 * klist_remove - Decrement the refcount of node and wait for it to go away.
159 * @n: node we're removing.
160 */
162 void klist_remove(struct klist_node * n)
163 {
164 struct klist * k = n->n_klist;
165 spin_lock(&k->k_lock);
166 klist_dec_and_del(n);
167 spin_unlock(&k->k_lock);
168 wait_for_completion(&n->n_removed);
169 }
171 EXPORT_SYMBOL_GPL(klist_remove);
174 /**
175 * klist_node_attached - Say whether a node is bound to a list or not.
176 * @n: Node that we're testing.
177 */
179 int klist_node_attached(struct klist_node * n)
180 {
181 return (n->n_klist != NULL);
182 }
184 EXPORT_SYMBOL_GPL(klist_node_attached);
187 /**
188 * klist_iter_init_node - Initialize a klist_iter structure.
189 * @k: klist we're iterating.
190 * @i: klist_iter we're filling.
191 * @n: node to start with.
192 *
193 * Similar to klist_iter_init(), but starts the action off with @n,
194 * instead of with the list head.
195 */
197 void klist_iter_init_node(struct klist * k, struct klist_iter * i, struct klist_node * n)
198 {
199 i->i_klist = k;
200 i->i_head = &k->k_list;
201 i->i_cur = n;
202 if (n)
203 kref_get(&n->n_ref);
204 }
206 EXPORT_SYMBOL_GPL(klist_iter_init_node);
209 /**
210 * klist_iter_init - Iniitalize a klist_iter structure.
211 * @k: klist we're iterating.
212 * @i: klist_iter structure we're filling.
213 *
214 * Similar to klist_iter_init_node(), but start with the list head.
215 */
217 void klist_iter_init(struct klist * k, struct klist_iter * i)
218 {
219 klist_iter_init_node(k, i, NULL);
220 }
222 EXPORT_SYMBOL_GPL(klist_iter_init);
225 /**
226 * klist_iter_exit - Finish a list iteration.
227 * @i: Iterator structure.
228 *
229 * Must be called when done iterating over list, as it decrements the
230 * refcount of the current node. Necessary in case iteration exited before
231 * the end of the list was reached, and always good form.
232 */
234 void klist_iter_exit(struct klist_iter * i)
235 {
236 if (i->i_cur) {
237 klist_del(i->i_cur);
238 i->i_cur = NULL;
239 }
240 }
242 EXPORT_SYMBOL_GPL(klist_iter_exit);
245 static struct klist_node * to_klist_node(struct list_head * n)
246 {
247 return container_of(n, struct klist_node, n_node);
248 }
251 /**
252 * klist_next - Ante up next node in list.
253 * @i: Iterator structure.
254 *
255 * First grab list lock. Decrement the reference count of the previous
256 * node, if there was one. Grab the next node, increment its reference
257 * count, drop the lock, and return that next node.
258 */
260 struct klist_node * klist_next(struct klist_iter * i)
261 {
262 struct list_head * next;
263 struct klist_node * knode = NULL;
265 spin_lock(&i->i_klist->k_lock);
266 if (i->i_cur) {
267 next = i->i_cur->n_node.next;
268 klist_dec_and_del(i->i_cur);
269 } else
270 next = i->i_head->next;
272 if (next != i->i_head) {
273 knode = to_klist_node(next);
274 kref_get(&knode->n_ref);
275 }
276 i->i_cur = knode;
277 spin_unlock(&i->i_klist->k_lock);
278 return knode;
279 }
281 EXPORT_SYMBOL_GPL(klist_next);