History

xen/balloon: add runtime control for scrubbing ballooned out pages

Scrubbing pages on initial balloon down can take some time, especially in nested virtualization case (nested EPT is slow). When HVM/PVH guest is started with memory= significantly lower than maxmem=, all the extra pages will be scrubbed before returning to Xen. But since most of them weren't used at all at that point, Xen needs to populate them first (from populate-on-demand pool). In nested virt case (Xen inside KVM) this slows down the guest boot by 15-30s with just 1.5GB needed to be returned to Xen. Add runtime parameter to enable/disable it, to allow initially disabling scrubbing, then enable it back during boot (for example in initramfs). Such usage relies on assumption that a) most pages ballooned out during initial boot weren't used at all, and b) even if they were, very few secrets are in the guest at that time (before any serious userspace kicks in). Convert CONFIG_XEN_SCRUB_PAGES to CONFIG_XEN_SCRUB_PAGES_DEFAULT (also enabled by default), controlling default value for the new runtime switch.

Marek Marczykowski-Górecki committed 8 years ago

Commit 197ecb31 parent 87dffe86 files · +33 −6Browse files

Unified · Split

6 files
  1. Documentation/ABI/stable/sysfs-devices-system-xen_memory +9 −0
  2. Documentation/admin-guide/kernel-parameters.txt +6 −0
  3. drivers/xen/Kconfig +7 −3
  4. drivers/xen/mem-reservation.c +4 −0
  5. drivers/xen/xen-balloon.c +3 −0
  6. include/xen/mem-reservation.h +4 −3
Documentation/ABI/stable/sysfs-devices-system-xen_memory+9−0
@@ -75,3 +75,12 @@ Contact: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> · 74 unmodified lines
7575 Description:
7676 Amount (in KiB) of low (or normal) memory in the
7777 balloon.
78+
79+What: /sys/devices/system/xen_memory/xen_memory0/scrub_pages
80+Date: September 2018
81+KernelVersion: 4.20
82+Contact: xen-devel@lists.xenproject.org
83+Description:
84+ Control scrubbing pages before returning them to Xen for others domains
85+ use. Can be set with xen_scrub_pages cmdline
86+ parameter. Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT.
Documentation/admin-guide/kernel-parameters.txt+6−0
@@ -5000,6 +5000,12 @@ · 4999 unmodified lines
50005000 Disables the PV optimizations forcing the HVM guest to
50015001 run as generic HVM guest with no PV drivers.
50025002
5003+ xen_scrub_pages= [XEN]
5004+ Boolean option to control scrubbing pages before giving them back
5005+ to Xen, for use by other domains. Can be also changed at runtime
5006+ with /sys/devices/system/xen_memory/xen_memory0/scrub_pages.
5007+ Default value controlled with CONFIG_XEN_SCRUB_PAGES_DEFAULT.
5008+
50035009 xirc2ps_cs= [NET,PCMCIA]
50045010 Format:
50055011 <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
drivers/xen/Kconfig+7−3
@@ -79,15 +79,19 @@ config XEN_BALLOON_MEMORY_HOTPLUG_LIMIT · 78 unmodified lines
7979 This value is used to allocate enough space in internal
8080 tables needed for physical memory administration.
8181
82−config XEN_SCRUB_PAGES
83− bool "Scrub pages before returning them to system"
82+config XEN_SCRUB_PAGES_DEFAULT
83+ bool "Scrub pages before returning them to system by default"
8484 depends on XEN_BALLOON
8585 default y
8686 help
8787 Scrub pages before returning them to the system for reuse by
8888 other domains. This makes sure that any confidential data
8989 is not accidentally visible to other domains. Is it more
90− secure, but slightly less efficient.
90+ secure, but slightly less efficient. This can be controlled with
91+ xen_scrub_pages=0 parameter and
92+ /sys/devices/system/xen_memory/xen_memory0/scrub_pages.
93+ This option only sets the default value.
94+
9195 If in doubt, say yes.
9296
9397 config XEN_DEV_EVTCHN
drivers/xen/mem-reservation.c+4−0
@@ -14,6 +14,10 @@ · 13 unmodified lines
1414
1515 #include <xen/interface/memory.h>
1616 #include <xen/mem-reservation.h>
17+#include <linux/moduleparam.h>
18+
19+bool __read_mostly xen_scrub_pages = IS_ENABLED(CONFIG_XEN_SCRUB_PAGES_DEFAULT);
20+core_param(xen_scrub_pages, xen_scrub_pages, bool, 0);
1721
1822 /*
1923 * Use one extent per PAGE_SIZE to avoid to break down the page into
drivers/xen/xen-balloon.c+3−0
@@ -44,6 +44,7 @@ · 43 unmodified lines
4444 #include <xen/xenbus.h>
4545 #include <xen/features.h>
4646 #include <xen/page.h>
47+#include <xen/mem-reservation.h>
4748
4849 #define PAGES2KB(_p) ((_p)<<(PAGE_SHIFT-10))
4950
@@ -137,6 +138,7 @@ static DEVICE_ULONG_ATTR(schedule_delay, 0444, balloon_stats.schedule_delay); · 87 unmodified lines
137138 static DEVICE_ULONG_ATTR(max_schedule_delay, 0644, balloon_stats.max_schedule_delay);
138139 static DEVICE_ULONG_ATTR(retry_count, 0444, balloon_stats.retry_count);
139140 static DEVICE_ULONG_ATTR(max_retry_count, 0644, balloon_stats.max_retry_count);
141+static DEVICE_BOOL_ATTR(scrub_pages, 0644, xen_scrub_pages);
140142
141143 static ssize_t show_target_kb(struct device *dev, struct device_attribute *attr,
142144 char *buf)
@@ -203,6 +205,7 @@ static struct attribute *balloon_attrs[] = { · 60 unmodified lines
203205 &dev_attr_max_schedule_delay.attr.attr,
204206 &dev_attr_retry_count.attr.attr,
205207 &dev_attr_max_retry_count.attr.attr,
208+ &dev_attr_scrub_pages.attr.attr,
206209 NULL
207210 };
208211
include/xen/mem-reservation.h+4−3
@@ -17,11 +17,12 @@ · 16 unmodified lines
1717
1818 #include <xen/page.h>
1919
20+extern bool xen_scrub_pages;
21+
2022 static inline void xenmem_reservation_scrub_page(struct page *page)
2123 {
22−#ifdef CONFIG_XEN_SCRUB_PAGES
23− clear_highpage(page);
24−#endif
24+ if (xen_scrub_pages)
25+ clear_highpage(page);
2526 }
2627
2728 #ifdef CONFIG_XEN_HAVE_PVMMU

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t