ia64/linux-2.6.18-xen.hg

view drivers/mtd/maps/ts5500_flash.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 * ts5500_flash.c -- MTD map driver for Technology Systems TS-5500 board
3 *
4 * Copyright (C) 2004 Sean Young <sean@mess.org>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19 *
20 * Note:
21 * - In order for detection to work, jumper 3 must be set.
22 * - Drive A and B use the resident flash disk (RFD) flash translation layer.
23 * - If you have created your own jffs file system and the bios overwrites
24 * it during boot, try disabling Drive A: and B: in the boot order.
25 *
26 * $Id: ts5500_flash.c,v 1.5 2005/11/07 11:14:28 gleixner Exp $
27 */
29 #include <linux/init.h>
30 #include <linux/module.h>
31 #include <linux/kernel.h>
32 #include <linux/mtd/map.h>
33 #include <linux/mtd/mtd.h>
34 #include <linux/mtd/partitions.h>
35 #include <linux/types.h>
38 #define WINDOW_ADDR 0x09400000
39 #define WINDOW_SIZE 0x00200000
41 static struct map_info ts5500_map = {
42 .name = "TS-5500 Flash",
43 .size = WINDOW_SIZE,
44 .bankwidth = 1,
45 .phys = WINDOW_ADDR
46 };
48 static struct mtd_partition ts5500_partitions[] = {
49 {
50 .name = "Drive A",
51 .offset = 0,
52 .size = 0x0e0000
53 },
54 {
55 .name = "BIOS",
56 .offset = 0x0e0000,
57 .size = 0x020000,
58 },
59 {
60 .name = "Drive B",
61 .offset = 0x100000,
62 .size = 0x100000
63 }
64 };
66 #define NUM_PARTITIONS ARRAY_SIZE(ts5500_partitions)
68 static struct mtd_info *mymtd;
70 static int __init init_ts5500_map(void)
71 {
72 int rc = 0;
74 ts5500_map.virt = ioremap_nocache(ts5500_map.phys, ts5500_map.size);
76 if (!ts5500_map.virt) {
77 printk(KERN_ERR "Failed to ioremap_nocache\n");
78 rc = -EIO;
79 goto err2;
80 }
82 simple_map_init(&ts5500_map);
84 mymtd = do_map_probe("jedec_probe", &ts5500_map);
85 if (!mymtd)
86 mymtd = do_map_probe("map_rom", &ts5500_map);
88 if (!mymtd) {
89 rc = -ENXIO;
90 goto err1;
91 }
93 mymtd->owner = THIS_MODULE;
94 add_mtd_partitions(mymtd, ts5500_partitions, NUM_PARTITIONS);
96 return 0;
98 err1:
99 map_destroy(mymtd);
100 iounmap(ts5500_map.virt);
101 err2:
102 return rc;
103 }
105 static void __exit cleanup_ts5500_map(void)
106 {
107 if (mymtd) {
108 del_mtd_partitions(mymtd);
109 map_destroy(mymtd);
110 }
112 if (ts5500_map.virt) {
113 iounmap(ts5500_map.virt);
114 ts5500_map.virt = NULL;
115 }
116 }
118 module_init(init_ts5500_map);
119 module_exit(cleanup_ts5500_map);
121 MODULE_LICENSE("GPL");
122 MODULE_AUTHOR("Sean Young <sean@mess.org>");
123 MODULE_DESCRIPTION("MTD map driver for Techology Systems TS-5500 board");