From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754145AbbGAO5w (ORCPT ); Wed, 1 Jul 2015 10:57:52 -0400 Received: from www.linutronix.de ([62.245.132.108]:39180 "EHLO Galois.linutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754494AbbGAO5p (ORCPT ); Wed, 1 Jul 2015 10:57:45 -0400 Date: Wed, 1 Jul 2015 16:57:43 +0200 (CEST) From: Thomas Gleixner To: Andriy Gapon cc: "linux-kernel@vger.kernel.org" Subject: Re: clockevents_shutdown vs pending interrupt In-Reply-To: <5593B6AF.9090705@FreeBSD.org> Message-ID: References: <55892D34.7060504@FreeBSD.org> <5593B6AF.9090705@FreeBSD.org> User-Agent: Alpine 2.11 (DEB 23 2013-08-11) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Linutronix-Spam-Score: -1.0 X-Linutronix-Spam-Level: - X-Linutronix-Spam-Status: No , -1.0 points, 5.0 required, ALL_TRUSTED=-1,SHORTCIRCUIT=-0.0001 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Andriy, On Wed, 1 Jul 2015, Andriy Gapon wrote: > I've caught a couple of boot logs with different stack traces from unsuccessful > boot attempts and one from a successful attempt with exactly the same VM > configuration. > The logs are here: > https://people.freebsd.org/~avg/linux-boot-hang/ I have to admit, that I'm thoroughly confused about that broadcast check in the install path. Can you apply the debug patch below and provide the output? Thanks, tglx --- diff --git a/kernel/time/tick-broadcast.c b/kernel/time/tick-broadcast.c index d39f32cdd1b5..f1f921a49da9 100644 --- a/kernel/time/tick-broadcast.c +++ b/kernel/time/tick-broadcast.c @@ -100,6 +100,7 @@ void tick_install_broadcast_device(struct clock_event_device *dev) if (cur) cur->event_handler = clockevents_handle_noop; tick_broadcast_device.evtdev = dev; + pr_err("Install broadcast device %p %s\n", dev, dev->name); if (!cpumask_empty(tick_broadcast_mask)) tick_broadcast_start_periodic(dev); /* @@ -301,6 +302,13 @@ static void tick_handle_periodic_broadcast(struct clock_event_device *dev) bool bc_local; raw_spin_lock(&tick_broadcast_lock); + /* Handle spurious interrupt */ + if (clockevent_state_shutdown(dev)) { + pr_err("Spurious broadcast event %p %s\n", dev, dev->name); + raw_spin_unlock(&tick_broadcast_lock); + return; + } + bc_local = tick_do_periodic_broadcast(); if (clockevent_state_oneshot(dev)) { diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c index 76446cb5dfe1..ecd439b2de7e 100644 --- a/kernel/time/tick-common.c +++ b/kernel/time/tick-common.c @@ -321,6 +321,7 @@ void tick_check_new_device(struct clock_event_device *newdev) if (!try_module_get(newdev->owner)) return; + pr_err("Install per cpu tick device %p %s\n", newdev, newdev->name); /* * Replace the eventually existing device by the new * device. If the current device is the broadcast device, do