diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-07-22 09:50:58 -0400 |
---|---|---|
committer | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-07-29 05:02:36 -0400 |
commit | 78f2613168eca83a218272aa12b680a365ee58d6 (patch) | |
tree | e5d601861504a178125c8c52ac8b5459d1b1ede2 /arch/s390/kvm | |
parent | 7cbde76b3d55ee299568eb943854c425b015b30c (diff) |
KVM: s390: Provide global debug log
In addition to the per VM debug logs, let's provide a global
one for KVM-wide events, like new guests or fatal errors.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Reviewed-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Diffstat (limited to 'arch/s390/kvm')
-rw-r--r-- | arch/s390/kvm/kvm-s390.c | 20 | ||||
-rw-r--r-- | arch/s390/kvm/kvm-s390.h | 7 |
2 files changed, 26 insertions, 1 deletions
diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 4c1b5cbea1a6..762103653a29 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c | |||
@@ -127,6 +127,7 @@ unsigned long kvm_s390_fac_list_mask_size(void) | |||
127 | } | 127 | } |
128 | 128 | ||
129 | static struct gmap_notifier gmap_notifier; | 129 | static struct gmap_notifier gmap_notifier; |
130 | debug_info_t *kvm_s390_dbf; | ||
130 | 131 | ||
131 | /* Section: not file related */ | 132 | /* Section: not file related */ |
132 | int kvm_arch_hardware_enable(void) | 133 | int kvm_arch_hardware_enable(void) |
@@ -151,10 +152,24 @@ void kvm_arch_hardware_unsetup(void) | |||
151 | 152 | ||
152 | int kvm_arch_init(void *opaque) | 153 | int kvm_arch_init(void *opaque) |
153 | { | 154 | { |
155 | kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long)); | ||
156 | if (!kvm_s390_dbf) | ||
157 | return -ENOMEM; | ||
158 | |||
159 | if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) { | ||
160 | debug_unregister(kvm_s390_dbf); | ||
161 | return -ENOMEM; | ||
162 | } | ||
163 | |||
154 | /* Register floating interrupt controller interface. */ | 164 | /* Register floating interrupt controller interface. */ |
155 | return kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); | 165 | return kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); |
156 | } | 166 | } |
157 | 167 | ||
168 | void kvm_arch_exit(void) | ||
169 | { | ||
170 | debug_unregister(kvm_s390_dbf); | ||
171 | } | ||
172 | |||
158 | /* Section: device related */ | 173 | /* Section: device related */ |
159 | long kvm_arch_dev_ioctl(struct file *filp, | 174 | long kvm_arch_dev_ioctl(struct file *filp, |
160 | unsigned int ioctl, unsigned long arg) | 175 | unsigned int ioctl, unsigned long arg) |
@@ -1100,7 +1115,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
1100 | mutex_init(&kvm->arch.ipte_mutex); | 1115 | mutex_init(&kvm->arch.ipte_mutex); |
1101 | 1116 | ||
1102 | debug_register_view(kvm->arch.dbf, &debug_sprintf_view); | 1117 | debug_register_view(kvm->arch.dbf, &debug_sprintf_view); |
1103 | VM_EVENT(kvm, 3, "%s", "vm created"); | 1118 | VM_EVENT(kvm, 3, "vm created with type %lu", type); |
1104 | 1119 | ||
1105 | if (type & KVM_VM_S390_UCONTROL) { | 1120 | if (type & KVM_VM_S390_UCONTROL) { |
1106 | kvm->arch.gmap = NULL; | 1121 | kvm->arch.gmap = NULL; |
@@ -1117,6 +1132,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) | |||
1117 | kvm->arch.epoch = 0; | 1132 | kvm->arch.epoch = 0; |
1118 | 1133 | ||
1119 | spin_lock_init(&kvm->arch.start_stop_lock); | 1134 | spin_lock_init(&kvm->arch.start_stop_lock); |
1135 | KVM_EVENT(3, "vm 0x%p created by pid %u", kvm, current->pid); | ||
1120 | 1136 | ||
1121 | return 0; | 1137 | return 0; |
1122 | out_err: | 1138 | out_err: |
@@ -1124,6 +1140,7 @@ out_err: | |||
1124 | free_page((unsigned long)kvm->arch.model.fac); | 1140 | free_page((unsigned long)kvm->arch.model.fac); |
1125 | debug_unregister(kvm->arch.dbf); | 1141 | debug_unregister(kvm->arch.dbf); |
1126 | free_page((unsigned long)(kvm->arch.sca)); | 1142 | free_page((unsigned long)(kvm->arch.sca)); |
1143 | KVM_EVENT(3, "creation of vm failed: %d", rc); | ||
1127 | return rc; | 1144 | return rc; |
1128 | } | 1145 | } |
1129 | 1146 | ||
@@ -1180,6 +1197,7 @@ void kvm_arch_destroy_vm(struct kvm *kvm) | |||
1180 | gmap_free(kvm->arch.gmap); | 1197 | gmap_free(kvm->arch.gmap); |
1181 | kvm_s390_destroy_adapters(kvm); | 1198 | kvm_s390_destroy_adapters(kvm); |
1182 | kvm_s390_clear_float_irqs(kvm); | 1199 | kvm_s390_clear_float_irqs(kvm); |
1200 | KVM_EVENT(3, "vm 0x%p destroyed", kvm); | ||
1183 | } | 1201 | } |
1184 | 1202 | ||
1185 | /* Section: vcpu related */ | 1203 | /* Section: vcpu related */ |
diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 0ee5db11598b..c446aabf60d3 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h | |||
@@ -27,6 +27,13 @@ typedef int (*intercept_handler_t)(struct kvm_vcpu *vcpu); | |||
27 | #define TDB_FORMAT1 1 | 27 | #define TDB_FORMAT1 1 |
28 | #define IS_ITDB_VALID(vcpu) ((*(char *)vcpu->arch.sie_block->itdba == TDB_FORMAT1)) | 28 | #define IS_ITDB_VALID(vcpu) ((*(char *)vcpu->arch.sie_block->itdba == TDB_FORMAT1)) |
29 | 29 | ||
30 | extern debug_info_t *kvm_s390_dbf; | ||
31 | #define KVM_EVENT(d_loglevel, d_string, d_args...)\ | ||
32 | do { \ | ||
33 | debug_sprintf_event(kvm_s390_dbf, d_loglevel, d_string "\n", \ | ||
34 | d_args); \ | ||
35 | } while (0) | ||
36 | |||
30 | #define VM_EVENT(d_kvm, d_loglevel, d_string, d_args...)\ | 37 | #define VM_EVENT(d_kvm, d_loglevel, d_string, d_args...)\ |
31 | do { \ | 38 | do { \ |
32 | debug_sprintf_event(d_kvm->arch.dbf, d_loglevel, d_string "\n", \ | 39 | debug_sprintf_event(d_kvm->arch.dbf, d_loglevel, d_string "\n", \ |