[PATCH v3 00/33] linux-user: Improve host and guest page size handling

Richard Henderson posted 33 patches 10 months, 4 weeks ago
Failed in applying to current master (apply log)
Maintainers: Richard Henderson <richard.henderson@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>, Riku Voipio <riku.voipio@iki.fi>, Warner Losh <imp@bsdimp.com>, Kyle Evans <kevans@freebsd.org>, Stefan Berger <stefanb@linux.vnet.ibm.com>, Eduardo Habkost <eduardo@habkost.net>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, "Philippe Mathieu-Daudé" <philmd@linaro.org>, Yanan Wang <wangyanan55@huawei.com>, Laurent Vivier <laurent@vivier.eu>, Peter Xu <peterx@redhat.com>, Fabiano Rosas <farosas@suse.de>, David Hildenbrand <david@redhat.com>, Peter Maydell <peter.maydell@linaro.org>, Nicholas Piggin <npiggin@gmail.com>, Daniel Henrique Barboza <danielhb413@gmail.com>, "Cédric Le Goater" <clg@kaod.org>, "Alex Bennée" <alex.bennee@linaro.org>, Yoshinori Sato <ysato@users.sourceforge.jp>
There is a newer version of this series
docs/about/deprecated.rst                 |   7 +
docs/user/main.rst                        |   3 -
bsd-user/qemu.h                           |   7 +
include/exec/cpu-common.h                 |   7 -
include/hw/core/cpu.h                     |   2 -
target/alpha/cpu-param.h                  |  16 +-
target/arm/cpu-param.h                    |   6 +-
target/ppc/cpu-param.h                    |   9 +-
accel/tcg/translate-all.c                 |   1 -
accel/tcg/user-exec.c                     |  31 +-
bsd-user/main.c                           |  21 +-
cpu-target.c                              |  13 -
hw/tpm/tpm_ppi.c                          |   3 +-
linux-user/elfload.c                      |  67 +-
linux-user/main.c                         |  33 +-
linux-user/mmap.c                         | 714 +++++++++++++---------
migration/ram.c                           |  22 +-
system/physmem.c                          |  17 +-
system/vl.c                               |   1 -
target/arm/cpu.c                          |  51 +-
tests/tcg/multiarch/linux/linux-madvise.c |   2 +
tests/tcg/alpha/Makefile.target           |   3 -
tests/tcg/arm/Makefile.target             |   3 -
tests/tcg/hppa/Makefile.target            |   3 -
tests/tcg/i386/Makefile.target            |   3 -
tests/tcg/m68k/Makefile.target            |   3 -
tests/tcg/multiarch/Makefile.target       |   9 -
tests/tcg/ppc/Makefile.target             |  12 -
tests/tcg/sh4/Makefile.target             |   3 -
tests/tcg/sparc64/Makefile.target         |   6 -
30 files changed, 626 insertions(+), 452 deletions(-)
delete mode 100644 tests/tcg/ppc/Makefile.target
delete mode 100644 tests/tcg/sparc64/Makefile.target
[PATCH v3 00/33] linux-user: Improve host and guest page size handling
Posted by Richard Henderson 10 months, 4 weeks ago
Changes for v3:
  * Rebase.

Blurb from v1:

While working on mmap issues for 8.1, I noticed a lot of corner
cases of host != guest page size that we implement poorly.
This seems to be particularly visible on Apple M1 with 16k pages,
more so than Power with 64k pages for some reason.

Objective 1 is to deprecate and (essentially) disable the -p option.

The effect of -p is apparently confusing, so much so that our own
testsuite misuses it.  One cannot really change the host page size,
and pretending otherwise means that we don't treat the host memory
system correctly, and stuff breaks.

I have not yet done the same work for bsd-user.

Objective 2 is to allow the guest page size to change to match the host.

There are corner cases of host != guest page size will fail in odd ways.
For case of host > guest page size, the issues could be solved with
softmmu, allowing a non-linear mapping between host and guest addresses
and also disconnecting host and guest page permissions.

However, host < guest page has issues with SIGBUS which I believe to be
totally unfixable.  At minimum one would need to monitor changes to all
files mapped in the address space, but I'm sure there is much more.

