• Dmitry Safonov's avatar
    iommu/vt-d: Ratelimit each dmar fault printing · 6c50d79f
    Dmitry Safonov authored
    There is a ratelimit for printing, but it's incremented each time the
    cpu recives dmar fault interrupt. While one interrupt may signal about
    *many* faults.
    So, measuring the impact it turns out that reading/clearing one fault
    takes < 1 usec, and printing info about the fault takes ~170 msec.
    
    Having in mind that maximum number of fault recording registers per
    remapping hardware unit is 256.. IRQ handler may run for (170*256) msec.
    And as fault-serving loop runs without a time limit, during servicing
    new faults may occur..
    
    Ratelimit each fault printing rather than each irq printing.
    
    Fixes: commit c43fce4e ("iommu/vt-d: Ratelimit fault handler")
    
    BUG: spinlock lockup suspected on CPU#0, CliShell/9903
     lock: 0xffffffff81a47440, .magic: dead4ead, .owner: kworker/u16:2/8915, .owner_cpu: 6
    CPU: 0 PID: 9903 Comm: CliShell
    Call Trace:$\n'
    [..] dump_stack+0x65/0x83$\n'
    [..] spin_dump+0x8f/0x94$\n'
    [..] do_raw_spin_lock+0x123/0x170$\n'
    [..] _raw_spin_lock_irqsave+0x32/0x3a$\n'
    [..] uart_chars_in_buffer+0x20/0x4d$\n'
    [..] tty_chars_in_buffer+0x18/0x1d$\n'
    [..] n_tty_poll+0x1cb/0x1f2$\n'
    [..] tty_poll+0x5e/0x76$\n'
    [..] do_select+0x363/0x629$\n'
    [..] compat_core_sys_select+0x19e/0x239$\n'
    [..] compat_SyS_select+0x98/0xc0$\n'
    [..] sysenter_dispatch+0x7/0x25$\n'
    [..]
    NMI backtrace for cpu 6
    CPU: 6 PID: 8915 Comm: kworker/u16:2
    Workqueue: dmar_fault dmar_fault_work
    Call Trace:$\n'
    [..] wait_for_xmitr+0x26/0x8f$\n'
    [..] serial8250_console_putchar+0x1c/0x2c$\n'
    [..] uart_console_write+0x40/0x4b$\n'
    [..] serial8250_console_write+0xe6/0x13f$\n'
    [..] call_console_drivers.constprop.13+0xce/0x103$\n'
    [..] console_unlock+0x1f8/0x39b$\n'
    [..] vprintk_emit+0x39e/0x3e6$\n'
    [..] printk+0x4d/0x4f$\n'
    [..] dmar_fault+0x1a8/0x1fc$\n'
    [..] dmar_fault_work+0x15/0x17$\n'
    [..] process_one_work+0x1e8/0x3a9$\n'
    [..] worker_thread+0x25d/0x345$\n'
    [..] kthread+0xea/0xf2$\n'
    [..] ret_from_fork+0x58/0x90$\n'
    
    Cc: Alex Williamson <alex.williamson@redhat.com>
    Cc: David Woodhouse <dwmw2@infradead.org>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Joerg Roedel <joro@8bytes.org>
    Cc: Lu Baolu <baolu.lu@linux.intel.com>
    Cc: iommu@lists.linux-foundation.org
    Signed-off-by: default avatarDmitry Safonov <dima@arista.com>
    Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
    6c50d79f
dmar.c 50 KB