lkml.org 
[lkml]   [2016]   [Jun]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 41/56] xen/events: Don't move disabled irqs
    Date
    From: Ross Lagerwall <ross.lagerwall@citrix.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit f0f393877c71ad227d36705d61d1e4062bc29cf5 upstream.

    Commit ff1e22e7a638 ("xen/events: Mask a moving irq") open-coded
    irq_move_irq() but left out checking if the IRQ is disabled. This broke
    resuming from suspend since it tries to move a (disabled) irq without
    holding the IRQ's desc->lock. Fix it by adding in a check for disabled
    IRQs.

    The resulting stacktrace was:
    kernel BUG at /build/linux-UbQGH5/linux-4.4.0/kernel/irq/migration.c:31!
    invalid opcode: 0000 [#1] SMP
    Modules linked in: xenfs xen_privcmd ...
    CPU: 0 PID: 9 Comm: migration/0 Not tainted 4.4.0-22-generic #39-Ubuntu
    Hardware name: Xen HVM domU, BIOS 4.6.1-xs125180 05/04/2016
    task: ffff88003d75ee00 ti: ffff88003d7bc000 task.ti: ffff88003d7bc000
    RIP: 0010:[<ffffffff810e26e2>] [<ffffffff810e26e2>] irq_move_masked_irq+0xd2/0xe0
    RSP: 0018:ffff88003d7bfc50 EFLAGS: 00010046
    RAX: 0000000000000000 RBX: ffff88003d40ba00 RCX: 0000000000000001
    RDX: 0000000000000001 RSI: 0000000000000100 RDI: ffff88003d40bad8
    RBP: ffff88003d7bfc68 R08: 0000000000000000 R09: ffff88003d000000
    R10: 0000000000000000 R11: 000000000000023c R12: ffff88003d40bad0
    R13: ffffffff81f3a4a0 R14: 0000000000000010 R15: 00000000ffffffff
    FS: 0000000000000000(0000) GS:ffff88003da00000(0000) knlGS:0000000000000000
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 00007fd4264de624 CR3: 0000000037922000 CR4: 00000000003406f0
    DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
    Stack:
    ffff88003d40ba38 0000000000000024 0000000000000000 ffff88003d7bfca0
    ffffffff814c8d92 00000010813ef89d 00000000805ea732 0000000000000009
    0000000000000024 ffff88003cc39b80 ffff88003d7bfce0 ffffffff814c8f66
    Call Trace:
    [<ffffffff814c8d92>] eoi_pirq+0xb2/0xf0
    [<ffffffff814c8f66>] __startup_pirq+0xe6/0x150
    [<ffffffff814ca659>] xen_irq_resume+0x319/0x360
    [<ffffffff814c7e75>] xen_suspend+0xb5/0x180
    [<ffffffff81120155>] multi_cpu_stop+0xb5/0xe0
    [<ffffffff811200a0>] ? cpu_stop_queue_work+0x80/0x80
    [<ffffffff811203d0>] cpu_stopper_thread+0xb0/0x140
    [<ffffffff810a94e6>] ? finish_task_switch+0x76/0x220
    [<ffffffff810ca731>] ? __raw_callee_save___pv_queued_spin_unlock+0x11/0x20
    [<ffffffff810a3935>] smpboot_thread_fn+0x105/0x160
    [<ffffffff810a3830>] ? sort_range+0x30/0x30
    [<ffffffff810a0588>] kthread+0xd8/0xf0
    [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0
    [<ffffffff8182568f>] ret_from_fork+0x3f/0x70
    [<ffffffff810a04b0>] ? kthread_create_on_node+0x1e0/0x1e0

    Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
    Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
    Signed-off-by: David Vrabel <david.vrabel@citrix.com>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/xen/events.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    diff --git a/drivers/xen/events.c b/drivers/xen/events.c
    index 3715a54117bb..19bd74cf0aba 100644
    --- a/drivers/xen/events.c
    +++ b/drivers/xen/events.c
    @@ -576,7 +576,8 @@ static void eoi_pirq(struct irq_data *data)
    if (!VALID_EVTCHN(evtchn))
    return;

    - if (unlikely(irqd_is_setaffinity_pending(data))) {
    + if (unlikely(irqd_is_setaffinity_pending(data)) &&
    + likely(!irqd_irq_disabled(data))) {
    int masked = test_and_set_mask(evtchn);

    clear_evtchn(evtchn);
    @@ -1616,7 +1617,8 @@ static void ack_dynirq(struct irq_data *data)
    if (!VALID_EVTCHN(evtchn))
    return;

    - if (unlikely(irqd_is_setaffinity_pending(data))) {
    + if (unlikely(irqd_is_setaffinity_pending(data)) &&
    + likely(!irqd_irq_disabled(data))) {
    int masked = test_and_set_mask(evtchn);

    clear_evtchn(evtchn);
    --
    2.9.0
    \
     
     \ /
      Last update: 2016-06-15 10:21    [W:3.048 / U:0.300 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site