Loading arch/s390/include/asm/kvm_host.h +1 −0 Original line number Diff line number Diff line Loading @@ -392,6 +392,7 @@ struct kvm_vcpu_stat { u64 diagnose_10; u64 diagnose_44; u64 diagnose_9c; u64 diagnose_9c_ignored; u64 diagnose_258; u64 diagnose_308; u64 diagnose_500; Loading arch/s390/kvm/diag.c +18 −4 Original line number Diff line number Diff line Loading @@ -158,14 +158,28 @@ static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu) tid = vcpu->run->s.regs.gprs[(vcpu->arch.sie_block->ipa & 0xf0) >> 4]; vcpu->stat.diagnose_9c++; VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d", tid); /* yield to self */ if (tid == vcpu->vcpu_id) return 0; goto no_yield; /* yield to invalid */ tcpu = kvm_get_vcpu_by_id(vcpu->kvm, tid); if (tcpu) kvm_vcpu_yield_to(tcpu); if (!tcpu) goto no_yield; /* target already running */ if (READ_ONCE(tcpu->cpu) >= 0) goto no_yield; if (kvm_vcpu_yield_to(tcpu) <= 0) goto no_yield; VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: done", tid); return 0; no_yield: VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: ignored", tid); vcpu->stat.diagnose_9c_ignored++; return 0; } Loading arch/s390/kvm/interrupt.c +2 −3 Original line number Diff line number Diff line Loading @@ -1477,8 +1477,7 @@ static int __inject_sigp_stop(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) return 0; } static int __inject_sigp_restart(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) static int __inject_sigp_restart(struct kvm_vcpu *vcpu) { struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; Loading Loading @@ -2007,7 +2006,7 @@ static int do_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) rc = __inject_sigp_stop(vcpu, irq); break; case KVM_S390_RESTART: rc = __inject_sigp_restart(vcpu, irq); rc = __inject_sigp_restart(vcpu); break; case KVM_S390_INT_CLOCK_COMP: rc = __inject_ckc(vcpu); Loading arch/s390/kvm/kvm-s390.c +8 −11 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { { "instruction_diag_10", VCPU_STAT(diagnose_10) }, { "instruction_diag_44", VCPU_STAT(diagnose_44) }, { "instruction_diag_9c", VCPU_STAT(diagnose_9c) }, { "diag_9c_ignored", VCPU_STAT(diagnose_9c_ignored) }, { "instruction_diag_258", VCPU_STAT(diagnose_258) }, { "instruction_diag_308", VCPU_STAT(diagnose_308) }, { "instruction_diag_500", VCPU_STAT(diagnose_500) }, Loading Loading @@ -453,16 +454,14 @@ static void kvm_s390_cpu_feat_init(void) int kvm_arch_init(void *opaque) { int rc; int rc = -ENOMEM; kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long)); if (!kvm_s390_dbf) return -ENOMEM; if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) { rc = -ENOMEM; goto out_debug_unreg; } if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) goto out; kvm_s390_cpu_feat_init(); Loading @@ -470,19 +469,17 @@ int kvm_arch_init(void *opaque) rc = kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); if (rc) { pr_err("A FLIC registration call failed with rc=%d\n", rc); goto out_debug_unreg; goto out; } rc = kvm_s390_gib_init(GAL_ISC); if (rc) goto out_gib_destroy; goto out; return 0; out_gib_destroy: kvm_s390_gib_destroy(); out_debug_unreg: debug_unregister(kvm_s390_dbf); out: kvm_arch_exit(); return rc; } Loading tools/testing/selftests/kvm/s390x/sync_regs_test.c +9 −6 Original line number Diff line number Diff line Loading @@ -25,12 +25,15 @@ static void guest_code(void) { register u64 stage asm("11") = 0; for (;;) { GUEST_SYNC(0); asm volatile ("ahi %0,1" : : "r"(stage)); } /* * We embed diag 501 here instead of doing a ucall to avoid that * the compiler has messed with r11 at the time of the ucall. */ asm volatile ( "0: diag 0,0,0x501\n" " ahi 11,1\n" " j 0b\n" ); } #define REG_COMPARE(reg) \ Loading Loading
arch/s390/include/asm/kvm_host.h +1 −0 Original line number Diff line number Diff line Loading @@ -392,6 +392,7 @@ struct kvm_vcpu_stat { u64 diagnose_10; u64 diagnose_44; u64 diagnose_9c; u64 diagnose_9c_ignored; u64 diagnose_258; u64 diagnose_308; u64 diagnose_500; Loading
arch/s390/kvm/diag.c +18 −4 Original line number Diff line number Diff line Loading @@ -158,14 +158,28 @@ static int __diag_time_slice_end_directed(struct kvm_vcpu *vcpu) tid = vcpu->run->s.regs.gprs[(vcpu->arch.sie_block->ipa & 0xf0) >> 4]; vcpu->stat.diagnose_9c++; VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d", tid); /* yield to self */ if (tid == vcpu->vcpu_id) return 0; goto no_yield; /* yield to invalid */ tcpu = kvm_get_vcpu_by_id(vcpu->kvm, tid); if (tcpu) kvm_vcpu_yield_to(tcpu); if (!tcpu) goto no_yield; /* target already running */ if (READ_ONCE(tcpu->cpu) >= 0) goto no_yield; if (kvm_vcpu_yield_to(tcpu) <= 0) goto no_yield; VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: done", tid); return 0; no_yield: VCPU_EVENT(vcpu, 5, "diag time slice end directed to %d: ignored", tid); vcpu->stat.diagnose_9c_ignored++; return 0; } Loading
arch/s390/kvm/interrupt.c +2 −3 Original line number Diff line number Diff line Loading @@ -1477,8 +1477,7 @@ static int __inject_sigp_stop(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) return 0; } static int __inject_sigp_restart(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) static int __inject_sigp_restart(struct kvm_vcpu *vcpu) { struct kvm_s390_local_interrupt *li = &vcpu->arch.local_int; Loading Loading @@ -2007,7 +2006,7 @@ static int do_inject_vcpu(struct kvm_vcpu *vcpu, struct kvm_s390_irq *irq) rc = __inject_sigp_stop(vcpu, irq); break; case KVM_S390_RESTART: rc = __inject_sigp_restart(vcpu, irq); rc = __inject_sigp_restart(vcpu); break; case KVM_S390_INT_CLOCK_COMP: rc = __inject_ckc(vcpu); Loading
arch/s390/kvm/kvm-s390.c +8 −11 Original line number Diff line number Diff line Loading @@ -155,6 +155,7 @@ struct kvm_stats_debugfs_item debugfs_entries[] = { { "instruction_diag_10", VCPU_STAT(diagnose_10) }, { "instruction_diag_44", VCPU_STAT(diagnose_44) }, { "instruction_diag_9c", VCPU_STAT(diagnose_9c) }, { "diag_9c_ignored", VCPU_STAT(diagnose_9c_ignored) }, { "instruction_diag_258", VCPU_STAT(diagnose_258) }, { "instruction_diag_308", VCPU_STAT(diagnose_308) }, { "instruction_diag_500", VCPU_STAT(diagnose_500) }, Loading Loading @@ -453,16 +454,14 @@ static void kvm_s390_cpu_feat_init(void) int kvm_arch_init(void *opaque) { int rc; int rc = -ENOMEM; kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long)); if (!kvm_s390_dbf) return -ENOMEM; if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) { rc = -ENOMEM; goto out_debug_unreg; } if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) goto out; kvm_s390_cpu_feat_init(); Loading @@ -470,19 +469,17 @@ int kvm_arch_init(void *opaque) rc = kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); if (rc) { pr_err("A FLIC registration call failed with rc=%d\n", rc); goto out_debug_unreg; goto out; } rc = kvm_s390_gib_init(GAL_ISC); if (rc) goto out_gib_destroy; goto out; return 0; out_gib_destroy: kvm_s390_gib_destroy(); out_debug_unreg: debug_unregister(kvm_s390_dbf); out: kvm_arch_exit(); return rc; } Loading
tools/testing/selftests/kvm/s390x/sync_regs_test.c +9 −6 Original line number Diff line number Diff line Loading @@ -25,12 +25,15 @@ static void guest_code(void) { register u64 stage asm("11") = 0; for (;;) { GUEST_SYNC(0); asm volatile ("ahi %0,1" : : "r"(stage)); } /* * We embed diag 501 here instead of doing a ucall to avoid that * the compiler has messed with r11 at the time of the ucall. */ asm volatile ( "0: diag 0,0,0x501\n" " ahi 11,1\n" " j 0b\n" ); } #define REG_COMPARE(reg) \ Loading