ia64/linux-2.6.18-xen.hg

view drivers/acpi/events/evsci.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: evsci - System Control Interrupt configuration and
4 * legacy to ACPI mode state transition functions
5 *
6 ******************************************************************************/
8 /*
9 * Copyright (C) 2000 - 2006, R. Byron Moore
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 * notice, this list of conditions, and the following disclaimer,
17 * without modification.
18 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19 * substantially similar to the "NO WARRANTY" disclaimer below
20 * ("Disclaimer") and any redistribution must be conditioned upon
21 * including a substantially similar Disclaimer requirement for further
22 * binary redistribution.
23 * 3. Neither the names of the above-listed copyright holders nor the names
24 * of any contributors may be used to endorse or promote products derived
25 * from this software without specific prior written permission.
26 *
27 * Alternatively, this software may be distributed under the terms of the
28 * GNU General Public License ("GPL") version 2 as published by the Free
29 * Software Foundation.
30 *
31 * NO WARRANTY
32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42 * POSSIBILITY OF SUCH DAMAGES.
43 */
45 #include <acpi/acpi.h>
46 #include <acpi/acevents.h>
48 #define _COMPONENT ACPI_EVENTS
49 ACPI_MODULE_NAME("evsci")
51 /* Local prototypes */
52 static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context);
54 /*******************************************************************************
55 *
56 * FUNCTION: acpi_ev_sci_xrupt_handler
57 *
58 * PARAMETERS: Context - Calling Context
59 *
60 * RETURN: Status code indicates whether interrupt was handled.
61 *
62 * DESCRIPTION: Interrupt handler that will figure out what function or
63 * control method to call to deal with a SCI.
64 *
65 ******************************************************************************/
67 static u32 ACPI_SYSTEM_XFACE acpi_ev_sci_xrupt_handler(void *context)
68 {
69 struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
70 u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
72 ACPI_FUNCTION_TRACE(ev_sci_xrupt_handler);
74 /*
75 * We are guaranteed by the ACPI CA initialization/shutdown code that
76 * if this interrupt handler is installed, ACPI is enabled.
77 */
79 /*
80 * Fixed Events:
81 * Check for and dispatch any Fixed Events that have occurred
82 */
83 interrupt_handled |= acpi_ev_fixed_event_detect();
85 /*
86 * General Purpose Events:
87 * Check for and dispatch any GPEs that have occurred
88 */
89 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
91 return_UINT32(interrupt_handled);
92 }
94 /*******************************************************************************
95 *
96 * FUNCTION: acpi_ev_gpe_xrupt_handler
97 *
98 * PARAMETERS: Context - Calling Context
99 *
100 * RETURN: Status code indicates whether interrupt was handled.
101 *
102 * DESCRIPTION: Handler for GPE Block Device interrupts
103 *
104 ******************************************************************************/
106 u32 ACPI_SYSTEM_XFACE acpi_ev_gpe_xrupt_handler(void *context)
107 {
108 struct acpi_gpe_xrupt_info *gpe_xrupt_list = context;
109 u32 interrupt_handled = ACPI_INTERRUPT_NOT_HANDLED;
111 ACPI_FUNCTION_TRACE(ev_gpe_xrupt_handler);
113 /*
114 * We are guaranteed by the ACPI CA initialization/shutdown code that
115 * if this interrupt handler is installed, ACPI is enabled.
116 */
118 /*
119 * GPEs:
120 * Check for and dispatch any GPEs that have occurred
121 */
122 interrupt_handled |= acpi_ev_gpe_detect(gpe_xrupt_list);
124 return_UINT32(interrupt_handled);
125 }
127 /******************************************************************************
128 *
129 * FUNCTION: acpi_ev_install_sci_handler
130 *
131 * PARAMETERS: none
132 *
133 * RETURN: Status
134 *
135 * DESCRIPTION: Installs SCI handler.
136 *
137 ******************************************************************************/
139 u32 acpi_ev_install_sci_handler(void)
140 {
141 u32 status = AE_OK;
143 ACPI_FUNCTION_TRACE(ev_install_sci_handler);
145 status = acpi_os_install_interrupt_handler((u32) acpi_gbl_FADT->sci_int,
146 acpi_ev_sci_xrupt_handler,
147 acpi_gbl_gpe_xrupt_list_head);
148 return_ACPI_STATUS(status);
149 }
151 /******************************************************************************
152 *
153 * FUNCTION: acpi_ev_remove_sci_handler
154 *
155 * PARAMETERS: none
156 *
157 * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
158 * installed to begin with
159 *
160 * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
161 * taken.
162 *
163 * Note: It doesn't seem important to disable all events or set the event
164 * enable registers to their original values. The OS should disable
165 * the SCI interrupt level when the handler is removed, so no more
166 * events will come in.
167 *
168 ******************************************************************************/
170 acpi_status acpi_ev_remove_sci_handler(void)
171 {
172 acpi_status status;
174 ACPI_FUNCTION_TRACE(ev_remove_sci_handler);
176 /* Just let the OS remove the handler and disable the level */
178 status = acpi_os_remove_interrupt_handler((u32) acpi_gbl_FADT->sci_int,
179 acpi_ev_sci_xrupt_handler);
181 return_ACPI_STATUS(status);
182 }