lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 108/108] KVM: x86: silence preempt warning on kvm_write_guest_time
    2.6.30-stable review patch.  If anyone has any objections, please let us know.

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

    From: Matt T. Yourst <yourst@users.sourceforge.net>

    commit 2dea4c84bc936731668b5a7a9fba5b436a422668 upstream.

    This issue just appeared in kvm-84 when running on 2.6.28.7 (x86-64)
    with PREEMPT enabled.

    We're getting syslog warnings like this many (but not all) times qemu
    tells KVM to run the VCPU:

    BUG: using smp_processor_id() in preemptible [00000000] code:
    qemu-system-x86/28938
    caller is kvm_arch_vcpu_ioctl_run+0x5d1/0xc70 [kvm]
    Pid: 28938, comm: qemu-system-x86 2.6.28.7-mtyrel-64bit
    Call Trace:
    debug_smp_processor_id+0xf7/0x100
    kvm_arch_vcpu_ioctl_run+0x5d1/0xc70 [kvm]
    ? __wake_up+0x4e/0x70
    ? wake_futex+0x27/0x40
    kvm_vcpu_ioctl+0x2e9/0x5a0 [kvm]
    enqueue_hrtimer+0x8a/0x110
    _spin_unlock_irqrestore+0x27/0x50
    vfs_ioctl+0x31/0xa0
    do_vfs_ioctl+0x74/0x480
    sys_futex+0xb4/0x140
    sys_ioctl+0x99/0xa0
    system_call_fastpath+0x16/0x1b

    As it turns out, the call trace is messed up due to gcc's inlining, but
    I isolated the problem anyway: kvm_write_guest_time() is being used in a
    non-thread-safe manner on preemptable kernels.

    Basically kvm_write_guest_time()'s body needs to be surrounded by
    preempt_disable() and preempt_enable(), since the kernel won't let us
    query any per-CPU data (indirectly using smp_processor_id()) without
    preemption disabled. The attached patch fixes this issue by disabling
    preemption inside kvm_write_guest_time().

    [marcelo: surround only __get_cpu_var calls since the warning
    is harmless]

    Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
    Signed-off-by: Avi Kivity <avi@redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    arch/x86/kvm/x86.c | 2 ++
    1 file changed, 2 insertions(+)

    --- a/arch/x86/kvm/x86.c
    +++ b/arch/x86/kvm/x86.c
    @@ -634,10 +634,12 @@ static void kvm_write_guest_time(struct
    if ((!vcpu->time_page))
    return;

    + preempt_disable();
    if (unlikely(vcpu->hv_clock_tsc_khz != __get_cpu_var(cpu_tsc_khz))) {
    kvm_set_time_scale(__get_cpu_var(cpu_tsc_khz), &vcpu->hv_clock);
    vcpu->hv_clock_tsc_khz = __get_cpu_var(cpu_tsc_khz);
    }
    + preempt_enable();

    /* Keep irq disabled to prevent changes to the clock */
    local_irq_save(flags);



    \
     
     \ /
      Last update: 2009-07-01 03:33    [W:0.022 / U:34.052 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site