But as always the best behaviour is obtained when the host and guest
page sizes match -- there are no corner cases to contend with.

There are a set of guests which can be configured to use multiple page
sizes, and therefore software developed for those guests (usually) does
not hard-code a particular page size.  For those, we can allow the
page size to vary and let the guest match the host.

I have only changed aarch64, alpha and ppc guests so far, as those
are both easy to test and, especially for the case of alpha's default
8k page size, prone to failure.


r~


Richard Henderson (33):
  accel/tcg: Remove qemu_host_page_size from page_protect/page_unprotect
  linux-user: Adjust SVr4 NULL page mapping
  linux-user: Remove qemu_host_page_{size,mask} in probe_guest_base
  linux-user: Remove qemu_host_page_size from create_elf_tables
  linux-user/hppa: Simplify init_guest_commpage
  linux-user/nios2: Remove qemu_host_page_size from init_guest_commpage
  linux-user/arm: Remove qemu_host_page_size from init_guest_commpage
  linux-user: Remove qemu_host_page_{size,mask} from mmap.c
  linux-user: Remove REAL_HOST_PAGE_ALIGN from mmap.c
  linux-user: Remove HOST_PAGE_ALIGN from mmap.c
  migration: Remove qemu_host_page_size
  hw/tpm: Remove HOST_PAGE_ALIGN from tpm_ppi_init
  softmmu/physmem: Remove qemu_host_page_size
  softmmu/physmem: Remove HOST_PAGE_ALIGN
  linux-user: Remove qemu_host_page_size from main
  linux-user: Split out target_mmap__locked
  linux-user: Move some mmap checks outside the lock
  linux-user: Fix sub-host-page mmap
  linux-user: Split out mmap_end
  linux-user: Do early mmap placement only for reserved_va
  linux-user: Split out mmap_h_eq_g
  linux-user: Split out mmap_h_lt_g
  linux-user: Split out mmap_h_gt_g
  tests/tcg: Remove run-test-mmap-*
  tests/tcg: Extend file in linux-madvise.c
  *-user: Deprecate and disable -p pagesize
  cpu: Remove page_size_init
  accel/tcg: Disconnect TargetPageDataNode from page size
  linux-user: Allow TARGET_PAGE_BITS_VARY
  target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only
  linux-user: Bound mmap_min_addr by host page size
  target/ppc: Enable TARGET_PAGE_BITS_VARY for user-only
  target/alpha: Enable TARGET_PAGE_BITS_VARY for user-only

 docs/about/deprecated.rst                 |   7 +
 docs/user/main.rst                        |   3 -
 bsd-user/qemu.h                           |   7 +
 include/exec/cpu-common.h                 |   7 -
 include/hw/core/cpu.h                     |   2 -
 target/alpha/cpu-param.h                  |  16 +-
 target/arm/cpu-param.h                    |   6 +-
 target/ppc/cpu-param.h                    |   9 +-
 accel/tcg/translate-all.c                 |   1 -
 accel/tcg/user-exec.c                     |  31 +-
 bsd-user/main.c                           |  21 +-
 cpu-target.c                              |  13 -
 hw/tpm/tpm_ppi.c                          |   3 +-
 linux-user/elfload.c                      |  67 +-
 linux-user/main.c                         |  33 +-
 linux-user/mmap.c                         | 714 +++++++++++++---------
 migration/ram.c                           |  22 +-
 system/physmem.c                          |  17 +-
 system/vl.c                               |   1 -
 target/arm/cpu.c                          |  51 +-
 tests/tcg/multiarch/linux/linux-madvise.c |   2 +
 tests/tcg/alpha/Makefile.target           |   3 -
 tests/tcg/arm/Makefile.target             |   3 -
 tests/tcg/hppa/Makefile.target            |   3 -
 tests/tcg/i386/Makefile.target            |   3 -
 tests/tcg/m68k/Makefile.target            |   3 -
 tests/tcg/multiarch/Makefile.target       |   9 -
 tests/tcg/ppc/Makefile.target             |  12 -
 tests/tcg/sh4/Makefile.target             |   3 -
 tests/tcg/sparc64/Makefile.target         |   6 -
 30 files changed, 626 insertions(+), 452 deletions(-)
 delete mode 100644 tests/tcg/ppc/Makefile.target
 delete mode 100644 tests/tcg/sparc64/Makefile.target

