* [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31
@ 2014-03-31 17:37 Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 1/2] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Andreas Färber
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Andreas Färber @ 2014-03-31 17:37 UTC (permalink / raw)
To: qemu-devel; +Cc: Peter Maydell, Andreas Färber, Anthony Liguori
Hello Peter,
This is my current QOM CPU patch queue. Please pull.
Regards,
Andreas
Cc: Peter Maydell <peter.maydell@linaro.org>
Cc: Anthony Liguori <anthony@codemonkey.ws>
The following changes since commit 8648fcd52a9bcc2aa415cbe87b7c636e545acb38:
make-release: Record SeaBIOS version (2014-03-31 15:02:04 +0100)
are available in the git repository at:
git://github.com/afaerber/qemu-cpu.git tags/qom-cpu-for-2.0
for you to fetch changes up to 0d6d1ab4990b6e8c6f24e9b1308801d657d411ad:
cpu: Avoid QOM casts for CPU() (2014-03-31 19:28:38 +0200)
----------------------------------------------------------------
QOM CPUState refactorings / X86CPU
* X86CPU IA32e 1GB paging support
* Performance quickfix for CPU() cast macro
----------------------------------------------------------------
Andreas Färber (1):
cpu: Avoid QOM casts for CPU()
Luiz Capitulino (1):
target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
include/qom/cpu.h | 7 ++++++-
target-i386/helper.c | 11 +++++++++++
2 files changed, 17 insertions(+), 1 deletion(-)
^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL for-2.0 1/2] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation
2014-03-31 17:37 [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Andreas Färber
@ 2014-03-31 17:37 ` Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU() Andreas Färber
2014-03-31 18:44 ` [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Peter Maydell
2 siblings, 0 replies; 6+ messages in thread
From: Andreas Färber @ 2014-03-31 17:37 UTC (permalink / raw)
To: qemu-devel; +Cc: Andreas Färber, Luiz Capitulino
From: Luiz Capitulino <lcapitulino@redhat.com>
Linux guests, when using more than 4GB of RAM, may end up using 1GB pages
to store (kernel) data. When this happens, we're unable to debug a running
Linux kernel with GDB:
(gdb) p node_data[0]->node_id
Cannot access memory at address 0xffff88013fffd3a0
(gdb)
GDB returns this error because x86_cpu_get_phys_page_debug() doesn't support
translating 1GB pages in IA-32e paging mode and returns an error to GDB.
This commit adds support for 1GB page translation for IA32e paging.
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
target-i386/helper.c | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/target-i386/helper.c b/target-i386/helper.c
index 4f447b8..372f0e3 100644
--- a/target-i386/helper.c
+++ b/target-i386/helper.c
@@ -941,6 +941,14 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
pdpe = ldq_phys(cs->as, pdpe_addr);
if (!(pdpe & PG_PRESENT_MASK))
return -1;
+
+ if (pdpe & PG_PSE_MASK) {
+ page_size = 1024 * 1024 * 1024;
+ pte = pdpe & ~( (page_size - 1) & ~0xfff);
+ pte &= ~(PG_NX_MASK | PG_HI_USER_MASK);
+ goto out;
+ }
+
} else
#endif
{
@@ -993,6 +1001,9 @@ hwaddr x86_cpu_get_phys_page_debug(CPUState *cs, vaddr addr)
pte = pte & env->a20_mask;
}
+#ifdef TARGET_X86_64
+out:
+#endif
page_offset = (addr & TARGET_PAGE_MASK) & (page_size - 1);
paddr = (pte & TARGET_PAGE_MASK) + page_offset;
return paddr;
--
1.8.4.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU()
2014-03-31 17:37 [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 1/2] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Andreas Färber
@ 2014-03-31 17:37 ` Andreas Färber
2014-04-02 6:38 ` Laurent Desnogues
2014-04-02 12:30 ` Laurent Desnogues
2014-03-31 18:44 ` [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Peter Maydell
2 siblings, 2 replies; 6+ messages in thread
From: Andreas Färber @ 2014-03-31 17:37 UTC (permalink / raw)
To: qemu-devel; +Cc: Andreas Färber
CPU address spaces touching load and store helpers as well as the
movement of (almost) all fields from CPU_COMMON to CPUState have led to
a noticeable increase of CPU() usage in "hot" paths for both TCG and KVM.
While CPU()'s OBJECT_CHECK() might help detect development errors, i.e.
in form of crashes due to QOM vs. non-QOM mismatches rather than QOM
type mismatches, it is not really needed at runtime since mostly used in
CPU-specific paths, coming from a target-specific CPU subtype. If that
pointer is damaged, other errors are highly likely to occur elsewhere
anyway.
Keep the CPU() macro for a consistent developer experience and for
flexibility to exchange its implementation, but turn it into a pure,
unchecked C cast for now.
Compare commit 6e42be7cd10260fd3a006d94f6c870692bf7a2c0.
Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
include/qom/cpu.h | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/include/qom/cpu.h b/include/qom/cpu.h
index f99885a..df977c8 100644
--- a/include/qom/cpu.h
+++ b/include/qom/cpu.h
@@ -53,7 +53,12 @@ typedef uint64_t vaddr;
#define TYPE_CPU "cpu"
-#define CPU(obj) OBJECT_CHECK(CPUState, (obj), TYPE_CPU)
+/* Since this macro is used a lot in hot code paths and in conjunction with
+ * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using
+ * an unchecked cast.
+ */
+#define CPU(obj) ((CPUState *)(obj))
+
#define CPU_CLASS(class) OBJECT_CLASS_CHECK(CPUClass, (class), TYPE_CPU)
#define CPU_GET_CLASS(obj) OBJECT_GET_CLASS(CPUClass, (obj), TYPE_CPU)
--
1.8.4.5
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31
2014-03-31 17:37 [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 1/2] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU() Andreas Färber
@ 2014-03-31 18:44 ` Peter Maydell
2 siblings, 0 replies; 6+ messages in thread
From: Peter Maydell @ 2014-03-31 18:44 UTC (permalink / raw)
To: Andreas Färber; +Cc: QEMU Developers, Anthony Liguori
On 31 March 2014 18:37, Andreas Färber <afaerber@suse.de> wrote:
> Hello Peter,
>
> This is my current QOM CPU patch queue. Please pull.
>
> Regards,
> Andreas
>
> Cc: Peter Maydell <peter.maydell@linaro.org>
> Cc: Anthony Liguori <anthony@codemonkey.ws>
>
> The following changes since commit 8648fcd52a9bcc2aa415cbe87b7c636e545acb38:
>
> make-release: Record SeaBIOS version (2014-03-31 15:02:04 +0100)
>
> are available in the git repository at:
>
> git://github.com/afaerber/qemu-cpu.git tags/qom-cpu-for-2.0
>
> for you to fetch changes up to 0d6d1ab4990b6e8c6f24e9b1308801d657d411ad:
>
> cpu: Avoid QOM casts for CPU() (2014-03-31 19:28:38 +0200)
>
> ----------------------------------------------------------------
> QOM CPUState refactorings / X86CPU
>
> * X86CPU IA32e 1GB paging support
> * Performance quickfix for CPU() cast macro
>
> ----------------------------------------------------------------
Applied, thanks.
-- PMM
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU()
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU() Andreas Färber
@ 2014-04-02 6:38 ` Laurent Desnogues
2014-04-02 12:30 ` Laurent Desnogues
1 sibling, 0 replies; 6+ messages in thread
From: Laurent Desnogues @ 2014-04-02 6:38 UTC (permalink / raw)
To: Andreas Färber; +Cc: qemu-devel@nongnu.org
On Mon, Mar 31, 2014 at 7:37 PM, Andreas Färber <afaerber@suse.de> wrote:
> CPU address spaces touching load and store helpers as well as the
> movement of (almost) all fields from CPU_COMMON to CPUState have led to
> a noticeable increase of CPU() usage in "hot" paths for both TCG and KVM.
>
> While CPU()'s OBJECT_CHECK() might help detect development errors, i.e.
> in form of crashes due to QOM vs. non-QOM mismatches rather than QOM
> type mismatches, it is not really needed at runtime since mostly used in
> CPU-specific paths, coming from a target-specific CPU subtype. If that
> pointer is damaged, other errors are highly likely to occur elsewhere
> anyway.
>
> Keep the CPU() macro for a consistent developer experience and for
> flexibility to exchange its implementation, but turn it into a pure,
> unchecked C cast for now.
>
> Compare commit 6e42be7cd10260fd3a006d94f6c870692bf7a2c0.
>
> Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Andreas Färber <afaerber@suse.de>
It works fine here.
Tested-by: Laurent Desnogues <laurent.desnogues@gmail.com>
Thanks,
Laurent
> ---
> include/qom/cpu.h | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index f99885a..df977c8 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -53,7 +53,12 @@ typedef uint64_t vaddr;
>
> #define TYPE_CPU "cpu"
>
> -#define CPU(obj) OBJECT_CHECK(CPUState, (obj), TYPE_CPU)
> +/* Since this macro is used a lot in hot code paths and in conjunction with
> + * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using
> + * an unchecked cast.
> + */
> +#define CPU(obj) ((CPUState *)(obj))
> +
> #define CPU_CLASS(class) OBJECT_CLASS_CHECK(CPUClass, (class), TYPE_CPU)
> #define CPU_GET_CLASS(obj) OBJECT_GET_CLASS(CPUClass, (obj), TYPE_CPU)
>
> --
> 1.8.4.5
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU()
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU() Andreas Färber
2014-04-02 6:38 ` Laurent Desnogues
@ 2014-04-02 12:30 ` Laurent Desnogues
1 sibling, 0 replies; 6+ messages in thread
From: Laurent Desnogues @ 2014-04-02 12:30 UTC (permalink / raw)
To: Andreas Färber; +Cc: qemu-devel@nongnu.org
On Mon, Mar 31, 2014 at 7:37 PM, Andreas Färber <afaerber@suse.de> wrote:
> CPU address spaces touching load and store helpers as well as the
> movement of (almost) all fields from CPU_COMMON to CPUState have led to
> a noticeable increase of CPU() usage in "hot" paths for both TCG and KVM.
>
> While CPU()'s OBJECT_CHECK() might help detect development errors, i.e.
> in form of crashes due to QOM vs. non-QOM mismatches rather than QOM
> type mismatches, it is not really needed at runtime since mostly used in
> CPU-specific paths, coming from a target-specific CPU subtype. If that
> pointer is damaged, other errors are highly likely to occur elsewhere
> anyway.
>
> Keep the CPU() macro for a consistent developer experience and for
> flexibility to exchange its implementation, but turn it into a pure,
> unchecked C cast for now.
I re-ran my image to measure the improvements.
Intel 4770K (no HT, no OC)
Fedora Core 19
QEMU 82c6f513735297ad76acaaf2e87f0c5a0b3647a7
Image: ARM kernel + Google V8 running Sunspider
old: without this patch
strong: default stack protection (strong in my case)
noprot: no stack protection (--disable-stack-protector)
disable: no QOM debug (--disable-qom-cast-debug)
old+strong 16.7
old+strong+disable 15.9
old+noprot 16.6
old+noprot+disable 16.0
strong 15.8
strong+disable 15.7
noprot 15.6
noprot+disable 15.5
Thanks,
Laurent
> Compare commit 6e42be7cd10260fd3a006d94f6c870692bf7a2c0.
>
> Reported-by: Laurent Desnogues <laurent.desnogues@gmail.com>
> Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
> include/qom/cpu.h | 7 ++++++-
> 1 file changed, 6 insertions(+), 1 deletion(-)
>
> diff --git a/include/qom/cpu.h b/include/qom/cpu.h
> index f99885a..df977c8 100644
> --- a/include/qom/cpu.h
> +++ b/include/qom/cpu.h
> @@ -53,7 +53,12 @@ typedef uint64_t vaddr;
>
> #define TYPE_CPU "cpu"
>
> -#define CPU(obj) OBJECT_CHECK(CPUState, (obj), TYPE_CPU)
> +/* Since this macro is used a lot in hot code paths and in conjunction with
> + * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using
> + * an unchecked cast.
> + */
> +#define CPU(obj) ((CPUState *)(obj))
> +
> #define CPU_CLASS(class) OBJECT_CLASS_CHECK(CPUClass, (class), TYPE_CPU)
> #define CPU_GET_CLASS(obj) OBJECT_GET_CLASS(CPUClass, (obj), TYPE_CPU)
>
> --
> 1.8.4.5
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-04-02 12:30 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-03-31 17:37 [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 1/2] target-i386: x86_cpu_get_phys_page_debug(): support 1GB page translation Andreas Färber
2014-03-31 17:37 ` [Qemu-devel] [PULL for-2.0 2/2] cpu: Avoid QOM casts for CPU() Andreas Färber
2014-04-02 6:38 ` Laurent Desnogues
2014-04-02 12:30 ` Laurent Desnogues
2014-03-31 18:44 ` [Qemu-devel] [PULL for-2.0 0/2] QOM CPUState patch queue 2014-03-31 Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).