ia64/linux-2.6.18-xen.hg

annotate drivers/acpi/namespace/nsdumpdv.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
rev   line source
ian@0 1 /******************************************************************************
ian@0 2 *
ian@0 3 * Module Name: nsdump - table dumping routines for debug
ian@0 4 *
ian@0 5 *****************************************************************************/
ian@0 6
ian@0 7 /*
ian@0 8 * Copyright (C) 2000 - 2006, R. Byron Moore
ian@0 9 * All rights reserved.
ian@0 10 *
ian@0 11 * Redistribution and use in source and binary forms, with or without
ian@0 12 * modification, are permitted provided that the following conditions
ian@0 13 * are met:
ian@0 14 * 1. Redistributions of source code must retain the above copyright
ian@0 15 * notice, this list of conditions, and the following disclaimer,
ian@0 16 * without modification.
ian@0 17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
ian@0 18 * substantially similar to the "NO WARRANTY" disclaimer below
ian@0 19 * ("Disclaimer") and any redistribution must be conditioned upon
ian@0 20 * including a substantially similar Disclaimer requirement for further
ian@0 21 * binary redistribution.
ian@0 22 * 3. Neither the names of the above-listed copyright holders nor the names
ian@0 23 * of any contributors may be used to endorse or promote products derived
ian@0 24 * from this software without specific prior written permission.
ian@0 25 *
ian@0 26 * Alternatively, this software may be distributed under the terms of the
ian@0 27 * GNU General Public License ("GPL") version 2 as published by the Free
ian@0 28 * Software Foundation.
ian@0 29 *
ian@0 30 * NO WARRANTY
ian@0 31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
ian@0 32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
ian@0 33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
ian@0 34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
ian@0 35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
ian@0 36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
ian@0 37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
ian@0 38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
ian@0 39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
ian@0 40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
ian@0 41 * POSSIBILITY OF SUCH DAMAGES.
ian@0 42 */
ian@0 43
ian@0 44 #include <acpi/acpi.h>
ian@0 45
ian@0 46 /* TBD: This entire module is apparently obsolete and should be removed */
ian@0 47
ian@0 48 #define _COMPONENT ACPI_NAMESPACE
ian@0 49 ACPI_MODULE_NAME("nsdumpdv")
ian@0 50 #ifdef ACPI_OBSOLETE_FUNCTIONS
ian@0 51 #if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
ian@0 52 #include <acpi/acnamesp.h>
ian@0 53 /*******************************************************************************
ian@0 54 *
ian@0 55 * FUNCTION: acpi_ns_dump_one_device
ian@0 56 *
ian@0 57 * PARAMETERS: Handle - Node to be dumped
ian@0 58 * Level - Nesting level of the handle
ian@0 59 * Context - Passed into walk_namespace
ian@0 60 * return_value - Not used
ian@0 61 *
ian@0 62 * RETURN: Status
ian@0 63 *
ian@0 64 * DESCRIPTION: Dump a single Node that represents a device
ian@0 65 * This procedure is a user_function called by acpi_ns_walk_namespace.
ian@0 66 *
ian@0 67 ******************************************************************************/
ian@0 68 static acpi_status
ian@0 69 acpi_ns_dump_one_device(acpi_handle obj_handle,
ian@0 70 u32 level, void *context, void **return_value)
ian@0 71 {
ian@0 72 struct acpi_buffer buffer;
ian@0 73 struct acpi_device_info *info;
ian@0 74 acpi_status status;
ian@0 75 u32 i;
ian@0 76
ian@0 77 ACPI_FUNCTION_NAME(ns_dump_one_device);
ian@0 78
ian@0 79 status =
ian@0 80 acpi_ns_dump_one_object(obj_handle, level, context, return_value);
ian@0 81
ian@0 82 buffer.length = ACPI_ALLOCATE_LOCAL_BUFFER;
ian@0 83 status = acpi_get_object_info(obj_handle, &buffer);
ian@0 84 if (ACPI_SUCCESS(status)) {
ian@0 85 info = buffer.pointer;
ian@0 86 for (i = 0; i < level; i++) {
ian@0 87 ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES, " "));
ian@0 88 }
ian@0 89
ian@0 90 ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
ian@0 91 " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
ian@0 92 info->hardware_id.value,
ian@0 93 ACPI_FORMAT_UINT64(info->address),
ian@0 94 info->current_status));
ian@0 95 ACPI_FREE(info);
ian@0 96 }
ian@0 97
ian@0 98 return (status);
ian@0 99 }
ian@0 100
ian@0 101 /*******************************************************************************
ian@0 102 *
ian@0 103 * FUNCTION: acpi_ns_dump_root_devices
ian@0 104 *
ian@0 105 * PARAMETERS: None
ian@0 106 *
ian@0 107 * RETURN: None
ian@0 108 *
ian@0 109 * DESCRIPTION: Dump all objects of type "device"
ian@0 110 *
ian@0 111 ******************************************************************************/
ian@0 112
ian@0 113 void acpi_ns_dump_root_devices(void)
ian@0 114 {
ian@0 115 acpi_handle sys_bus_handle;
ian@0 116 acpi_status status;
ian@0 117
ian@0 118 ACPI_FUNCTION_NAME(ns_dump_root_devices);
ian@0 119
ian@0 120 /* Only dump the table if tracing is enabled */
ian@0 121
ian@0 122 if (!(ACPI_LV_TABLES & acpi_dbg_level)) {
ian@0 123 return;
ian@0 124 }
ian@0 125
ian@0 126 status = acpi_get_handle(NULL, ACPI_NS_SYSTEM_BUS, &sys_bus_handle);
ian@0 127 if (ACPI_FAILURE(status)) {
ian@0 128 return;
ian@0 129 }
ian@0 130
ian@0 131 ACPI_DEBUG_PRINT((ACPI_DB_TABLES,
ian@0 132 "Display of all devices in the namespace:\n"));
ian@0 133
ian@0 134 status = acpi_ns_walk_namespace(ACPI_TYPE_DEVICE, sys_bus_handle,
ian@0 135 ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,
ian@0 136 acpi_ns_dump_one_device, NULL, NULL);
ian@0 137 }
ian@0 138
ian@0 139 #endif
ian@0 140 #endif