-- 
2.34.1
Re: [PATCH v3 00/33] linux-user: Improve host and guest page size handling
Posted by Philippe Mathieu-Daudé 10 months, 3 weeks ago
Cc'ing Pierrick

On 2/1/24 02:57, Richard Henderson wrote:
> Changes for v3:
>    * Rebase.
> 
> Blurb from v1:
> 
> While working on mmap issues for 8.1, I noticed a lot of corner
> cases of host != guest page size that we implement poorly.
> This seems to be particularly visible on Apple M1 with 16k pages,
> more so than Power with 64k pages for some reason.
> 
> Objective 1 is to deprecate and (essentially) disable the -p option.
> 
> The effect of -p is apparently confusing, so much so that our own
> testsuite misuses it.  One cannot really change the host page size,
> and pretending otherwise means that we don't treat the host memory
> system correctly, and stuff breaks.
> 
> I have not yet done the same work for bsd-user.
> 
> Objective 2 is to allow the guest page size to change to match the host.
> 
> There are corner cases of host != guest page size will fail in odd ways.
> For case of host > guest page size, the issues could be solved with
> softmmu, allowing a non-linear mapping between host and guest addresses
> and also disconnecting host and guest page permissions.
> 
> However, host < guest page has issues with SIGBUS which I believe to be
> totally unfixable.  At minimum one would need to monitor changes to all
> files mapped in the address space, but I'm sure there is much more.
> 
> But as always the best behaviour is obtained when the host and guest
> page sizes match -- there are no corner cases to contend with.
> 
> There are a set of guests which can be configured to use multiple page
> sizes, and therefore software developed for those guests (usually) does
> not hard-code a particular page size.  For those, we can allow the
> page size to vary and let the guest match the host.
> 
> I have only changed aarch64, alpha and ppc guests so far, as those
> are both easy to test and, especially for the case of alpha's default
> 8k page size, prone to failure.
> 
> 
> r~
> 
> 
> Richard Henderson (33):
>    accel/tcg: Remove qemu_host_page_size from page_protect/page_unprotect
>    linux-user: Adjust SVr4 NULL page mapping
>    linux-user: Remove qemu_host_page_{size,mask} in probe_guest_base
>    linux-user: Remove qemu_host_page_size from create_elf_tables
>    linux-user/hppa: Simplify init_guest_commpage
>    linux-user/nios2: Remove qemu_host_page_size from init_guest_commpage
>    linux-user/arm: Remove qemu_host_page_size from init_guest_commpage
>    linux-user: Remove qemu_host_page_{size,mask} from mmap.c
>    linux-user: Remove REAL_HOST_PAGE_ALIGN from mmap.c
>    linux-user: Remove HOST_PAGE_ALIGN from mmap.c
>    migration: Remove qemu_host_page_size
>    hw/tpm: Remove HOST_PAGE_ALIGN from tpm_ppi_init
>    softmmu/physmem: Remove qemu_host_page_size
>    softmmu/physmem: Remove HOST_PAGE_ALIGN
>    linux-user: Remove qemu_host_page_size from main
>    linux-user: Split out target_mmap__locked
>    linux-user: Move some mmap checks outside the lock
>    linux-user: Fix sub-host-page mmap
>    linux-user: Split out mmap_end
>    linux-user: Do early mmap placement only for reserved_va
>    linux-user: Split out mmap_h_eq_g
>    linux-user: Split out mmap_h_lt_g
>    linux-user: Split out mmap_h_gt_g
>    tests/tcg: Remove run-test-mmap-*
>    tests/tcg: Extend file in linux-madvise.c
>    *-user: Deprecate and disable -p pagesize
>    cpu: Remove page_size_init
>    accel/tcg: Disconnect TargetPageDataNode from page size
>    linux-user: Allow TARGET_PAGE_BITS_VARY
>    target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only
>    linux-user: Bound mmap_min_addr by host page size
>    target/ppc: Enable TARGET_PAGE_BITS_VARY for user-only
>    target/alpha: Enable TARGET_PAGE_BITS_VARY for user-only
> 
>   docs/about/deprecated.rst                 |   7 +
>   docs/user/main.rst                        |   3 -
>   bsd-user/qemu.h                           |   7 +
>   include/exec/cpu-common.h                 |   7 -
>   include/hw/core/cpu.h                     |   2 -
>   target/alpha/cpu-param.h                  |  16 +-
>   target/arm/cpu-param.h                    |   6 +-
>   target/ppc/cpu-param.h                    |   9 +-
>   accel/tcg/translate-all.c                 |   1 -
>   accel/tcg/user-exec.c                     |  31 +-
>   bsd-user/main.c                           |  21 +-
>   cpu-target.c                              |  13 -
>   hw/tpm/tpm_ppi.c                          |   3 +-
>   linux-user/elfload.c                      |  67 +-
>   linux-user/main.c                         |  33 +-
>   linux-user/mmap.c                         | 714 +++++++++++++---------
>   migration/ram.c                           |  22 +-
>   system/physmem.c                          |  17 +-
>   system/vl.c                               |   1 -
>   target/arm/cpu.c                          |  51 +-
>   tests/tcg/multiarch/linux/linux-madvise.c |   2 +
>   tests/tcg/alpha/Makefile.target           |   3 -
>   tests/tcg/arm/Makefile.target             |   3 -
>   tests/tcg/hppa/Makefile.target            |   3 -
>   tests/tcg/i386/Makefile.target            |   3 -
>   tests/tcg/m68k/Makefile.target            |   3 -
>   tests/tcg/multiarch/Makefile.target       |   9 -
>   tests/tcg/ppc/Makefile.target             |  12 -
>   tests/tcg/sh4/Makefile.target             |   3 -
>   tests/tcg/sparc64/Makefile.target         |   6 -
>   30 files changed, 626 insertions(+), 452 deletions(-)
>   delete mode 100644 tests/tcg/ppc/Makefile.target
>   delete mode 100644 tests/tcg/sparc64/Makefile.target
>
Re: [PATCH v3 00/33] linux-user: Improve host and guest page size handling
Posted by Helge Deller 10 months, 3 weeks ago
On 1/2/24 02:57, Richard Henderson wrote:
> Changes for v3:
>    * Rebase.
>
> Blurb from v1:
>
> While working on mmap issues for 8.1, I noticed a lot of corner
> cases of host != guest page size that we implement poorly.
> This seems to be particularly visible on Apple M1 with 16k pages,
> more so than Power with 64k pages for some reason.
>
> Objective 1 is to deprecate and (essentially) disable the -p option.
>
> The effect of -p is apparently confusing, so much so that our own
> testsuite misuses it.  One cannot really change the host page size,
> and pretending otherwise means that we don't treat the host memory
> system correctly, and stuff breaks.
>
> I have not yet done the same work for bsd-user.
>
> Objective 2 is to allow the guest page size to change to match the host.
>
> There are corner cases of host != guest page size will fail in odd ways.
> For case of host > guest page size, the issues could be solved with
> softmmu, allowing a non-linear mapping between host and guest addresses
> and also disconnecting host and guest page permissions.
>
> However, host < guest page has issues with SIGBUS which I believe to be
> totally unfixable.  At minimum one would need to monitor changes to all
> files mapped in the address space, but I'm sure there is much more.
>
> But as always the best behaviour is obtained when the host and guest
> page sizes match -- there are no corner cases to contend with.
>
> There are a set of guests which can be configured to use multiple page
> sizes, and therefore software developed for those guests (usually) does
> not hard-code a particular page size.  For those, we can allow the
> page size to vary and let the guest match the host.
>
> I have only changed aarch64, alpha and ppc guests so far, as those
> are both easy to test and, especially for the case of alpha's default
> 8k page size, prone to failure.

