Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1607028 > unrolled thread
| Started by | Dan Streetman <dan.streetman@canonical.com> |
|---|---|
| First post | 2017-03-22 22:20 +0100 |
| Last post | 2017-03-25 02:40 +0100 |
| Articles | 8 — 4 participants |
Back to article view | Back to linux.kernel
maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Dan Streetman <dan.streetman@canonical.com> - 2017-03-22 22:20 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Boris Ostrovsky <boris.ostrovsky@oracle.com> - 2017-03-23 03:20 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Juergen Gross <jgross@suse.com> - 2017-03-23 09:00 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Dan Streetman <dan.streetman@canonical.com> - 2017-03-24 21:40 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Dan Streetman <dan.streetman@canonical.com> - 2017-03-24 21:40 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> - 2017-03-24 22:20 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Dan Streetman <dan.streetman@canonical.com> - 2017-03-24 22:30 +0100
Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" Boris Ostrovsky <boris.ostrovsky@oracle.com> - 2017-03-25 02:40 +0100
| From | Dan Streetman <dan.streetman@canonical.com> |
|---|---|
| Date | 2017-03-22 22:20 +0100 |
| Subject | maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <tnVPI-nl-15@gated-at.bofh.it> |
I have a question about a problem introduced by this commit: c275a57f5ec3056f732843b11659d892235faff7 "xen/balloon: Set balloon's initial state to number of existing RAM pages" It changed the xen balloon current_pages calculation to start with the number of physical pages in the system, instead of max_pfn. Since get_num_physpages() does not include holes, it's always less than the e820 map's max_pfn. However, the problem that commit introduced is, if the hypervisor sets the balloon target to equal to the e820 map's max_pfn, then the balloon target will *always* be higher than the initial current pages. Even if the hypervisor sets the target to (e820 max_pfn - holes), if the OS adds any holes, the balloon target will be higher than the current pages. This is the situation, for example, for Amazon AWS instances. The result is, the xen balloon will always immediately hotplug some memory at boot, but then make only (max_pfn - get_num_physpages()) available to the system. This balloon-hotplugged memory can cause problems, if the hypervisor wasn't expecting it; specifically, the system's physical page addresses now will exceed the e820 map's max_pfn, due to the balloon-hotplugged pages; if the hypervisor isn't expecting pt-device DMA to/from those physical pages above the e820 max_pfn, it causes problems. For example: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 The additional small amount of balloon memory can cause other problems as well, for example: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 Anyway, I'd like to ask, was the original commit added because hypervisors are supposed to set their balloon target to the guest system's number of phys pages (max_pfn - holes)? The mailing list discussion and commit description seem to indicate that. However I'm not sure how that is possible, because the kernel reserves its own holes, regardless of any predefined holes in the e820 map; for example, the kernel reserves 64k (by default) at phys addr 0 (the amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So the hypervisor really has no way to know what the "right" target to specify is; unless it knows the exact guest OS and kernel version, and kernel config values, it will never be able to correctly specify its target to be exactly (e820 max_pfn - all holes). Should this commit be reverted? Should the xen balloon target be adjusted based on kernel-added e820 holes? Should something else be done? For context, Amazon Linux has simply disabled Xen ballooning completely. Likewise, we're planning to disable Xen ballooning in the Ubuntu kernel for Amazon AWS-specific kernels (but not for non-AWS Ubuntu kernels). However, if reverting this patch makes sense in a bigger context (i.e. Xen users besides AWS), that would allow more Ubuntu kernels to work correctly in AWS instances.
[toc] | [next] | [standalone]
| From | Boris Ostrovsky <boris.ostrovsky@oracle.com> |
|---|---|
| Date | 2017-03-23 03:20 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <to0w1-3Qh-17@gated-at.bofh.it> |
| In reply to | #1607028 |
On 03/22/2017 05:16 PM, Dan Streetman wrote: > I have a question about a problem introduced by this commit: > c275a57f5ec3056f732843b11659d892235faff7 > "xen/balloon: Set balloon's initial state to number of existing RAM pages" > > It changed the xen balloon current_pages calculation to start with the > number of physical pages in the system, instead of max_pfn. Since > get_num_physpages() does not include holes, it's always less than the > e820 map's max_pfn. > > However, the problem that commit introduced is, if the hypervisor sets > the balloon target to equal to the e820 map's max_pfn, then the > balloon target will *always* be higher than the initial current pages. > Even if the hypervisor sets the target to (e820 max_pfn - holes), if > the OS adds any holes, the balloon target will be higher than the > current pages. This is the situation, for example, for Amazon AWS > instances. The result is, the xen balloon will always immediately > hotplug some memory at boot, but then make only (max_pfn - > get_num_physpages()) available to the system. > > This balloon-hotplugged memory can cause problems, if the hypervisor > wasn't expecting it; specifically, the system's physical page > addresses now will exceed the e820 map's max_pfn, due to the > balloon-hotplugged pages; if the hypervisor isn't expecting pt-device > DMA to/from those physical pages above the e820 max_pfn, it causes > problems. For example: > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 > > The additional small amount of balloon memory can cause other problems > as well, for example: > https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 > > Anyway, I'd like to ask, was the original commit added because > hypervisors are supposed to set their balloon target to the guest > system's number of phys pages (max_pfn - holes)? The mailing list > discussion and commit description seem to indicate that. IIRC the problem that this was trying to fix was that since max_pfn includes holes, upon booting we'd immediately balloon down by the (typically, MMIO) hole size. If you boot a guest with ~4+GB memory you should see this. > However I'm > not sure how that is possible, because the kernel reserves its own > holes, regardless of any predefined holes in the e820 map; for > example, the kernel reserves 64k (by default) at phys addr 0 (the > amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So > the hypervisor really has no way to know what the "right" target to > specify is; unless it knows the exact guest OS and kernel version, and > kernel config values, it will never be able to correctly specify its > target to be exactly (e820 max_pfn - all holes). > > Should this commit be reverted? Should the xen balloon target be > adjusted based on kernel-added e820 holes? I think the second one but shouldn't current_pages be updated, and not the target? The latter is set by Xen (toolstack, via xenstore usually). Also, the bugs above (at least one of them) talk about NVMe and I wonder whether the memory that they add is of RAM type --- I believe it has its own type and so perhaps that introduces additional inconsistencies. AWS may have added their own support for that, which we don't have upstream yet. -boris > Should something else be > done? > > For context, Amazon Linux has simply disabled Xen ballooning > completely. Likewise, we're planning to disable Xen ballooning in the > Ubuntu kernel for Amazon AWS-specific kernels (but not for non-AWS > Ubuntu kernels). However, if reverting this patch makes sense in a > bigger context (i.e. Xen users besides AWS), that would allow more > Ubuntu kernels to work correctly in AWS instances. >
[toc] | [prev] | [next] | [standalone]
| From | Juergen Gross <jgross@suse.com> |
|---|---|
| Date | 2017-03-23 09:00 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <to5P4-7B0-15@gated-at.bofh.it> |
| In reply to | #1607128 |
On 23/03/17 03:13, Boris Ostrovsky wrote: > > > On 03/22/2017 05:16 PM, Dan Streetman wrote: >> I have a question about a problem introduced by this commit: >> c275a57f5ec3056f732843b11659d892235faff7 >> "xen/balloon: Set balloon's initial state to number of existing RAM >> pages" >> >> It changed the xen balloon current_pages calculation to start with the >> number of physical pages in the system, instead of max_pfn. Since >> get_num_physpages() does not include holes, it's always less than the >> e820 map's max_pfn. >> >> However, the problem that commit introduced is, if the hypervisor sets >> the balloon target to equal to the e820 map's max_pfn, then the >> balloon target will *always* be higher than the initial current pages. >> Even if the hypervisor sets the target to (e820 max_pfn - holes), if >> the OS adds any holes, the balloon target will be higher than the >> current pages. This is the situation, for example, for Amazon AWS >> instances. The result is, the xen balloon will always immediately >> hotplug some memory at boot, but then make only (max_pfn - >> get_num_physpages()) available to the system. >> >> This balloon-hotplugged memory can cause problems, if the hypervisor >> wasn't expecting it; specifically, the system's physical page >> addresses now will exceed the e820 map's max_pfn, due to the >> balloon-hotplugged pages; if the hypervisor isn't expecting pt-device >> DMA to/from those physical pages above the e820 max_pfn, it causes >> problems. For example: >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 >> >> The additional small amount of balloon memory can cause other problems >> as well, for example: >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 >> >> Anyway, I'd like to ask, was the original commit added because >> hypervisors are supposed to set their balloon target to the guest >> system's number of phys pages (max_pfn - holes)? The mailing list >> discussion and commit description seem to indicate that. > > > IIRC the problem that this was trying to fix was that since max_pfn > includes holes, upon booting we'd immediately balloon down by the > (typically, MMIO) hole size. > > If you boot a guest with ~4+GB memory you should see this. > > >> However I'm >> not sure how that is possible, because the kernel reserves its own >> holes, regardless of any predefined holes in the e820 map; for >> example, the kernel reserves 64k (by default) at phys addr 0 (the >> amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So >> the hypervisor really has no way to know what the "right" target to >> specify is; unless it knows the exact guest OS and kernel version, and >> kernel config values, it will never be able to correctly specify its >> target to be exactly (e820 max_pfn - all holes). >> >> Should this commit be reverted? Should the xen balloon target be >> adjusted based on kernel-added e820 holes? > > I think the second one but shouldn't current_pages be updated, and not > the target? The latter is set by Xen (toolstack, via xenstore usually). Right. Looking into a HVM domU I can't see any problem related to CONFIG_X86_RESERVE_LOW: it is set to 64 on my system. The domU is configured with 2048 MB of RAM, 8MB being video RAM. Looking into /sys/devices/system/xen_memory/xen_memory0 I can see the current size and target size do match: both are 2088960 kB (2 GB - 8 MB). Ballooning down and up to 2048 MB again doesn't change the picture. So which additional holes are added by the kernel on AWS via which functions? Juergen
[toc] | [prev] | [next] | [standalone]
| From | Dan Streetman <dan.streetman@canonical.com> |
|---|---|
| Date | 2017-03-24 21:40 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <toEa5-6Td-19@gated-at.bofh.it> |
| In reply to | #1607220 |
On Thu, Mar 23, 2017 at 3:56 AM, Juergen Gross <jgross@suse.com> wrote:
> On 23/03/17 03:13, Boris Ostrovsky wrote:
>>
>>
>> On 03/22/2017 05:16 PM, Dan Streetman wrote:
>>> I have a question about a problem introduced by this commit:
>>> c275a57f5ec3056f732843b11659d892235faff7
>>> "xen/balloon: Set balloon's initial state to number of existing RAM
>>> pages"
>>>
>>> It changed the xen balloon current_pages calculation to start with the
>>> number of physical pages in the system, instead of max_pfn. Since
>>> get_num_physpages() does not include holes, it's always less than the
>>> e820 map's max_pfn.
>>>
>>> However, the problem that commit introduced is, if the hypervisor sets
>>> the balloon target to equal to the e820 map's max_pfn, then the
>>> balloon target will *always* be higher than the initial current pages.
>>> Even if the hypervisor sets the target to (e820 max_pfn - holes), if
>>> the OS adds any holes, the balloon target will be higher than the
>>> current pages. This is the situation, for example, for Amazon AWS
>>> instances. The result is, the xen balloon will always immediately
>>> hotplug some memory at boot, but then make only (max_pfn -
>>> get_num_physpages()) available to the system.
>>>
>>> This balloon-hotplugged memory can cause problems, if the hypervisor
>>> wasn't expecting it; specifically, the system's physical page
>>> addresses now will exceed the e820 map's max_pfn, due to the
>>> balloon-hotplugged pages; if the hypervisor isn't expecting pt-device
>>> DMA to/from those physical pages above the e820 max_pfn, it causes
>>> problems. For example:
>>> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129
>>>
>>> The additional small amount of balloon memory can cause other problems
>>> as well, for example:
>>> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457
>>>
>>> Anyway, I'd like to ask, was the original commit added because
>>> hypervisors are supposed to set their balloon target to the guest
>>> system's number of phys pages (max_pfn - holes)? The mailing list
>>> discussion and commit description seem to indicate that.
>>
>>
>> IIRC the problem that this was trying to fix was that since max_pfn
>> includes holes, upon booting we'd immediately balloon down by the
>> (typically, MMIO) hole size.
>>
>> If you boot a guest with ~4+GB memory you should see this.
>>
>>
>>> However I'm
>>> not sure how that is possible, because the kernel reserves its own
>>> holes, regardless of any predefined holes in the e820 map; for
>>> example, the kernel reserves 64k (by default) at phys addr 0 (the
>>> amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So
>>> the hypervisor really has no way to know what the "right" target to
>>> specify is; unless it knows the exact guest OS and kernel version, and
>>> kernel config values, it will never be able to correctly specify its
>>> target to be exactly (e820 max_pfn - all holes).
>>>
>>> Should this commit be reverted? Should the xen balloon target be
>>> adjusted based on kernel-added e820 holes?
>>
>> I think the second one but shouldn't current_pages be updated, and not
>> the target? The latter is set by Xen (toolstack, via xenstore usually).
>
> Right.
>
> Looking into a HVM domU I can't see any problem related to
> CONFIG_X86_RESERVE_LOW: it is set to 64 on my system. The domU is
sorry I brought that up; I was only giving an example. It's not
directly relevant to this and may have distracted from the actual
problem; in fact on closer inspection, the X86_RESERVE_LOW is using
memblock_reserve(), which removes it from managed memory but not the
e820 map (and thus doesn't remove it from get_num_physpages()). Only
phys page 0 is actually reserved in the e820 map.
> configured with 2048 MB of RAM, 8MB being video RAM. Looking into
> /sys/devices/system/xen_memory/xen_memory0 I can see the current
> size and target size do match: both are 2088960 kB (2 GB - 8 MB).
>
> Ballooning down and up to 2048 MB again doesn't change the picture.
>
> So which additional holes are added by the kernel on AWS via which
> functions?
I'll use two AWS types as examples, t2.micro (1G mem) and t2.large (8G mem).
In the micro, the results of ballooning are obvious, because the
hotplugged memory always goes into the Normal zone; but since the base
memory is only 1g, it's contained entirely in the DMA32/DMA zones. So
we get:
$ grep -E '(start_pfn|present|spanned|managed)' /proc/zoneinfo
spanned 4095
present 3997
managed 3976
start_pfn: 1
spanned 258048
present 258048
managed 249606
start_pfn: 4096
spanned 32768
present 32768
managed 11
start_pfn: 262144
As you can see, none of the e820 memory went into the Normal zone; the
balloon driver hotpluged 128m (32k pages), but only made 11 pages
available. Having a memory zone with only 11 pages really screwed
with kswapd, since the zone's memory watermarks were all 0. That was
the second bug I referenced in my initial email.
Anyway, if we look at the large instance, you don't really notice the
additional balloon memory:
$ grep -E '(start_pfn|present|spanned|managed)' /proc/zoneinfo
spanned 4095
present 3997
managed 3976
start_pfn: 1
spanned 1044480
present 978944
managed 958778
start_pfn: 4096
spanned 1146880
present 1146880
managed 1080666
start_pfn: 1048576
but, doing the actual math shows the problem:
$ printf "%x\n" $[ 1048576 + 1146880 ]
218000
$ printf "%x\n" $[ 1048576 + 1080666 ]
207d5a
$ dmesg|grep e820
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009dfff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009e000-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x00000000efffffff] usable
[ 0.000000] BIOS-e820: [mem 0x00000000fc000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000100000000-0x000000020fffffff] usable
[ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
[ 0.000000] e820: remove [mem 0x000a0000-0x000fffff] usable
[ 0.000000] e820: last_pfn = 0x210000 max_arch_pfn = 0x400000000
[ 0.000000] e820: last_pfn = 0xf0000 max_arch_pfn = 0x400000000
[ 0.000000] e820: [mem 0xf0000000-0xfbffffff] available for PCI devices
[ 0.595083] e820: reserve RAM buffer [mem 0x0009e000-0x0009ffff]
so, we can see the balloon driver hotplugged those extra 0x8000 pages,
and made some of them available.
The target has been set to:
$ printf "%x\n" $( cat /sys/devices/system/xen_memory/xen_memory0/target )
200000000
while the e820 map provides:
$ printf "%x\n" $[ 0x210000000 - 0x100000000 + 0xf0000000 - 0x100000 +
0x9e000 - 0x1000 ]
1fff9d000
and current memory is:
/sys/devices/system/xen_memory/xen_memory0$ printf "%x\n" $[ $( cat
info/current_kb ) * 1024 ]
1fffa8000
so the balloon driver has added...
$ echo $[ ( 0x1fffa8000 - 0x1fff9d000 ) / 4096 ]
11
exactly 11 pages, just like the micro instance type. I'm not sure
where the balloon driver gets that 11 page calculation, nor am I sure
why the current_kb is actually less than the balloon target.
[toc] | [prev] | [next] | [standalone]
| From | Dan Streetman <dan.streetman@canonical.com> |
|---|---|
| Date | 2017-03-24 21:40 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <toEa5-6Td-13@gated-at.bofh.it> |
| In reply to | #1607128 |
On Wed, Mar 22, 2017 at 10:13 PM, Boris Ostrovsky <boris.ostrovsky@oracle.com> wrote: > > > On 03/22/2017 05:16 PM, Dan Streetman wrote: >> >> I have a question about a problem introduced by this commit: >> c275a57f5ec3056f732843b11659d892235faff7 >> "xen/balloon: Set balloon's initial state to number of existing RAM pages" >> >> It changed the xen balloon current_pages calculation to start with the >> number of physical pages in the system, instead of max_pfn. Since >> get_num_physpages() does not include holes, it's always less than the >> e820 map's max_pfn. >> >> However, the problem that commit introduced is, if the hypervisor sets >> the balloon target to equal to the e820 map's max_pfn, then the >> balloon target will *always* be higher than the initial current pages. >> Even if the hypervisor sets the target to (e820 max_pfn - holes), if >> the OS adds any holes, the balloon target will be higher than the >> current pages. This is the situation, for example, for Amazon AWS >> instances. The result is, the xen balloon will always immediately >> hotplug some memory at boot, but then make only (max_pfn - >> get_num_physpages()) available to the system. >> >> This balloon-hotplugged memory can cause problems, if the hypervisor >> wasn't expecting it; specifically, the system's physical page >> addresses now will exceed the e820 map's max_pfn, due to the >> balloon-hotplugged pages; if the hypervisor isn't expecting pt-device >> DMA to/from those physical pages above the e820 max_pfn, it causes >> problems. For example: >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 >> >> The additional small amount of balloon memory can cause other problems >> as well, for example: >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 >> >> Anyway, I'd like to ask, was the original commit added because >> hypervisors are supposed to set their balloon target to the guest >> system's number of phys pages (max_pfn - holes)? The mailing list >> discussion and commit description seem to indicate that. > > > > IIRC the problem that this was trying to fix was that since max_pfn includes > holes, upon booting we'd immediately balloon down by the (typically, MMIO) > hole size. > > If you boot a guest with ~4+GB memory you should see this. > > >> However I'm >> not sure how that is possible, because the kernel reserves its own >> holes, regardless of any predefined holes in the e820 map; for >> example, the kernel reserves 64k (by default) at phys addr 0 (the >> amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So >> the hypervisor really has no way to know what the "right" target to >> specify is; unless it knows the exact guest OS and kernel version, and >> kernel config values, it will never be able to correctly specify its >> target to be exactly (e820 max_pfn - all holes). >> >> Should this commit be reverted? Should the xen balloon target be >> adjusted based on kernel-added e820 holes? > > > I think the second one but shouldn't current_pages be updated, and not the > target? The latter is set by Xen (toolstack, via xenstore usually). > > Also, the bugs above (at least one of them) talk about NVMe and I wonder > whether the memory that they add is of RAM type --- I believe it has its own > type and so perhaps that introduces additional inconsistencies. AWS may have > added their own support for that, which we don't have upstream yet. The type of memory doesn't have anything to do with it. The problem with NVMe is it's a passthrough device, so the guest talks directly to the NVMe controller and does DMA with it. But the hypervisor does swiotlb translation between the guest physical memory, and the host physical memory, so that the NVMe device can correctly DMA to the right memory in the host. However, the hypervisor only has the guest's physical memory up to the max e820 pfn mapped; it didn't expect the balloon driver to hotplug any additional memory above the e820 max pfn, so when the NVMe driver in the guest tries to tell the NVMe controller to DMA to that balloon-hotplugged memory, the hypervisor fails the NVMe request, because it can't do the guest-to-host phys mem mapping, since the guest phys address is outside the expected max range. > > -boris > > > >> Should something else be >> done? >> >> For context, Amazon Linux has simply disabled Xen ballooning >> completely. Likewise, we're planning to disable Xen ballooning in the >> Ubuntu kernel for Amazon AWS-specific kernels (but not for non-AWS >> Ubuntu kernels). However, if reverting this patch makes sense in a >> bigger context (i.e. Xen users besides AWS), that would allow more >> Ubuntu kernels to work correctly in AWS instances. >> >
[toc] | [prev] | [next] | [standalone]
| From | Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
|---|---|
| Date | 2017-03-24 22:20 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <toEMN-7q1-15@gated-at.bofh.it> |
| In reply to | #1608959 |
On Fri, Mar 24, 2017 at 04:34:23PM -0400, Dan Streetman wrote: > On Wed, Mar 22, 2017 at 10:13 PM, Boris Ostrovsky > <boris.ostrovsky@oracle.com> wrote: > > > > > > On 03/22/2017 05:16 PM, Dan Streetman wrote: > >> > >> I have a question about a problem introduced by this commit: > >> c275a57f5ec3056f732843b11659d892235faff7 > >> "xen/balloon: Set balloon's initial state to number of existing RAM pages" > >> > >> It changed the xen balloon current_pages calculation to start with the > >> number of physical pages in the system, instead of max_pfn. Since > >> get_num_physpages() does not include holes, it's always less than the > >> e820 map's max_pfn. > >> > >> However, the problem that commit introduced is, if the hypervisor sets > >> the balloon target to equal to the e820 map's max_pfn, then the > >> balloon target will *always* be higher than the initial current pages. > >> Even if the hypervisor sets the target to (e820 max_pfn - holes), if > >> the OS adds any holes, the balloon target will be higher than the > >> current pages. This is the situation, for example, for Amazon AWS > >> instances. The result is, the xen balloon will always immediately > >> hotplug some memory at boot, but then make only (max_pfn - > >> get_num_physpages()) available to the system. > >> > >> This balloon-hotplugged memory can cause problems, if the hypervisor > >> wasn't expecting it; specifically, the system's physical page > >> addresses now will exceed the e820 map's max_pfn, due to the > >> balloon-hotplugged pages; if the hypervisor isn't expecting pt-device > >> DMA to/from those physical pages above the e820 max_pfn, it causes > >> problems. For example: > >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 > >> > >> The additional small amount of balloon memory can cause other problems > >> as well, for example: > >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 > >> > >> Anyway, I'd like to ask, was the original commit added because > >> hypervisors are supposed to set their balloon target to the guest > >> system's number of phys pages (max_pfn - holes)? The mailing list > >> discussion and commit description seem to indicate that. > > > > > > > > IIRC the problem that this was trying to fix was that since max_pfn includes > > holes, upon booting we'd immediately balloon down by the (typically, MMIO) > > hole size. > > > > If you boot a guest with ~4+GB memory you should see this. > > > > > >> However I'm > >> not sure how that is possible, because the kernel reserves its own > >> holes, regardless of any predefined holes in the e820 map; for > >> example, the kernel reserves 64k (by default) at phys addr 0 (the > >> amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So > >> the hypervisor really has no way to know what the "right" target to > >> specify is; unless it knows the exact guest OS and kernel version, and > >> kernel config values, it will never be able to correctly specify its > >> target to be exactly (e820 max_pfn - all holes). > >> > >> Should this commit be reverted? Should the xen balloon target be > >> adjusted based on kernel-added e820 holes? > > > > > > I think the second one but shouldn't current_pages be updated, and not the > > target? The latter is set by Xen (toolstack, via xenstore usually). > > > > Also, the bugs above (at least one of them) talk about NVMe and I wonder > > whether the memory that they add is of RAM type --- I believe it has its own > > type and so perhaps that introduces additional inconsistencies. AWS may have > > added their own support for that, which we don't have upstream yet. > > The type of memory doesn't have anything to do with it. > > The problem with NVMe is it's a passthrough device, so the guest talks > directly to the NVMe controller and does DMA with it. But the > hypervisor does swiotlb translation between the guest physical memory, Um, the hypervisor does not have SWIOTLB support, only IOMMU support. > and the host physical memory, so that the NVMe device can correctly > DMA to the right memory in the host. > > However, the hypervisor only has the guest's physical memory up to the > max e820 pfn mapped; it didn't expect the balloon driver to hotplug > any additional memory above the e820 max pfn, so when the NVMe driver > in the guest tries to tell the NVMe controller to DMA to that > balloon-hotplugged memory, the hypervisor fails the NVMe request, But when the memory hotplug happens the hypercalls are done to raise the max pfn. > because it can't do the guest-to-host phys mem mapping, since the > guest phys address is outside the expected max range. > > > > > > > -boris > > > > > > > >> Should something else be > >> done? > >> > >> For context, Amazon Linux has simply disabled Xen ballooning > >> completely. Likewise, we're planning to disable Xen ballooning in the > >> Ubuntu kernel for Amazon AWS-specific kernels (but not for non-AWS > >> Ubuntu kernels). However, if reverting this patch makes sense in a > >> bigger context (i.e. Xen users besides AWS), that would allow more > >> Ubuntu kernels to work correctly in AWS instances. > >> > >
[toc] | [prev] | [next] | [standalone]
| From | Dan Streetman <dan.streetman@canonical.com> |
|---|---|
| Date | 2017-03-24 22:30 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <toEWt-7xX-5@gated-at.bofh.it> |
| In reply to | #1608977 |
On Fri, Mar 24, 2017 at 5:10 PM, Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> wrote: > On Fri, Mar 24, 2017 at 04:34:23PM -0400, Dan Streetman wrote: >> On Wed, Mar 22, 2017 at 10:13 PM, Boris Ostrovsky >> <boris.ostrovsky@oracle.com> wrote: >> > >> > >> > On 03/22/2017 05:16 PM, Dan Streetman wrote: >> >> >> >> I have a question about a problem introduced by this commit: >> >> c275a57f5ec3056f732843b11659d892235faff7 >> >> "xen/balloon: Set balloon's initial state to number of existing RAM pages" >> >> >> >> It changed the xen balloon current_pages calculation to start with the >> >> number of physical pages in the system, instead of max_pfn. Since >> >> get_num_physpages() does not include holes, it's always less than the >> >> e820 map's max_pfn. >> >> >> >> However, the problem that commit introduced is, if the hypervisor sets >> >> the balloon target to equal to the e820 map's max_pfn, then the >> >> balloon target will *always* be higher than the initial current pages. >> >> Even if the hypervisor sets the target to (e820 max_pfn - holes), if >> >> the OS adds any holes, the balloon target will be higher than the >> >> current pages. This is the situation, for example, for Amazon AWS >> >> instances. The result is, the xen balloon will always immediately >> >> hotplug some memory at boot, but then make only (max_pfn - >> >> get_num_physpages()) available to the system. >> >> >> >> This balloon-hotplugged memory can cause problems, if the hypervisor >> >> wasn't expecting it; specifically, the system's physical page >> >> addresses now will exceed the e820 map's max_pfn, due to the >> >> balloon-hotplugged pages; if the hypervisor isn't expecting pt-device >> >> DMA to/from those physical pages above the e820 max_pfn, it causes >> >> problems. For example: >> >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1668129 >> >> >> >> The additional small amount of balloon memory can cause other problems >> >> as well, for example: >> >> https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1518457 >> >> >> >> Anyway, I'd like to ask, was the original commit added because >> >> hypervisors are supposed to set their balloon target to the guest >> >> system's number of phys pages (max_pfn - holes)? The mailing list >> >> discussion and commit description seem to indicate that. >> > >> > >> > >> > IIRC the problem that this was trying to fix was that since max_pfn includes >> > holes, upon booting we'd immediately balloon down by the (typically, MMIO) >> > hole size. >> > >> > If you boot a guest with ~4+GB memory you should see this. >> > >> > >> >> However I'm >> >> not sure how that is possible, because the kernel reserves its own >> >> holes, regardless of any predefined holes in the e820 map; for >> >> example, the kernel reserves 64k (by default) at phys addr 0 (the >> >> amount of reservation is configurable via CONFIG_X86_RESERVE_LOW). So >> >> the hypervisor really has no way to know what the "right" target to >> >> specify is; unless it knows the exact guest OS and kernel version, and >> >> kernel config values, it will never be able to correctly specify its >> >> target to be exactly (e820 max_pfn - all holes). >> >> >> >> Should this commit be reverted? Should the xen balloon target be >> >> adjusted based on kernel-added e820 holes? >> > >> > >> > I think the second one but shouldn't current_pages be updated, and not the >> > target? The latter is set by Xen (toolstack, via xenstore usually). >> > >> > Also, the bugs above (at least one of them) talk about NVMe and I wonder >> > whether the memory that they add is of RAM type --- I believe it has its own >> > type and so perhaps that introduces additional inconsistencies. AWS may have >> > added their own support for that, which we don't have upstream yet. >> >> The type of memory doesn't have anything to do with it. >> >> The problem with NVMe is it's a passthrough device, so the guest talks >> directly to the NVMe controller and does DMA with it. But the >> hypervisor does swiotlb translation between the guest physical memory, > > Um, the hypervisor does not have SWIOTLB support, only IOMMU support. heh, well I have no special insight into Amazon's hypervisor, so I have no idea what underlying memory remapping mechanism it uses :) > >> and the host physical memory, so that the NVMe device can correctly >> DMA to the right memory in the host. >> >> However, the hypervisor only has the guest's physical memory up to the >> max e820 pfn mapped; it didn't expect the balloon driver to hotplug >> any additional memory above the e820 max pfn, so when the NVMe driver >> in the guest tries to tell the NVMe controller to DMA to that >> balloon-hotplugged memory, the hypervisor fails the NVMe request, > > But when the memory hotplug happens the hypercalls are done to > raise the max pfn. well...all I can say is it rejects DMA above the e820 range. so this very well may be a hypervisor bug, where it should add the balloon memory region to whatever does the NVMe passthrough device iommu mapping. I think we can all agree that the *ideal* situation would be, for the balloon driver to not immediately hotplug memory so it can add 11 more pages, so maybe I just need to figure out why the balloon driver thinks it needs 11 more pages, and fix that. > >> because it can't do the guest-to-host phys mem mapping, since the >> guest phys address is outside the expected max range. >> >> >> >> > >> > -boris >> > >> > >> > >> >> Should something else be >> >> done? >> >> >> >> For context, Amazon Linux has simply disabled Xen ballooning >> >> completely. Likewise, we're planning to disable Xen ballooning in the >> >> Ubuntu kernel for Amazon AWS-specific kernels (but not for non-AWS >> >> Ubuntu kernels). However, if reverting this patch makes sense in a >> >> bigger context (i.e. Xen users besides AWS), that would allow more >> >> Ubuntu kernels to work correctly in AWS instances. >> >> >> >
[toc] | [prev] | [next] | [standalone]
| From | Boris Ostrovsky <boris.ostrovsky@oracle.com> |
|---|---|
| Date | 2017-03-25 02:40 +0100 |
| Subject | Re: maybe revert commit c275a57f5ec3 "xen/balloon: Set balloon's initial state to number of existing RAM pages" |
| Message-ID | <toIQp-1P9-1@gated-at.bofh.it> |
| In reply to | #1608982 |
> > I think we can all agree that the *ideal* situation would be, for the > balloon driver to not immediately hotplug memory so it can add 11 more > pages, so maybe I just need to figure out why the balloon driver > thinks it needs 11 more pages, and fix that. How does the new memory appear in the guest? Via online_pages()? Or is ballooning triggered from watch_target()? -boris
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web