ia64/linux-2.6.18-xen.hg

view drivers/mtd/maps/omap-toto-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 * NOR Flash memory access on TI Toto board
3 *
4 * jzhang@ti.com (C) 2003 Texas Instruments.
5 *
6 * (C) 2002 MontVista Software, Inc.
7 *
8 * $Id: omap-toto-flash.c,v 1.5 2005/11/07 11:14:27 gleixner Exp $
9 */
11 #include <linux/module.h>
12 #include <linux/types.h>
13 #include <linux/kernel.h>
14 #include <linux/errno.h>
15 #include <linux/init.h>
16 #include <linux/slab.h>
18 #include <linux/mtd/mtd.h>
19 #include <linux/mtd/map.h>
20 #include <linux/mtd/partitions.h>
22 #include <asm/hardware.h>
23 #include <asm/io.h>
26 #ifndef CONFIG_ARCH_OMAP
27 #error This is for OMAP architecture only
28 #endif
30 //these lines need be moved to a hardware header file
31 #define OMAP_TOTO_FLASH_BASE 0xd8000000
32 #define OMAP_TOTO_FLASH_SIZE 0x80000
34 static struct map_info omap_toto_map_flash = {
35 .name = "OMAP Toto flash",
36 .bankwidth = 2,
37 .virt = (void __iomem *)OMAP_TOTO_FLASH_BASE,
38 };
41 static struct mtd_partition toto_flash_partitions[] = {
42 {
43 .name = "BootLoader",
44 .size = 0x00040000, /* hopefully u-boot will stay 128k + 128*/
45 .offset = 0,
46 .mask_flags = MTD_WRITEABLE, /* force read-only */
47 }, {
48 .name = "ReservedSpace",
49 .size = 0x00030000,
50 .offset = MTDPART_OFS_APPEND,
51 //mask_flags: MTD_WRITEABLE, /* force read-only */
52 }, {
53 .name = "EnvArea", /* bottom 64KiB for env vars */
54 .size = MTDPART_SIZ_FULL,
55 .offset = MTDPART_OFS_APPEND,
56 }
57 };
59 static struct mtd_partition *parsed_parts;
61 static struct mtd_info *flash_mtd;
63 static int __init init_flash (void)
64 {
66 struct mtd_partition *parts;
67 int nb_parts = 0;
68 int parsed_nr_parts = 0;
69 const char *part_type;
71 /*
72 * Static partition definition selection
73 */
74 part_type = "static";
76 parts = toto_flash_partitions;
77 nb_parts = ARRAY_SIZE(toto_flash_partitions);
78 omap_toto_map_flash.size = OMAP_TOTO_FLASH_SIZE;
79 omap_toto_map_flash.phys = virt_to_phys(OMAP_TOTO_FLASH_BASE);
81 simple_map_init(&omap_toto_map_flash);
82 /*
83 * Now let's probe for the actual flash. Do it here since
84 * specific machine settings might have been set above.
85 */
86 printk(KERN_NOTICE "OMAP toto flash: probing %d-bit flash bus\n",
87 omap_toto_map_flash.bankwidth*8);
88 flash_mtd = do_map_probe("jedec_probe", &omap_toto_map_flash);
89 if (!flash_mtd)
90 return -ENXIO;
92 if (parsed_nr_parts > 0) {
93 parts = parsed_parts;
94 nb_parts = parsed_nr_parts;
95 }
97 if (nb_parts == 0) {
98 printk(KERN_NOTICE "OMAP toto flash: no partition info available,"
99 "registering whole flash at once\n");
100 if (add_mtd_device(flash_mtd)){
101 return -ENXIO;
102 }
103 } else {
104 printk(KERN_NOTICE "Using %s partition definition\n",
105 part_type);
106 return add_mtd_partitions(flash_mtd, parts, nb_parts);
107 }
108 return 0;
109 }
111 int __init omap_toto_mtd_init(void)
112 {
113 int status;
115 if (status = init_flash()) {
116 printk(KERN_ERR "OMAP Toto Flash: unable to init map for toto flash\n");
117 }
118 return status;
119 }
121 static void __exit omap_toto_mtd_cleanup(void)
122 {
123 if (flash_mtd) {
124 del_mtd_partitions(flash_mtd);
125 map_destroy(flash_mtd);
126 kfree(parsed_parts);
127 }
128 }
130 module_init(omap_toto_mtd_init);
131 module_exit(omap_toto_mtd_cleanup);
133 MODULE_AUTHOR("Jian Zhang");
134 MODULE_DESCRIPTION("OMAP Toto board map driver");
135 MODULE_LICENSE("GPL");