I did some basic testing (built, installed, started chroots) for various
targets and did not see any obvious issues.
I did not specifically checked for particular page sizes though.

Anyway, for the series:
Acked-by: Helge Deller <deller@gmx.de>

Helge

>
>
> r~
>
>
> Richard Henderson (33):
>    accel/tcg: Remove qemu_host_page_size from page_protect/page_unprotect
>    linux-user: Adjust SVr4 NULL page mapping
>    linux-user: Remove qemu_host_page_{size,mask} in probe_guest_base
>    linux-user: Remove qemu_host_page_size from create_elf_tables
>    linux-user/hppa: Simplify init_guest_commpage
>    linux-user/nios2: Remove qemu_host_page_size from init_guest_commpage
>    linux-user/arm: Remove qemu_host_page_size from init_guest_commpage
>    linux-user: Remove qemu_host_page_{size,mask} from mmap.c
>    linux-user: Remove REAL_HOST_PAGE_ALIGN from mmap.c
>    linux-user: Remove HOST_PAGE_ALIGN from mmap.c
>    migration: Remove qemu_host_page_size
>    hw/tpm: Remove HOST_PAGE_ALIGN from tpm_ppi_init
>    softmmu/physmem: Remove qemu_host_page_size
>    softmmu/physmem: Remove HOST_PAGE_ALIGN
>    linux-user: Remove qemu_host_page_size from main
>    linux-user: Split out target_mmap__locked
>    linux-user: Move some mmap checks outside the lock
>    linux-user: Fix sub-host-page mmap
>    linux-user: Split out mmap_end
>    linux-user: Do early mmap placement only for reserved_va
>    linux-user: Split out mmap_h_eq_g
>    linux-user: Split out mmap_h_lt_g
>    linux-user: Split out mmap_h_gt_g
>    tests/tcg: Remove run-test-mmap-*
>    tests/tcg: Extend file in linux-madvise.c
>    *-user: Deprecate and disable -p pagesize
>    cpu: Remove page_size_init
>    accel/tcg: Disconnect TargetPageDataNode from page size
>    linux-user: Allow TARGET_PAGE_BITS_VARY
>    target/arm: Enable TARGET_PAGE_BITS_VARY for AArch64 user-only
>    linux-user: Bound mmap_min_addr by host page size
>    target/ppc: Enable TARGET_PAGE_BITS_VARY for user-only
>    target/alpha: Enable TARGET_PAGE_BITS_VARY for user-only
>
>   docs/about/deprecated.rst                 |   7 +
>   docs/user/main.rst                        |   3 -
>   bsd-user/qemu.h                           |   7 +
>   include/exec/cpu-common.h                 |   7 -
>   include/hw/core/cpu.h                     |   2 -
>   target/alpha/cpu-param.h                  |  16 +-
>   target/arm/cpu-param.h                    |   6 +-
>   target/ppc/cpu-param.h                    |   9 +-
>   accel/tcg/translate-all.c                 |   1 -
>   accel/tcg/user-exec.c                     |  31 +-
>   bsd-user/main.c                           |  21 +-
>   cpu-target.c                              |  13 -
>   hw/tpm/tpm_ppi.c                          |   3 +-
>   linux-user/elfload.c                      |  67 +-
>   linux-user/main.c                         |  33 +-
>   linux-user/mmap.c                         | 714 +++++++++++++---------
>   migration/ram.c                           |  22 +-
>   system/physmem.c                          |  17 +-
>   system/vl.c                               |   1 -
>   target/arm/cpu.c                          |  51 +-
>   tests/tcg/multiarch/linux/linux-madvise.c |   2 +
>   tests/tcg/alpha/Makefile.target           |   3 -
>   tests/tcg/arm/Makefile.target             |   3 -
>   tests/tcg/hppa/Makefile.target            |   3 -
>   tests/tcg/i386/Makefile.target            |   3 -
>   tests/tcg/m68k/Makefile.target            |   3 -
>   tests/tcg/multiarch/Makefile.target       |   9 -
>   tests/tcg/ppc/Makefile.target             |  12 -
>   tests/tcg/sh4/Makefile.target             |   3 -
>   tests/tcg/sparc64/Makefile.target         |   6 -
>   30 files changed, 626 insertions(+), 452 deletions(-)
>   delete mode 100644 tests/tcg/ppc/Makefile.target
>   delete mode 100644 tests/tcg/sparc64/Makefile.target
>