ia64/linux-2.6.18-xen.hg

view drivers/net/Space.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 * INET An implementation of the TCP/IP protocol suite for the LINUX
3 * operating system. INET is implemented using the BSD Socket
4 * interface as the means of communication with the user level.
5 *
6 * Holds initial configuration information for devices.
7 *
8 * Version: @(#)Space.c 1.0.7 08/12/93
9 *
10 * Authors: Ross Biro
11 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
12 * Donald J. Becker, <becker@scyld.com>
13 *
14 * Changelog:
15 * Stephen Hemminger (09/2003)
16 * - get rid of pre-linked dev list, dynamic device allocation
17 * Paul Gortmaker (03/2002)
18 * - struct init cleanup, enable multiple ISA autoprobes.
19 * Arnaldo Carvalho de Melo <acme@conectiva.com.br> - 09/1999
20 * - fix sbni: s/device/net_device/
21 * Paul Gortmaker (06/98):
22 * - sort probes in a sane way, make sure all (safe) probes
23 * get run once & failed autoprobes don't autoprobe again.
24 *
25 * This program is free software; you can redistribute it and/or
26 * modify it under the terms of the GNU General Public License
27 * as published by the Free Software Foundation; either version
28 * 2 of the License, or (at your option) any later version.
29 */
30 #include <linux/netdevice.h>
31 #include <linux/etherdevice.h>
32 #include <linux/trdevice.h>
33 #include <linux/errno.h>
34 #include <linux/init.h>
35 #include <linux/netlink.h>
36 #include <linux/divert.h>
38 /* A unified ethernet device probe. This is the easiest way to have every
39 ethernet adaptor have the name "eth[0123...]".
40 */
42 extern struct net_device *ne2_probe(int unit);
43 extern struct net_device *hp100_probe(int unit);
44 extern struct net_device *ultra_probe(int unit);
45 extern struct net_device *ultra32_probe(int unit);
46 extern struct net_device *wd_probe(int unit);
47 extern struct net_device *el2_probe(int unit);
48 extern struct net_device *ne_probe(int unit);
49 extern struct net_device *hp_probe(int unit);
50 extern struct net_device *hp_plus_probe(int unit);
51 extern struct net_device *express_probe(int unit);
52 extern struct net_device *eepro_probe(int unit);
53 extern struct net_device *at1700_probe(int unit);
54 extern struct net_device *fmv18x_probe(int unit);
55 extern struct net_device *eth16i_probe(int unit);
56 extern struct net_device *i82596_probe(int unit);
57 extern struct net_device *ewrk3_probe(int unit);
58 extern struct net_device *el1_probe(int unit);
59 extern struct net_device *wavelan_probe(int unit);
60 extern struct net_device *arlan_probe(int unit);
61 extern struct net_device *el16_probe(int unit);
62 extern struct net_device *elmc_probe(int unit);
63 extern struct net_device *skmca_probe(int unit);
64 extern struct net_device *elplus_probe(int unit);
65 extern struct net_device *ac3200_probe(int unit);
66 extern struct net_device *es_probe(int unit);
67 extern struct net_device *lne390_probe(int unit);
68 extern struct net_device *e2100_probe(int unit);
69 extern struct net_device *ni5010_probe(int unit);
70 extern struct net_device *ni52_probe(int unit);
71 extern struct net_device *ni65_probe(int unit);
72 extern struct net_device *sonic_probe(int unit);
73 extern struct net_device *SK_init(int unit);
74 extern struct net_device *seeq8005_probe(int unit);
75 extern struct net_device *smc_init(int unit);
76 extern struct net_device *atarilance_probe(int unit);
77 extern struct net_device *sun3lance_probe(int unit);
78 extern struct net_device *sun3_82586_probe(int unit);
79 extern struct net_device *apne_probe(int unit);
80 extern struct net_device *bionet_probe(int unit);
81 extern struct net_device *pamsnet_probe(int unit);
82 extern struct net_device *cs89x0_probe(int unit);
83 extern struct net_device *hplance_probe(int unit);
84 extern struct net_device *bagetlance_probe(int unit);
85 extern struct net_device *mvme147lance_probe(int unit);
86 extern struct net_device *tc515_probe(int unit);
87 extern struct net_device *lance_probe(int unit);
88 extern struct net_device *mace_probe(int unit);
89 extern struct net_device *mac8390_probe(int unit);
90 extern struct net_device *mac89x0_probe(int unit);
91 extern struct net_device *mc32_probe(int unit);
92 extern struct net_device *cops_probe(int unit);
93 extern struct net_device *ltpc_probe(void);
95 /* Detachable devices ("pocket adaptors") */
96 extern struct net_device *de620_probe(int unit);
98 /* Fibre Channel adapters */
99 extern int iph5526_probe(struct net_device *dev);
101 /* SBNI adapters */
102 extern int sbni_probe(int unit);
104 struct devprobe2 {
105 struct net_device *(*probe)(int unit);
106 int status; /* non-zero if autoprobe has failed */
107 };
109 static int __init probe_list2(int unit, struct devprobe2 *p, int autoprobe)
110 {
111 struct net_device *dev;
112 for (; p->probe; p++) {
113 if (autoprobe && p->status)
114 continue;
115 dev = p->probe(unit);
116 if (!IS_ERR(dev))
117 return 0;
118 if (autoprobe)
119 p->status = PTR_ERR(dev);
120 }
121 return -ENODEV;
122 }
124 /*
125 * This is a bit of an artificial separation as there are PCI drivers
126 * that also probe for EISA cards (in the PCI group) and there are ISA
127 * drivers that probe for EISA cards (in the ISA group). These are the
128 * legacy EISA only driver probes, and also the legacy PCI probes
129 */
131 static struct devprobe2 eisa_probes[] __initdata = {
132 #ifdef CONFIG_ULTRA32
133 {ultra32_probe, 0},
134 #endif
135 #ifdef CONFIG_AC3200
136 {ac3200_probe, 0},
137 #endif
138 #ifdef CONFIG_ES3210
139 {es_probe, 0},
140 #endif
141 #ifdef CONFIG_LNE390
142 {lne390_probe, 0},
143 #endif
144 {NULL, 0},
145 };
147 static struct devprobe2 mca_probes[] __initdata = {
148 #ifdef CONFIG_NE2_MCA
149 {ne2_probe, 0},
150 #endif
151 #ifdef CONFIG_ELMC /* 3c523 */
152 {elmc_probe, 0},
153 #endif
154 #ifdef CONFIG_ELMC_II /* 3c527 */
155 {mc32_probe, 0},
156 #endif
157 #ifdef CONFIG_SKMC /* SKnet Microchannel */
158 {skmca_probe, 0},
159 #endif
160 {NULL, 0},
161 };
163 /*
164 * ISA probes that touch addresses < 0x400 (including those that also
165 * look for EISA/PCI/MCA cards in addition to ISA cards).
166 */
167 static struct devprobe2 isa_probes[] __initdata = {
168 #ifdef CONFIG_HP100 /* ISA, EISA & PCI */
169 {hp100_probe, 0},
170 #endif
171 #ifdef CONFIG_3C515
172 {tc515_probe, 0},
173 #endif
174 #ifdef CONFIG_ULTRA
175 {ultra_probe, 0},
176 #endif
177 #ifdef CONFIG_WD80x3
178 {wd_probe, 0},
179 #endif
180 #ifdef CONFIG_EL2 /* 3c503 */
181 {el2_probe, 0},
182 #endif
183 #ifdef CONFIG_HPLAN
184 {hp_probe, 0},
185 #endif
186 #ifdef CONFIG_HPLAN_PLUS
187 {hp_plus_probe, 0},
188 #endif
189 #ifdef CONFIG_E2100 /* Cabletron E21xx series. */
190 {e2100_probe, 0},
191 #endif
192 #if defined(CONFIG_NE2000) || \
193 defined(CONFIG_NE_H8300) /* ISA (use ne2k-pci for PCI cards) */
194 {ne_probe, 0},
195 #endif
196 #ifdef CONFIG_LANCE /* ISA/VLB (use pcnet32 for PCI cards) */
197 {lance_probe, 0},
198 #endif
199 #ifdef CONFIG_SMC9194
200 {smc_init, 0},
201 #endif
202 #ifdef CONFIG_SEEQ8005
203 {seeq8005_probe, 0},
204 #endif
205 #ifdef CONFIG_CS89x0
206 {cs89x0_probe, 0},
207 #endif
208 #ifdef CONFIG_AT1700
209 {at1700_probe, 0},
210 #endif
211 #ifdef CONFIG_ETH16I
212 {eth16i_probe, 0}, /* ICL EtherTeam 16i/32 */
213 #endif
214 #ifdef CONFIG_EEXPRESS /* Intel EtherExpress */
215 {express_probe, 0},
216 #endif
217 #ifdef CONFIG_EEXPRESS_PRO /* Intel EtherExpress Pro/10 */
218 {eepro_probe, 0},
219 #endif
220 #ifdef CONFIG_EWRK3 /* DEC EtherWORKS 3 */
221 {ewrk3_probe, 0},
222 #endif
223 #if defined(CONFIG_APRICOT) || defined(CONFIG_MVME16x_NET) || defined(CONFIG_BVME6000_NET) /* Intel I82596 */
224 {i82596_probe, 0},
225 #endif
226 #ifdef CONFIG_EL1 /* 3c501 */
227 {el1_probe, 0},
228 #endif
229 #ifdef CONFIG_WAVELAN /* WaveLAN */
230 {wavelan_probe, 0},
231 #endif
232 #ifdef CONFIG_ARLAN /* Aironet */
233 {arlan_probe, 0},
234 #endif
235 #ifdef CONFIG_EL16 /* 3c507 */
236 {el16_probe, 0},
237 #endif
238 #ifdef CONFIG_ELPLUS /* 3c505 */
239 {elplus_probe, 0},
240 #endif
241 #ifdef CONFIG_NI5010
242 {ni5010_probe, 0},
243 #endif
244 #ifdef CONFIG_NI52
245 {ni52_probe, 0},
246 #endif
247 #ifdef CONFIG_NI65
248 {ni65_probe, 0},
249 #endif
250 {NULL, 0},
251 };
253 static struct devprobe2 parport_probes[] __initdata = {
254 #ifdef CONFIG_DE620 /* D-Link DE-620 adapter */
255 {de620_probe, 0},
256 #endif
257 {NULL, 0},
258 };
260 static struct devprobe2 m68k_probes[] __initdata = {
261 #ifdef CONFIG_ATARILANCE /* Lance-based Atari ethernet boards */
262 {atarilance_probe, 0},
263 #endif
264 #ifdef CONFIG_SUN3LANCE /* sun3 onboard Lance chip */
265 {sun3lance_probe, 0},
266 #endif
267 #ifdef CONFIG_SUN3_82586 /* sun3 onboard Intel 82586 chip */
268 {sun3_82586_probe, 0},
269 #endif
270 #ifdef CONFIG_APNE /* A1200 PCMCIA NE2000 */
271 {apne_probe, 0},
272 #endif
273 #ifdef CONFIG_ATARI_BIONET /* Atari Bionet Ethernet board */
274 {bionet_probe, 0},
275 #endif
276 #ifdef CONFIG_ATARI_PAMSNET /* Atari PAMsNet Ethernet board */
277 {pamsnet_probe, 0},
278 #endif
279 #ifdef CONFIG_MVME147_NET /* MVME147 internal Ethernet */
280 {mvme147lance_probe, 0},
281 #endif
282 #ifdef CONFIG_MACMACE /* Mac 68k Quadra AV builtin Ethernet */
283 {mace_probe, 0},
284 #endif
285 #ifdef CONFIG_MAC8390 /* NuBus NS8390-based cards */
286 {mac8390_probe, 0},
287 #endif
288 #ifdef CONFIG_MAC89x0
289 {mac89x0_probe, 0},
290 #endif
291 {NULL, 0},
292 };
294 /*
295 * Unified ethernet device probe, segmented per architecture and
296 * per bus interface. This drives the legacy devices only for now.
297 */
299 static void __init ethif_probe2(int unit)
300 {
301 unsigned long base_addr = netdev_boot_base("eth", unit);
303 if (base_addr == 1)
304 return;
306 (void)( probe_list2(unit, m68k_probes, base_addr == 0) &&
307 probe_list2(unit, eisa_probes, base_addr == 0) &&
308 probe_list2(unit, mca_probes, base_addr == 0) &&
309 probe_list2(unit, isa_probes, base_addr == 0) &&
310 probe_list2(unit, parport_probes, base_addr == 0));
311 }
313 #ifdef CONFIG_TR
314 /* Token-ring device probe */
315 extern int ibmtr_probe_card(struct net_device *);
316 extern struct net_device *smctr_probe(int unit);
318 static struct devprobe2 tr_probes2[] __initdata = {
319 #ifdef CONFIG_SMCTR
320 {smctr_probe, 0},
321 #endif
322 {NULL, 0},
323 };
325 static __init int trif_probe(int unit)
326 {
327 int err = -ENODEV;
328 #ifdef CONFIG_IBMTR
329 struct net_device *dev = alloc_trdev(0);
330 if (!dev)
331 return -ENOMEM;
333 sprintf(dev->name, "tr%d", unit);
334 netdev_boot_setup_check(dev);
335 err = ibmtr_probe_card(dev);
336 if (err)
337 free_netdev(dev);
338 #endif
339 return err;
340 }
342 static void __init trif_probe2(int unit)
343 {
344 unsigned long base_addr = netdev_boot_base("tr", unit);
346 if (base_addr == 1)
347 return;
348 probe_list2(unit, tr_probes2, base_addr == 0);
349 }
350 #endif
353 /*
354 * The loopback device is global so it can be directly referenced
355 * by the network code. Also, it must be first on device list.
356 */
357 extern int loopback_init(void);
359 /* Statically configured drivers -- order matters here. */
360 static int __init net_olddevs_init(void)
361 {
362 int num;
364 if (loopback_init()) {
365 printk(KERN_ERR "Network loopback device setup failed\n");
366 }
369 #ifdef CONFIG_SBNI
370 for (num = 0; num < 8; ++num)
371 sbni_probe(num);
372 #endif
373 #ifdef CONFIG_TR
374 for (num = 0; num < 8; ++num)
375 if (!trif_probe(num))
376 trif_probe2(num);
377 #endif
378 for (num = 0; num < 8; ++num)
379 ethif_probe2(num);
381 #ifdef CONFIG_COPS
382 cops_probe(0);
383 cops_probe(1);
384 cops_probe(2);
385 #endif
386 #ifdef CONFIG_LTPC
387 ltpc_probe();
388 #endif
390 return 0;
391 }
393 device_initcall(net_olddevs_init);