Commit 1775826c authored by Jeremy Fitzhardinge's avatar Jeremy Fitzhardinge Committed by Ingo Molnar

xen: add balloon driver

The balloon driver allows memory to be dynamically added or removed from the domain,
in order to allow host memory to be balanced between multiple domains.

This patch introduces the Xen balloon driver, though it currently only
allows a domain to be shrunk from its initial size (and re-grown back to
that size).  A later patch will add the ability to grow a domain beyond
its initial size.
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent af7ae3b9
...@@ -97,4 +97,6 @@ source "drivers/dca/Kconfig" ...@@ -97,4 +97,6 @@ source "drivers/dca/Kconfig"
source "drivers/auxdisplay/Kconfig" source "drivers/auxdisplay/Kconfig"
source "drivers/uio/Kconfig" source "drivers/uio/Kconfig"
source "drivers/xen/Kconfig"
endmenu endmenu
config XEN_BALLOON
bool "Xen memory balloon driver"
depends on XEN
default y
help
The balloon driver allows the Xen domain to request more memory from
the system to expand the domain's memory allocation, or alternatively
return unneeded memory to the system.
config XEN_SCRUB_PAGES
bool "Scrub pages before returning them to system"
depends on XEN_BALLOON
default y
help
Scrub pages before returning them to the system for reuse by
other domains. This makes sure that any confidential data
is not accidentally visible to other domains. Is it more
secure, but slightly less efficient.
If in doubt, say yes.
obj-y += grant-table.o features.o events.o obj-y += grant-table.o features.o events.o
obj-y += xenbus/ obj-y += xenbus/
obj-$(CONFIG_XEN_XENCOMM) += xencomm.o obj-$(CONFIG_XEN_XENCOMM) += xencomm.o
obj-$(CONFIG_XEN_BALLOON) += balloon.o
This diff is collapsed.
/******************************************************************************
* balloon.h
*
* Xen balloon driver - enables returning/claiming memory to/from Xen.
*
* Copyright (c) 2003, B Dragovic
* Copyright (c) 2003-2004, M Williamson, K Fraser
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation; or, when distributed
* separately from the Linux kernel or incorporated into other
* software packages, subject to the following license:
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this source file (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy, modify,
* merge, publish, distribute, sublicense, and/or sell copies of the Software,
* and to permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#ifndef __XEN_BALLOON_H__
#define __XEN_BALLOON_H__
#include <linux/spinlock.h>
#if 0
/*
* Inform the balloon driver that it should allow some slop for device-driver
* memory activities.
*/
void balloon_update_driver_allowance(long delta);
/* Allocate/free a set of empty pages in low memory (i.e., no RAM mapped). */
struct page **alloc_empty_pages_and_pagevec(int nr_pages);
void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages);
void balloon_release_driver_page(struct page *page);
/*
* Prevent the balloon driver from changing the memory reservation during
* a driver critical region.
*/
extern spinlock_t balloon_lock;
#define balloon_lock(__flags) spin_lock_irqsave(&balloon_lock, __flags)
#define balloon_unlock(__flags) spin_unlock_irqrestore(&balloon_lock, __flags)
#endif
#endif /* __XEN_BALLOON_H__ */
...@@ -29,7 +29,7 @@ struct xen_memory_reservation { ...@@ -29,7 +29,7 @@ struct xen_memory_reservation {
* OUT: GMFN bases of extents that were allocated * OUT: GMFN bases of extents that were allocated
* (NB. This command also updates the mach_to_phys translation table) * (NB. This command also updates the mach_to_phys translation table)
*/ */
GUEST_HANDLE(ulong) extent_start; ulong extent_start;
/* Number of extents, and size/alignment of each (2^extent_order pages). */ /* Number of extents, and size/alignment of each (2^extent_order pages). */
unsigned long nr_extents; unsigned long nr_extents;
...@@ -50,7 +50,6 @@ struct xen_memory_reservation { ...@@ -50,7 +50,6 @@ struct xen_memory_reservation {
domid_t domid; domid_t domid;
}; };
DEFINE_GUEST_HANDLE_STRUCT(xen_memory_reservation);
/* /*
* Returns the maximum machine frame number of mapped RAM in this system. * Returns the maximum machine frame number of mapped RAM in this system.
...@@ -86,7 +85,7 @@ struct xen_machphys_mfn_list { ...@@ -86,7 +85,7 @@ struct xen_machphys_mfn_list {
* any large discontiguities in the machine address space, 2MB gaps in * any large discontiguities in the machine address space, 2MB gaps in
* the machphys table will be represented by an MFN base of zero. * the machphys table will be represented by an MFN base of zero.
*/ */
GUEST_HANDLE(ulong) extent_start; ulong extent_start;
/* /*
* Number of extents written to the above array. This will be smaller * Number of extents written to the above array. This will be smaller
...@@ -94,7 +93,6 @@ struct xen_machphys_mfn_list { ...@@ -94,7 +93,6 @@ struct xen_machphys_mfn_list {
*/ */
unsigned int nr_extents; unsigned int nr_extents;
}; };
DEFINE_GUEST_HANDLE_STRUCT(xen_machphys_mfn_list);
/* /*
* Sets the GPFN at which a particular page appears in the specified guest's * Sets the GPFN at which a particular page appears in the specified guest's
...@@ -117,7 +115,6 @@ struct xen_add_to_physmap { ...@@ -117,7 +115,6 @@ struct xen_add_to_physmap {
/* GPFN where the source mapping page should appear. */ /* GPFN where the source mapping page should appear. */
unsigned long gpfn; unsigned long gpfn;
}; };
DEFINE_GUEST_HANDLE_STRUCT(xen_add_to_physmap);
/* /*
* Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error * Translates a list of domain-specific GPFNs into MFNs. Returns a -ve error
...@@ -132,14 +129,13 @@ struct xen_translate_gpfn_list { ...@@ -132,14 +129,13 @@ struct xen_translate_gpfn_list {
unsigned long nr_gpfns; unsigned long nr_gpfns;
/* List of GPFNs to translate. */ /* List of GPFNs to translate. */
GUEST_HANDLE(ulong) gpfn_list; ulong gpfn_list;
/* /*
* Output list to contain MFN translations. May be the same as the input * Output list to contain MFN translations. May be the same as the input
* list (in which case each input GPFN is overwritten with the output MFN). * list (in which case each input GPFN is overwritten with the output MFN).
*/ */
GUEST_HANDLE(ulong) mfn_list; ulong mfn_list;
}; };
DEFINE_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list);
#endif /* __XEN_PUBLIC_MEMORY_H__ */ #endif /* __XEN_PUBLIC_MEMORY_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment