lkml.org 
[lkml]   [2018]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.15 101/122] KVM: s390: take care of clock-comparator sign control
    Date
    4.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: David Hildenbrand <david@redhat.com>

    commit 5fe01793dd953ab947fababe8abaf5ed5258c8df upstream.

    Missed when enabling the Multiple-epoch facility. If the facility is
    installed and the control is set, a sign based comaprison has to be
    performed.

    Right now we would inject wrong interrupts and ignore interrupt
    conditions. Also the sleep time is calculated in a wrong way.

    Signed-off-by: David Hildenbrand <david@redhat.com>
    Message-Id: <20180207114647.6220-2-david@redhat.com>
    Fixes: 8fa1696ea781 ("KVM: s390: Multiple Epoch Facility support")
    Cc: stable@vger.kernel.org
    Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/s390/kvm/interrupt.c | 25 +++++++++++++++++++------
    1 file changed, 19 insertions(+), 6 deletions(-)

    --- a/arch/s390/kvm/interrupt.c
    +++ b/arch/s390/kvm/interrupt.c
    @@ -170,8 +170,15 @@ static int ckc_interrupts_enabled(struct

    static int ckc_irq_pending(struct kvm_vcpu *vcpu)
    {
    - if (vcpu->arch.sie_block->ckc >= kvm_s390_get_tod_clock_fast(vcpu->kvm))
    + const u64 now = kvm_s390_get_tod_clock_fast(vcpu->kvm);
    + const u64 ckc = vcpu->arch.sie_block->ckc;
    +
    + if (vcpu->arch.sie_block->gcr[0] & 0x0020000000000000ul) {
    + if ((s64)ckc >= (s64)now)
    + return 0;
    + } else if (ckc >= now) {
    return 0;
    + }
    return ckc_interrupts_enabled(vcpu);
    }

    @@ -1011,13 +1018,19 @@ int kvm_cpu_has_pending_timer(struct kvm

    static u64 __calculate_sltime(struct kvm_vcpu *vcpu)
    {
    - u64 now, cputm, sltime = 0;
    + const u64 now = kvm_s390_get_tod_clock_fast(vcpu->kvm);
    + const u64 ckc = vcpu->arch.sie_block->ckc;
    + u64 cputm, sltime = 0;

    if (ckc_interrupts_enabled(vcpu)) {
    - now = kvm_s390_get_tod_clock_fast(vcpu->kvm);
    - sltime = tod_to_ns(vcpu->arch.sie_block->ckc - now);
    - /* already expired or overflow? */
    - if (!sltime || vcpu->arch.sie_block->ckc <= now)
    + if (vcpu->arch.sie_block->gcr[0] & 0x0020000000000000ul) {
    + if ((s64)now < (s64)ckc)
    + sltime = tod_to_ns((s64)ckc - (s64)now);
    + } else if (now < ckc) {
    + sltime = tod_to_ns(ckc - now);
    + }
    + /* already expired */
    + if (!sltime)
    return 0;
    if (cpu_timer_interrupts_enabled(vcpu)) {
    cputm = kvm_s390_get_cpu_timer(vcpu);

    \
     
     \ /
      Last update: 2018-03-07 21:23    [W:5.347 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site