[PATCH] irqchip/gic-v3: change pr_debug message to pr_devel
Marc Zyngier
marc.zyngier at arm.com
Fri Feb 2 06:28:46 PST 2018
On 02/02/18 14:20, Mark Salter wrote:
> The pr_debug() in gic-v3 gic_send_sgi() can trigger a circular locking
> warning:
>
> GICv3: CPU10: ICC_SGI1R_EL1 5000400
> ======================================================
> WARNING: possible circular locking dependency detected
> 4.15.0+ #1 Tainted: G W
> ------------------------------------------------------
> dynamic_debug01/1873 is trying to acquire lock:
> ((console_sem).lock){-...}, at: [<0000000099c891ec>] down_trylock+0x20/0x4c
>
> but task is already holding lock:
> (&rq->lock){-.-.}, at: [<00000000842e1587>] __task_rq_lock+0x54/0xdc
>
> which lock already depends on the new lock.
>
> the existing dependency chain (in reverse order) is:
>
> -> #2 (&rq->lock){-.-.}:
> __lock_acquire+0x3b4/0x6e0
> lock_acquire+0xf4/0x2a8
> _raw_spin_lock+0x4c/0x60
> task_fork_fair+0x3c/0x148
> sched_fork+0x10c/0x214
> copy_process.isra.32.part.33+0x4e8/0x14f0
> _do_fork+0xe8/0x78c
> kernel_thread+0x48/0x54
> rest_init+0x34/0x2a4
> start_kernel+0x45c/0x488
>
> -> #1 (&p->pi_lock){-.-.}:
> __lock_acquire+0x3b4/0x6e0
> lock_acquire+0xf4/0x2a8
> _raw_spin_lock_irqsave+0x58/0x70
> try_to_wake_up+0x48/0x600
> wake_up_process+0x28/0x34
> __up.isra.0+0x60/0x6c
> up+0x60/0x68
> __up_console_sem+0x4c/0x7c
> console_unlock+0x328/0x634
> vprintk_emit+0x25c/0x390
> dev_vprintk_emit+0xc4/0x1fc
> dev_printk_emit+0x88/0xa8
> __dev_printk+0x58/0x9c
> _dev_info+0x84/0xa8
> usb_new_device+0x100/0x474
> hub_port_connect+0x280/0x92c
> hub_event+0x740/0xa84
> process_one_work+0x240/0x70c
> worker_thread+0x60/0x400
> kthread+0x110/0x13c
> ret_from_fork+0x10/0x18
>
> -> #0 ((console_sem).lock){-...}:
> validate_chain.isra.34+0x6e4/0xa20
> __lock_acquire+0x3b4/0x6e0
> lock_acquire+0xf4/0x2a8
> _raw_spin_lock_irqsave+0x58/0x70
> down_trylock+0x20/0x4c
> __down_trylock_console_sem+0x3c/0x9c
> console_trylock+0x20/0xb0
> vprintk_emit+0x254/0x390
> vprintk_default+0x58/0x90
> vprintk_func+0xbc/0x164
> printk+0x80/0xa0
> __dynamic_pr_debug+0x84/0xac
> gic_raise_softirq+0x184/0x18c
> smp_cross_call+0xac/0x218
> smp_send_reschedule+0x3c/0x48
> resched_curr+0x60/0x9c
> check_preempt_curr+0x70/0xdc
> wake_up_new_task+0x310/0x470
> _do_fork+0x188/0x78c
> SyS_clone+0x44/0x50
> __sys_trace_return+0x0/0x4
>
> other info that might help us debug this:
>
> Chain exists of:
> (console_sem).lock --> &p->pi_lock --> &rq->lock
>
> Possible unsafe locking scenario:
>
> CPU0 CPU1
> ---- ----
> lock(&rq->lock);
> lock(&p->pi_lock);
> lock(&rq->lock);
> lock((console_sem).lock);
>
> *** DEADLOCK ***
>
> 2 locks held by dynamic_debug01/1873:
> #0: (&p->pi_lock){-.-.}, at: [<000000001366df53>] wake_up_new_task+0x40/0x470
> #1: (&rq->lock){-.-.}, at: [<00000000842e1587>] __task_rq_lock+0x54/0xdc
>
> stack backtrace:
> CPU: 10 PID: 1873 Comm: dynamic_debug01 Tainted: G W 4.15.0+ #1
> Hardware name: GIGABYTE R120-T34-00/MT30-GS2-00, BIOS T48 10/02/2017
> Call trace:
> dump_backtrace+0x0/0x188
> show_stack+0x24/0x2c
> dump_stack+0xa4/0xe0
> print_circular_bug.isra.31+0x29c/0x2b8
> check_prev_add.constprop.39+0x6c8/0x6dc
> validate_chain.isra.34+0x6e4/0xa20
> __lock_acquire+0x3b4/0x6e0
> lock_acquire+0xf4/0x2a8
> _raw_spin_lock_irqsave+0x58/0x70
> down_trylock+0x20/0x4c
> __down_trylock_console_sem+0x3c/0x9c
> console_trylock+0x20/0xb0
> vprintk_emit+0x254/0x390
> vprintk_default+0x58/0x90
> vprintk_func+0xbc/0x164
> printk+0x80/0xa0
> __dynamic_pr_debug+0x84/0xac
> gic_raise_softirq+0x184/0x18c
> smp_cross_call+0xac/0x218
> smp_send_reschedule+0x3c/0x48
> resched_curr+0x60/0x9c
> check_preempt_curr+0x70/0xdc
> wake_up_new_task+0x310/0x470
> _do_fork+0x188/0x78c
> SyS_clone+0x44/0x50
> __sys_trace_return+0x0/0x4
> GICv3: CPU0: ICC_SGI1R_EL1 12000
>
> This could be fixed with printk_deferred() but that might lessen its
> usefulness for debugging. So change it to pr_devel to keep it out of
> production kernels. Developers working on gic-v3 can enable it as
> needed in their kernels.
>
> Signed-off-by: Mark Salter <msalter at redhat.com>
> ---
> drivers/irqchip/irq-gic-v3.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
> index a57c0fbbd34a..d71be9a1f9d2 100644
> --- a/drivers/irqchip/irq-gic-v3.c
> +++ b/drivers/irqchip/irq-gic-v3.c
> @@ -673,7 +673,7 @@ static void gic_send_sgi(u64 cluster_id, u16 tlist, unsigned int irq)
> MPIDR_TO_SGI_RS(cluster_id) |
> tlist << ICC_SGI1R_TARGET_LIST_SHIFT);
>
> - pr_debug("CPU%d: ICC_SGI1R_EL1 %llx\n", smp_processor_id(), val);
> + pr_devel("CPU%d: ICC_SGI1R_EL1 %llx\n", smp_processor_id(), val);
> gic_write_sgi1r(val);
> }
>
>
Queued, thanks.
M.
--
Jazz is not dead. It just smells funny...
More information about the linux-arm-kernel
mailing list