From: Jan Kiszka <jan.kiszka@siemens.com>
To: Christian Borntraeger <borntraeger@de.ibm.com>
Cc: "jfrei@de.ibm.com" <jfrei@de.ibm.com>,
"graalfs@linux.vnet.ibm.com" <graalfs@linux.vnet.ibm.com>,
"agraf@suse.de" <agraf@suse.de>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
Jens Freimann <jfrei@linux.vnet.ibm.com>,
"cornelia.huck@de.ibm.com" <cornelia.huck@de.ibm.com>
Subject: Re: [Qemu-devel] [PATCH v3] s390: autodetect map private
Date: Fri, 15 Jun 2012 19:01:54 +0200 [thread overview]
Message-ID: <4FDB6A82.4090702@siemens.com> (raw)
In-Reply-To: <1339773030-1317-2-git-send-email-borntraeger@de.ibm.com>
On 2012-06-15 17:10, Christian Borntraeger wrote:
> By default qemu will use MAP_PRIVATE for guest pages. This will write
> protect pages and thus break on s390 systems that dont support this feature.
> Therefore qemu has a hack to always use MAP_SHARED for s390. But MAP_SHARED
> has other problems (no dirty pages tracking, a lot more swap overhead etc.)
> Newer systems allow the distinction via KVM_CAP_S390_COW. With this feature
> qemu can use the standard qemu alloc if available, otherwise it will use
> the old s390 hack.
>
> Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
> Signed-off-by: Jens Freimann <jfrei@linux.vnet.ibm.com>
> ---
> exec.c | 18 +++---------------
> kvm-all.c | 13 +++++++++++++
> kvm.h | 2 ++
> oslib-posix.c | 3 +++
> target-s390x/kvm.c | 35 +++++++++++++++++++++++++++++++++++
> 5 files changed, 56 insertions(+), 15 deletions(-)
>
> diff --git a/exec.c b/exec.c
> index 5c9b762..584a484 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -2647,26 +2647,14 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
> exit(1);
> #endif
> } else {
> -#if defined(TARGET_S390X) && defined(CONFIG_KVM)
> - /* S390 KVM requires the topmost vma of the RAM to be smaller than
> - an system defined value, which is at least 256GB. Larger systems
> - have larger values. We put the guest between the end of data
> - segment (system break) and this value. We use 32GB as a base to
> - have enough room for the system break to grow. */
> - new_block->host = mmap((void*)0x800000000, size,
> - PROT_EXEC|PROT_READ|PROT_WRITE,
> - MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
> - if (new_block->host == MAP_FAILED) {
> - fprintf(stderr, "Allocating RAM failed\n");
> - abort();
> - }
> -#else
> if (xen_enabled()) {
> xen_ram_alloc(new_block->offset, size, mr);
> + } else if (kvm_enabled()) {
> + /* some s390/kvm configurations have special constraints */
> + new_block->host = kvm_vmalloc(size);
> } else {
> new_block->host = qemu_vmalloc(size);
> }
> -#endif
> qemu_madvise(new_block->host, size, QEMU_MADV_MERGEABLE);
> }
> }
> diff --git a/kvm-all.c b/kvm-all.c
> index 4ea7d85..0372f7a 100644
> --- a/kvm-all.c
> +++ b/kvm-all.c
> @@ -1653,6 +1653,19 @@ int kvm_allows_irq0_override(void)
> return !kvm_irqchip_in_kernel() || kvm_has_gsi_routing();
> }
>
> +void *kvm_vmalloc(ram_addr_t size)
> +{
> +#ifdef TARGET_S390X
> + void *mem;
> +
> + mem = kvm_arch_vmalloc(size);
> + if (mem) {
> + return mem;
> + }
> +#endif
> + return qemu_vmalloc(size);
> +}
> +
> void kvm_setup_guest_memory(void *start, size_t size)
> {
> if (!kvm_has_sync_mmu()) {
> diff --git a/kvm.h b/kvm.h
> index 9c7b0ea..ddc7c53 100644
> --- a/kvm.h
> +++ b/kvm.h
> @@ -70,6 +70,8 @@ int kvm_init_vcpu(CPUArchState *env);
> int kvm_cpu_exec(CPUArchState *env);
>
> #if !defined(CONFIG_USER_ONLY)
> +void *kvm_vmalloc(ram_addr_t size);
> +void *kvm_arch_vmalloc(ram_addr_t size);
> void kvm_setup_guest_memory(void *start, size_t size);
>
> int kvm_coalesce_mmio_region(target_phys_addr_t start, ram_addr_t size);
> diff --git a/oslib-posix.c b/oslib-posix.c
> index b6a3c7f..93902ac 100644
> --- a/oslib-posix.c
> +++ b/oslib-posix.c
> @@ -41,6 +41,9 @@ extern int daemon(int, int);
> therefore we need special code which handles running on Valgrind. */
> # define QEMU_VMALLOC_ALIGN (512 * 4096)
> # define CONFIG_VALGRIND
> +#elif defined(__linux__) && defined(__s390x__)
> + /* Use 1 MiB (segment size) alignment so gmap can be used by KVM. */
> +# define QEMU_VMALLOC_ALIGN (256 * 4096)
> #else
> # define QEMU_VMALLOC_ALIGN getpagesize()
> #endif
> diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
> index 5800fd6..4d38820 100644
> --- a/target-s390x/kvm.c
> +++ b/target-s390x/kvm.c
> @@ -135,6 +135,41 @@ int kvm_arch_get_registers(CPUS390XState *env)
> return 0;
> }
>
> +/*
> + * Legacy layout for s390:
> + * Older S390 KVM requires the topmost vma of the RAM to be
> + * smaller than an system defined value, which is at least 256GB.
> + * Larger systems have larger values. We put the guest between
> + * the end of data segment (system break) and this value. We
> + * use 32GB as a base to have enough room for the system break
> + * to grow. We also have to use MAP parameters that avoid
> + * read-only mapping of guest pages.
> + */
> +static void *legacy_s390_alloc(ram_addr_t size)
> +{
> + void *mem;
> +
> + mem = mmap((void *) 0x800000000ULL, size,
> + PROT_EXEC|PROT_READ|PROT_WRITE,
> + MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
> + if (mem == MAP_FAILED) {
> + fprintf(stderr, "Allocating RAM failed\n");
> + abort();
> + }
> + return mem;
> +}
> +
> +void *kvm_arch_vmalloc(ram_addr_t size)
> +{
> + /* Can we use the standard allocation ? */
> + if (kvm_check_extension(kvm_state, KVM_CAP_S390_GMAP) &&
> + kvm_check_extension(kvm_state, KVM_CAP_S390_COW)) {
> + return NULL;
> + } else {
> + return legacy_s390_alloc(size);
> + }
> +}
> +
> int kvm_arch_insert_sw_breakpoint(CPUS390XState *env, struct kvm_sw_breakpoint *bp)
> {
> static const uint8_t diag_501[] = {0x83, 0x24, 0x05, 0x01};
Looks good to me.
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux
next prev parent reply other threads:[~2012-06-15 17:02 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-06 12:05 [Qemu-devel] [PATCH 0/8] s390: SCLP console and misc Jens Freimann
2012-06-06 12:05 ` [Qemu-devel] [PATCH 1/8] s390: add new define for KVM_CAP_S390_COW Jens Freimann
2012-06-06 12:05 ` [Qemu-devel] [PATCH 2/8] s390: autodetect map private Jens Freimann
2012-06-12 9:32 ` Alexander Graf
2012-06-12 11:20 ` Christian Borntraeger
2012-06-12 11:57 ` Alexander Graf
2012-06-12 12:02 ` Christian Borntraeger
2012-06-12 12:12 ` Alexander Graf
2012-06-13 10:30 ` Jan Kiszka
2012-06-13 10:54 ` Alexander Graf
2012-06-13 10:58 ` Jan Kiszka
2012-06-13 11:27 ` Christian Borntraeger
2012-06-13 11:41 ` Jan Kiszka
2012-06-13 12:33 ` Alexander Graf
2012-06-13 12:35 ` Jan Kiszka
2012-06-15 14:01 ` [Qemu-devel] Next version of memory allocation fixup Christian Borntraeger
2012-06-15 14:01 ` [Qemu-devel] [PatchV2] s390: autodetect map private Christian Borntraeger
2012-06-15 15:10 ` [Qemu-devel] One more fix Christian Borntraeger
2012-06-15 15:10 ` [Qemu-devel] [PATCH v3] s390: autodetect map private Christian Borntraeger
2012-06-15 17:01 ` Jan Kiszka [this message]
2012-06-18 13:44 ` Alexander Graf
2012-06-06 12:05 ` [Qemu-devel] [PATCH 3/8] s390: make kvm_stat work on s390 Jens Freimann
2012-06-06 12:05 ` [Qemu-devel] [PATCH 4/8] s390: stop target cpu on sigp initial reset Jens Freimann
2012-06-12 9:42 ` Alexander Graf
2012-06-12 10:15 ` Christian Borntraeger
2012-06-06 12:05 ` [Qemu-devel] [PATCH 5/8] s390: Cleanup sclp functions Jens Freimann
2012-06-12 9:58 ` Alexander Graf
2012-06-12 10:07 ` Christian Borntraeger
2012-06-12 10:09 ` Alexander Graf
2012-06-12 10:10 ` Alexander Graf
2012-06-12 12:24 ` Christian Borntraeger
2012-06-12 12:32 ` Alexander Graf
2012-06-12 22:41 ` Anthony Liguori
2012-06-12 22:38 ` Anthony Liguori
2012-06-06 12:05 ` [Qemu-devel] [PATCH 6/8] s390: sclp event facility and signal quiesce support via system_powerdown Jens Freimann
2012-06-12 11:38 ` Alexander Graf
2012-06-13 7:00 ` Heinz Graalfs
2012-06-13 13:12 ` Andreas Färber
2012-06-06 12:05 ` [Qemu-devel] [PATCH 7/8] s390: Add SCLP vt220 console support Jens Freimann
2012-06-12 11:52 ` Alexander Graf
2012-06-13 7:27 ` Heinz Graalfs
2012-06-13 7:53 ` Alexander Graf
2012-06-06 12:05 ` [Qemu-devel] [PATCH 8/8] s390: Fix the storage increment size calculation Jens Freimann
2012-06-12 11:53 ` Alexander Graf
2012-06-12 14:57 ` Jeng-fang Wang
2012-06-18 13:46 ` Alexander Graf
2012-06-18 19:30 ` Christian Borntraeger
2012-06-18 12:35 ` [Qemu-devel] [PATCH 0/8] s390: SCLP console and misc Christian Borntraeger
2012-06-18 13:33 ` Alexander Graf
2012-06-18 13:41 ` Christian Borntraeger
2012-06-18 13:51 ` Alexander Graf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4FDB6A82.4090702@siemens.com \
--to=jan.kiszka@siemens.com \
--cc=agraf@suse.de \
--cc=borntraeger@de.ibm.com \
--cc=cornelia.huck@de.ibm.com \
--cc=graalfs@linux.vnet.ibm.com \
--cc=jfrei@de.ibm.com \
--cc=jfrei@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.