Re: [4.4rt3] Preemption disabled at:[<ffff8000000aba44>] kvm_vcpu_ioctl+0x30c/0x750

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Feb 10, 2016 at 5:39 PM, Josh Cartwright <joshc@xxxxxx> wrote:
> On Wed, Feb 10, 2016 at 09:33:28AM +0000, Jaggi, Manish wrote:
>> I am trying to run a kvm guest on a host with 4.4 rt3 patchset
>> applied. (Cavium thunderX arm64 system) Getting the following error:
>>
>> BUG: scheduling while atomic: qemu-system-aar/41889/0x00000002
>> [  341.647463] Modules linked in: ipv6 thunderx_edac_lmc thunderx_edac_ccpi i2c_octeon edac_core shpchp aes_ce_blk ablk_helper cryptd aes_ce_cipher ghash_ce sha2_ce sha1_ce uio_pdrv_genirq rtc_efi uio
>> [  341.647477] Preemption disabled at:[<ffff8000000aba44>] kvm_vcpu_ioctl+0x30c/0x750
>> [  341.647478]
>> [  341.647484] CPU: 2 PID: 41889 Comm: qemu-system-aar Not tainted 4.4.0-rt3-00120-gbb974fa #64
>> [  341.647486] Hardware name: www.cavium.com ThunderX CRB1S/ThunderX CRB1S, BIOS 0.3 Dec  3 2015
>> [  341.647488] Call trace:
>> [  341.647494] [<ffff800000097878>] dump_backtrace+0x0/0x160
>> [  341.647499] [<ffff8000000979fc>] show_stack+0x24/0x30
>> [  341.647503] [<ffff800000512608>] dump_stack+0x88/0xa8
>> [  341.647509] [<ffff8000000f25c0>] __schedule_bug+0x70/0xc0
>> [  341.647514] [<ffff8000008f8f38>] __schedule+0x510/0x580
>> [  341.647517] [<ffff8000008f90e8>] schedule+0x50/0xf0
>> [  341.647521] [<ffff8000008fa9a4>] rt_spin_lock_slowlock+0x124/0x2e0
>> [  341.647525] [<ffff8000008fc5e0>] rt_spin_lock+0x60/0x70
>> [  341.647530] [<ffff8000000bffe0>] kvm_vgic_flush_hwstate+0x60/0x278
>> [  341.647535] [<ffff8000000b3140>] kvm_arch_vcpu_ioctl_run+0x108/0x618
>> [  341.647547] [<ffff8000000aba44>] kvm_vcpu_ioctl+0x30c/0x750
>> [  341.647553] [<ffff80000024b4dc>] do_vfs_ioctl+0x364/0x628
>> [  341.647556] [<ffff80000024b834>] SyS_ioctl+0x94/0xa8
>> [  341.647560] [<ffff800000093b04>] el0_svc_naked+0x38/0x3c
>>
>> The below patch enables preemption:
>> https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/arch/arm/kvm/arm.c?h=v4.4&id=1b3d546daf85ed2bc9966e12cee3e6435fb65eca
>
> Another relevant commit is 7e16aa81f9f6a7cfe2287b788a7d62abc2880185:
>
>   Author: Christoffer Dall <christoffer.dall@xxxxxxxxxx>
>
>   KVM: arm/arm64: Fix preemptible timer active state crazyness
>
>   We were setting the physical active state on the GIC distributor in a
>   preemptible section, which could cause us to set the active state on
>   different physical CPU from the one we were actually going to run on,
>   hacoc ensues.
>
>   Since we are no longer descheduling/scheduling soft timers in the
>   flush/sync timer functions, simply moving the timer flush into a
>   non-preemptible section.
>
>   Reviewed-by: Marc Zyngier <marc.zyngier@xxxxxxx>
>   Signed-off-by: Christoffer Dall <christoffer.dall@xxxxxxxxxx>
>
>> arm/arm64: KVM: Properly account for guest CPU time
>>
>> Is there a way to do it without disabling preemption ?
>
> If the concern is touching the wrong per-CPU GIC distributor registers,
> it should be sufficient on -rt to downgrade the preempt_disable() /
> preempt_enable() to a migrate_disable() / migrate_enable(), which is
> preemptible, but prevents the task from moving to another CPU.
>

Indeed!


>
> diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
> index 4f5c42a..2ce9cc2 100644
> --- a/arch/arm/kvm/arm.c
> +++ b/arch/arm/kvm/arm.c
> @@ -568,7 +568,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>                  * involves poking the GIC, which must be done in a
>                  * non-preemptible context.
>                  */
> -               preempt_disable();
> +               migrate_disable();
>                 kvm_timer_flush_hwstate(vcpu);
>                 kvm_vgic_flush_hwstate(vcpu);
>
> @@ -587,7 +587,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>                         local_irq_enable();
>                         kvm_timer_sync_hwstate(vcpu);
>                         kvm_vgic_sync_hwstate(vcpu);
> -                       preempt_enable();
> +                       migrate_enable();
>                         continue;
>                 }
>
> @@ -641,7 +641,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *run)
>
>                 kvm_vgic_sync_hwstate(vcpu);
>
> -               preempt_enable();
> +               migrate_enable();
>
>                 ret = handle_exit(vcpu, run, ret);
>         }
> diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
> index e4a0b8c..dec1156 100644
> --- a/kernel/irq/manage.c
> +++ b/kernel/irq/manage.c
> @@ -2135,7 +2135,7 @@ EXPORT_SYMBOL_GPL(irq_get_irqchip_state);
>   *     This call sets the internal irqchip state of an interrupt,
>   *     depending on the value of @which.
>   *
> - *     This function should be called with preemption disabled if the
> + *     This function should be called with migration disabled if the
>   *     interrupt controller has per-cpu registers.
>   */
>  int irq_set_irqchip_state(unsigned int irq, enum irqchip_irq_state which,

Without knowing the details of RT or migrate_enable/disable, this
looks fine to me.

-Christoffer
--
To unsubscribe from this list: send the line "unsubscribe linux-rt-users" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [RT Stable]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]

  Powered by Linux