ia64/linux-2.6.18-xen.hg

view drivers/acpi/namespace/nseval.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: nseval - Object evaluation, includes control method execution
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/acparser.h>
46 #include <acpi/acinterp.h>
47 #include <acpi/acnamesp.h>
49 #define _COMPONENT ACPI_NAMESPACE
50 ACPI_MODULE_NAME("nseval")
52 /*******************************************************************************
53 *
54 * FUNCTION: acpi_ns_evaluate
55 *
56 * PARAMETERS: Info - Evaluation info block, contains:
57 * prefix_node - Prefix or Method/Object Node to execute
58 * Pathname - Name of method to execute, If NULL, the
59 * Node is the object to execute
60 * Parameters - List of parameters to pass to the method,
61 * terminated by NULL. Params itself may be
62 * NULL if no parameters are being passed.
63 * return_object - Where to put method's return value (if
64 * any). If NULL, no value is returned.
65 * parameter_type - Type of Parameter list
66 * return_object - Where to put method's return value (if
67 * any). If NULL, no value is returned.
68 * Flags - ACPI_IGNORE_RETURN_VALUE to delete return
69 *
70 * RETURN: Status
71 *
72 * DESCRIPTION: Execute a control method or return the current value of an
73 * ACPI namespace object.
74 *
75 * MUTEX: Locks interpreter
76 *
77 ******************************************************************************/
78 acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
79 {
80 acpi_status status;
82 ACPI_FUNCTION_TRACE(ns_evaluate);
84 if (!info) {
85 return_ACPI_STATUS(AE_BAD_PARAMETER);
86 }
88 /* Initialize the return value to an invalid object */
90 info->return_object = NULL;
92 /*
93 * Get the actual namespace node for the target object. Handles these cases:
94 *
95 * 1) Null node, Pathname (absolute path)
96 * 2) Node, Pathname (path relative to Node)
97 * 3) Node, Null Pathname
98 */
99 status = acpi_ns_get_node(info->prefix_node, info->pathname,
100 ACPI_NS_NO_UPSEARCH, &info->resolved_node);
101 if (ACPI_FAILURE(status)) {
102 return_ACPI_STATUS(status);
103 }
105 /*
106 * For a method alias, we must grab the actual method node so that proper
107 * scoping context will be established before execution.
108 */
109 if (acpi_ns_get_type(info->resolved_node) ==
110 ACPI_TYPE_LOCAL_METHOD_ALIAS) {
111 info->resolved_node =
112 ACPI_CAST_PTR(struct acpi_namespace_node,
113 info->resolved_node->object);
114 }
116 ACPI_DEBUG_PRINT((ACPI_DB_NAMES, "%s [%p] Value %p\n", info->pathname,
117 info->resolved_node,
118 acpi_ns_get_attached_object(info->resolved_node)));
120 /*
121 * Two major cases here:
122 *
123 * 1) The object is a control method -- execute it
124 * 2) The object is not a method -- just return it's current value
125 */
126 if (acpi_ns_get_type(info->resolved_node) == ACPI_TYPE_METHOD) {
127 /*
128 * 1) Object is a control method - execute it
129 */
131 /* Verify that there is a method object associated with this node */
133 info->obj_desc =
134 acpi_ns_get_attached_object(info->resolved_node);
135 if (!info->obj_desc) {
136 ACPI_ERROR((AE_INFO,
137 "Control method has no attached sub-object"));
138 return_ACPI_STATUS(AE_NULL_OBJECT);
139 }
141 ACPI_DUMP_PATHNAME(info->resolved_node, "Execute Method:",
142 ACPI_LV_INFO, _COMPONENT);
144 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
145 "Method at AML address %p Length %X\n",
146 info->obj_desc->method.aml_start + 1,
147 info->obj_desc->method.aml_length - 1));
149 /*
150 * Any namespace deletion must acquire both the namespace and
151 * interpreter locks to ensure that no thread is using the portion of
152 * the namespace that is being deleted.
153 *
154 * Execute the method via the interpreter. The interpreter is locked
155 * here before calling into the AML parser
156 */
157 status = acpi_ex_enter_interpreter();
158 if (ACPI_FAILURE(status)) {
159 return_ACPI_STATUS(status);
160 }
162 status = acpi_ps_execute_method(info);
163 acpi_ex_exit_interpreter();
164 } else {
165 /*
166 * 2) Object is not a method, return its current value
167 */
169 /*
170 * Objects require additional resolution steps (e.g., the Node may be
171 * a field that must be read, etc.) -- we can't just grab the object
172 * out of the node.
173 *
174 * Use resolve_node_to_value() to get the associated value.
175 *
176 * NOTE: we can get away with passing in NULL for a walk state because
177 * resolved_node is guaranteed to not be a reference to either a method
178 * local or a method argument (because this interface is never called
179 * from a running method.)
180 *
181 * Even though we do not directly invoke the interpreter for object
182 * resolution, we must lock it because we could access an opregion.
183 * The opregion access code assumes that the interpreter is locked.
184 */
185 status = acpi_ex_enter_interpreter();
186 if (ACPI_FAILURE(status)) {
187 return_ACPI_STATUS(status);
188 }
190 /* Function has a strange interface */
192 status =
193 acpi_ex_resolve_node_to_value(&info->resolved_node, NULL);
194 acpi_ex_exit_interpreter();
196 /*
197 * If acpi_ex_resolve_node_to_value() succeeded, the return value was placed
198 * in resolved_node.
199 */
200 if (ACPI_SUCCESS(status)) {
201 status = AE_CTRL_RETURN_VALUE;
202 info->return_object =
203 ACPI_CAST_PTR(union acpi_operand_object,
204 info->resolved_node);
206 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
207 "Returning object %p [%s]\n",
208 info->return_object,
209 acpi_ut_get_object_type_name(info->
210 return_object)));
211 }
212 }
214 /*
215 * Check if there is a return value that must be dealt with
216 */
217 if (status == AE_CTRL_RETURN_VALUE) {
219 /* If caller does not want the return value, delete it */
221 if (info->flags & ACPI_IGNORE_RETURN_VALUE) {
222 acpi_ut_remove_reference(info->return_object);
223 info->return_object = NULL;
224 }
226 /* Map AE_CTRL_RETURN_VALUE to AE_OK, we are done with it */
228 status = AE_OK;
229 }
231 ACPI_DEBUG_PRINT((ACPI_DB_NAMES,
232 "*** Completed evaluation of object %s ***\n",
233 info->pathname));
235 /*
236 * Namespace was unlocked by the handling acpi_ns* function, so we
237 * just return
238 */
239 return_ACPI_STATUS(status);
240 }