diff options
author | Carsten Otte <cotte@de.ibm.com> | 2010-05-17 04:00:04 -0400 |
---|---|---|
committer | Martin Schwidefsky <sky@mschwide.boeblingen.de.ibm.com> | 2010-05-17 04:00:15 -0400 |
commit | cd3b70f5d4d82f85d1e1d6e822f38ae098cf7c72 (patch) | |
tree | aa394e63d300312bece2afb53a53dfd93a0f5f23 /arch/s390/kvm | |
parent | 6377981faf1a4425b0531e577736ef03df97c8f6 (diff) |
[S390] virtualization aware cpu measurement
Use the SPP instruction to set a tag on entry to / exit of the virtual
machine context. This allows the cpu measurement facility to distinguish
the samples from the host and the different guests.
Signed-off-by: Carsten Otte <cotte@de.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/Kconfig | 11 | ||||
-rw-r--r-- | arch/s390/kvm/sie64a.S | 77 |
2 files changed, 75 insertions, 13 deletions
diff --git a/arch/s390/kvm/Kconfig b/arch/s390/kvm/Kconfig index a7251580891c..2f4b687cc7fa 100644 --- a/arch/s390/kvm/Kconfig +++ b/arch/s390/kvm/Kconfig | |||
@@ -33,6 +33,17 @@ config KVM | |||
33 | 33 | ||
34 | If unsure, say N. | 34 | If unsure, say N. |
35 | 35 | ||
36 | config KVM_AWARE_CMF | ||
37 | depends on KVM | ||
38 | bool "KVM aware sampling" | ||
39 | ---help--- | ||
40 | This option enhances the sampling data from the CPU Measurement | ||
41 | Facility with additional information, that allows to distinguish | ||
42 | guest(s) and host when using the kernel based virtual machine | ||
43 | functionality. | ||
44 | |||
45 | If unsure, say N. | ||
46 | |||
36 | # OK, it's a little counter-intuitive to do this, but it puts it neatly under | 47 | # OK, it's a little counter-intuitive to do this, but it puts it neatly under |
37 | # the virtualization menu. | 48 | # the virtualization menu. |
38 | source drivers/vhost/Kconfig | 49 | source drivers/vhost/Kconfig |
diff --git a/arch/s390/kvm/sie64a.S b/arch/s390/kvm/sie64a.S index 934fd6a885f6..31646bd0e469 100644 --- a/arch/s390/kvm/sie64a.S +++ b/arch/s390/kvm/sie64a.S | |||
@@ -1,20 +1,60 @@ | |||
1 | /* | 1 | /* |
2 | * sie64a.S - low level sie call | 2 | * sie64a.S - low level sie call |
3 | * | 3 | * |
4 | * Copyright IBM Corp. 2008 | 4 | * Copyright IBM Corp. 2008,2010 |
5 | * | 5 | * |
6 | * This program is free software; you can redistribute it and/or modify | 6 | * This program is free software; you can redistribute it and/or modify |
7 | * it under the terms of the GNU General Public License (version 2 only) | 7 | * it under the terms of the GNU General Public License (version 2 only) |
8 | * as published by the Free Software Foundation. | 8 | * as published by the Free Software Foundation. |
9 | * | 9 | * |
10 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> | 10 | * Author(s): Heiko Carstens <heiko.carstens@de.ibm.com> |
11 | * Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com> | ||
11 | */ | 12 | */ |
12 | 13 | ||
13 | #include <linux/errno.h> | 14 | #include <linux/errno.h> |
14 | #include <asm/asm-offsets.h> | 15 | #include <asm/asm-offsets.h> |
16 | #include <asm/setup.h> | ||
17 | #include <asm/asm-offsets.h> | ||
18 | #include <asm/ptrace.h> | ||
19 | #include <asm/thread_info.h> | ||
20 | |||
21 | _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING) | ||
22 | |||
23 | /* | ||
24 | * offsets into stackframe | ||
25 | * SP_ = offsets into stack sie64 is called with | ||
26 | * SPI_ = offsets into irq stack | ||
27 | */ | ||
28 | SP_GREGS = __SF_EMPTY | ||
29 | SP_HOOK = __SF_EMPTY+8 | ||
30 | SP_GPP = __SF_EMPTY+16 | ||
31 | SPI_PSW = STACK_FRAME_OVERHEAD + __PT_PSW | ||
32 | |||
15 | 33 | ||
16 | SP_R5 = 5 * 8 # offset into stackframe | 34 | .macro SPP newpp |
17 | SP_R6 = 6 * 8 | 35 | #ifdef CONFIG_KVM_AWARE_CMF |
36 | tm __LC_MACHINE_FLAGS+6,0x20 # MACHINE_FLAG_SPP | ||
37 | jz 0f | ||
38 | .insn s,0xb2800000,\newpp | ||
39 | 0: | ||
40 | #endif | ||
41 | .endm | ||
42 | |||
43 | sie_irq_handler: | ||
44 | SPP __LC_CMF_HPP # set host id | ||
45 | larl %r2,sie_inst | ||
46 | clg %r2,SPI_PSW+8(0,%r15) # intercepted sie | ||
47 | jne 1f | ||
48 | xc __LC_SIE_HOOK(8),__LC_SIE_HOOK | ||
49 | lg %r2,__LC_THREAD_INFO # pointer thread_info struct | ||
50 | tm __TI_flags+7(%r2),_TIF_EXIT_SIE | ||
51 | jz 0f | ||
52 | larl %r2,sie_exit # work pending, leave sie | ||
53 | stg %r2,__LC_RETURN_PSW+8 | ||
54 | br %r14 | ||
55 | 0: larl %r2,sie_reenter # re-enter with guest id | ||
56 | stg %r2,__LC_RETURN_PSW+8 | ||
57 | 1: br %r14 | ||
18 | 58 | ||
19 | /* | 59 | /* |
20 | * sie64a calling convention: | 60 | * sie64a calling convention: |
@@ -23,23 +63,34 @@ SP_R6 = 6 * 8 | |||
23 | */ | 63 | */ |
24 | .globl sie64a | 64 | .globl sie64a |
25 | sie64a: | 65 | sie64a: |
26 | lgr %r5,%r3 | 66 | stg %r3,SP_GREGS(%r15) # save guest register save area |
27 | stmg %r5,%r14,SP_R5(%r15) # save register on entry | 67 | stmg %r6,%r14,__SF_GPRS(%r15) # save registers on entry |
28 | lgr %r14,%r2 # pointer to sie control block | 68 | lgr %r14,%r2 # pointer to sie control block |
29 | lmg %r0,%r13,0(%r3) # load guest gprs 0-13 | 69 | larl %r5,sie_irq_handler |
70 | stg %r2,SP_GPP(%r15) | ||
71 | stg %r5,SP_HOOK(%r15) # save hook target | ||
72 | lmg %r0,%r13,0(%r3) # load guest gprs 0-13 | ||
73 | sie_reenter: | ||
74 | mvc __LC_SIE_HOOK(8),SP_HOOK(%r15) | ||
75 | SPP SP_GPP(%r15) # set guest id | ||
30 | sie_inst: | 76 | sie_inst: |
31 | sie 0(%r14) | 77 | sie 0(%r14) |
32 | lg %r14,SP_R5(%r15) | 78 | xc __LC_SIE_HOOK(8),__LC_SIE_HOOK |
33 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 | 79 | SPP __LC_CMF_HPP # set host id |
80 | sie_exit: | ||
81 | lg %r14,SP_GREGS(%r15) | ||
82 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 | ||
34 | lghi %r2,0 | 83 | lghi %r2,0 |
35 | lmg %r6,%r14,SP_R6(%r15) | 84 | lmg %r6,%r14,__SF_GPRS(%r15) |
36 | br %r14 | 85 | br %r14 |
37 | 86 | ||
38 | sie_err: | 87 | sie_err: |
39 | lg %r14,SP_R5(%r15) | 88 | xc __LC_SIE_HOOK(8),__LC_SIE_HOOK |
40 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 | 89 | SPP __LC_CMF_HPP # set host id |
90 | lg %r14,SP_GREGS(%r15) | ||
91 | stmg %r0,%r13,0(%r14) # save guest gprs 0-13 | ||
41 | lghi %r2,-EFAULT | 92 | lghi %r2,-EFAULT |
42 | lmg %r6,%r14,SP_R6(%r15) | 93 | lmg %r6,%r14,__SF_GPRS(%r15) |
43 | br %r14 | 94 | br %r14 |
44 | 95 | ||
45 | .section __ex_table,"a" | 96 | .section __ex_table,"a" |