ia64/linux-2.6.18-xen.hg

view drivers/acpi/blacklist.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 * blacklist.c
3 *
4 * Check to see if the given machine has a known bad ACPI BIOS
5 * or if the BIOS is too old.
6 *
7 * Copyright (C) 2004 Len Brown <len.brown@intel.com>
8 * Copyright (C) 2002 Andy Grover <andrew.grover@intel.com>
9 *
10 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or (at
15 * your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 *
26 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
27 */
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/init.h>
32 #include <linux/acpi.h>
33 #include <acpi/acpi_bus.h>
34 #include <linux/dmi.h>
36 enum acpi_blacklist_predicates {
37 all_versions,
38 less_than_or_equal,
39 equal,
40 greater_than_or_equal,
41 };
43 struct acpi_blacklist_item {
44 char oem_id[7];
45 char oem_table_id[9];
46 u32 oem_revision;
47 acpi_table_type table;
48 enum acpi_blacklist_predicates oem_revision_predicate;
49 char *reason;
50 u32 is_critical_error;
51 };
53 /*
54 * POLICY: If *anything* doesn't work, put it on the blacklist.
55 * If they are critical errors, mark it critical, and abort driver load.
56 */
57 static struct acpi_blacklist_item acpi_blacklist[] __initdata = {
58 /* Compaq Presario 1700 */
59 {"PTLTD ", " DSDT ", 0x06040000, ACPI_DSDT, less_than_or_equal,
60 "Multiple problems", 1},
61 /* Sony FX120, FX140, FX150? */
62 {"SONY ", "U0 ", 0x20010313, ACPI_DSDT, less_than_or_equal,
63 "ACPI driver problem", 1},
64 /* Compaq Presario 800, Insyde BIOS */
65 {"INT440", "SYSFexxx", 0x00001001, ACPI_DSDT, less_than_or_equal,
66 "Does not use _REG to protect EC OpRegions", 1},
67 /* IBM 600E - _ADR should return 7, but it returns 1 */
68 {"IBM ", "TP600E ", 0x00000105, ACPI_DSDT, less_than_or_equal,
69 "Incorrect _ADR", 1},
70 {"ASUS\0\0", "P2B-S ", 0, ACPI_DSDT, all_versions,
71 "Bogus PCI routing", 1},
73 {""}
74 };
76 #if CONFIG_ACPI_BLACKLIST_YEAR
78 static int __init blacklist_by_year(void)
79 {
80 int year = dmi_get_year(DMI_BIOS_DATE);
81 /* Doesn't exist? Likely an old system */
82 if (year == -1)
83 return 1;
84 /* 0? Likely a buggy new BIOS */
85 if (year == 0)
86 return 0;
87 if (year < CONFIG_ACPI_BLACKLIST_YEAR) {
88 printk(KERN_ERR PREFIX "BIOS age (%d) fails cutoff (%d), "
89 "acpi=force is required to enable ACPI\n",
90 year, CONFIG_ACPI_BLACKLIST_YEAR);
91 return 1;
92 }
93 return 0;
94 }
95 #else
96 static inline int blacklist_by_year(void)
97 {
98 return 0;
99 }
100 #endif
102 int __init acpi_blacklisted(void)
103 {
104 int i = 0;
105 int blacklisted = 0;
106 struct acpi_table_header *table_header;
108 while (acpi_blacklist[i].oem_id[0] != '\0') {
109 if (acpi_get_table_header_early
110 (acpi_blacklist[i].table, &table_header)) {
111 i++;
112 continue;
113 }
115 if (strncmp(acpi_blacklist[i].oem_id, table_header->oem_id, 6)) {
116 i++;
117 continue;
118 }
120 if (strncmp
121 (acpi_blacklist[i].oem_table_id, table_header->oem_table_id,
122 8)) {
123 i++;
124 continue;
125 }
127 if ((acpi_blacklist[i].oem_revision_predicate == all_versions)
128 || (acpi_blacklist[i].oem_revision_predicate ==
129 less_than_or_equal
130 && table_header->oem_revision <=
131 acpi_blacklist[i].oem_revision)
132 || (acpi_blacklist[i].oem_revision_predicate ==
133 greater_than_or_equal
134 && table_header->oem_revision >=
135 acpi_blacklist[i].oem_revision)
136 || (acpi_blacklist[i].oem_revision_predicate == equal
137 && table_header->oem_revision ==
138 acpi_blacklist[i].oem_revision)) {
140 printk(KERN_ERR PREFIX
141 "Vendor \"%6.6s\" System \"%8.8s\" "
142 "Revision 0x%x has a known ACPI BIOS problem.\n",
143 acpi_blacklist[i].oem_id,
144 acpi_blacklist[i].oem_table_id,
145 acpi_blacklist[i].oem_revision);
147 printk(KERN_ERR PREFIX
148 "Reason: %s. This is a %s error\n",
149 acpi_blacklist[i].reason,
150 (acpi_blacklist[i].
151 is_critical_error ? "non-recoverable" :
152 "recoverable"));
154 blacklisted = acpi_blacklist[i].is_critical_error;
155 break;
156 } else {
157 i++;
158 }
159 }
161 blacklisted += blacklist_by_year();
163 return blacklisted;
164 }