ia64/linux-2.6.18-xen.hg

view drivers/acpi/namespace/nsparse.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 *
3 * Module Name: nsparse - namespace interface to AML parser
4 *
5 *****************************************************************************/
7 /*
8 * Copyright (C) 2000 - 2006, R. Byron Moore
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
44 #include <acpi/acpi.h>
45 #include <acpi/acnamesp.h>
46 #include <acpi/acparser.h>
47 #include <acpi/acdispat.h>
49 #define _COMPONENT ACPI_NAMESPACE
50 ACPI_MODULE_NAME("nsparse")
52 /*******************************************************************************
53 *
54 * FUNCTION: ns_one_complete_parse
55 *
56 * PARAMETERS: pass_number - 1 or 2
57 * table_desc - The table to be parsed.
58 *
59 * RETURN: Status
60 *
61 * DESCRIPTION: Perform one complete parse of an ACPI/AML table.
62 *
63 ******************************************************************************/
64 acpi_status
65 acpi_ns_one_complete_parse(u8 pass_number, struct acpi_table_desc *table_desc)
66 {
67 union acpi_parse_object *parse_root;
68 acpi_status status;
69 struct acpi_walk_state *walk_state;
71 ACPI_FUNCTION_TRACE(ns_one_complete_parse);
73 /* Create and init a Root Node */
75 parse_root = acpi_ps_create_scope_op();
76 if (!parse_root) {
77 return_ACPI_STATUS(AE_NO_MEMORY);
78 }
80 /* Create and initialize a new walk state */
82 walk_state = acpi_ds_create_walk_state(table_desc->owner_id,
83 NULL, NULL, NULL);
84 if (!walk_state) {
85 acpi_ps_free_op(parse_root);
86 return_ACPI_STATUS(AE_NO_MEMORY);
87 }
89 status = acpi_ds_init_aml_walk(walk_state, parse_root, NULL,
90 table_desc->aml_start,
91 table_desc->aml_length, NULL,
92 pass_number);
93 if (ACPI_FAILURE(status)) {
94 acpi_ds_delete_walk_state(walk_state);
95 return_ACPI_STATUS(status);
96 }
98 /* Parse the AML */
100 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "*PARSE* pass %d parse\n",
101 pass_number));
102 status = acpi_ps_parse_aml(walk_state);
104 acpi_ps_delete_parse_tree(parse_root);
105 return_ACPI_STATUS(status);
106 }
108 /*******************************************************************************
109 *
110 * FUNCTION: acpi_ns_parse_table
111 *
112 * PARAMETERS: table_desc - An ACPI table descriptor for table to parse
113 * start_node - Where to enter the table into the namespace
114 *
115 * RETURN: Status
116 *
117 * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops
118 *
119 ******************************************************************************/
121 acpi_status
122 acpi_ns_parse_table(struct acpi_table_desc *table_desc,
123 struct acpi_namespace_node *start_node)
124 {
125 acpi_status status;
127 ACPI_FUNCTION_TRACE(ns_parse_table);
129 /*
130 * AML Parse, pass 1
131 *
132 * In this pass, we load most of the namespace. Control methods
133 * are not parsed until later. A parse tree is not created. Instead,
134 * each Parser Op subtree is deleted when it is finished. This saves
135 * a great deal of memory, and allows a small cache of parse objects
136 * to service the entire parse. The second pass of the parse then
137 * performs another complete parse of the AML..
138 */
139 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 1\n"));
140 status = acpi_ns_one_complete_parse(1, table_desc);
141 if (ACPI_FAILURE(status)) {
142 return_ACPI_STATUS(status);
143 }
145 /*
146 * AML Parse, pass 2
147 *
148 * In this pass, we resolve forward references and other things
149 * that could not be completed during the first pass.
150 * Another complete parse of the AML is performed, but the
151 * overhead of this is compensated for by the fact that the
152 * parse objects are all cached.
153 */
154 ACPI_DEBUG_PRINT((ACPI_DB_PARSE, "**** Start pass 2\n"));
155 status = acpi_ns_one_complete_parse(2, table_desc);
156 if (ACPI_FAILURE(status)) {
157 return_ACPI_STATUS(status);
158 }
160 return_ACPI_STATUS(status);
161 }