Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752226AbdGDHKT (ORCPT ); Tue, 4 Jul 2017 03:10:19 -0400 Received: from merlin.infradead.org ([205.233.59.134]:47758 "EHLO merlin.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750830AbdGDHKR (ORCPT ); Tue, 4 Jul 2017 03:10:17 -0400 Date: Tue, 4 Jul 2017 09:09:58 +0200 From: Peter Zijlstra To: Marc Gonzalez Cc: Bjorn Helgaas , Marc Zyngier , Thomas Gleixner , linux-pci , Linux ARM , LKML , Mason , Thibaud Cornic , Mark Rutland , Ard Biesheuvel , Greg Kroah-Hartman , Ingo Molnar Subject: Re: [PATCH v9 2/3] PCI: Add tango PCIe host bridge support Message-ID: <20170704070958.oolhapyx7uy2fly4@hirez.programming.kicks-ass.net> References: <987fac41-80dc-f1d0-ec0b-91ae57b91bfd@sigmadesigns.com> <20170702231811.GJ18324@bhelgaas-glaptop.roam.corp.google.com> <79382219-c730-da78-3e5f-5abf3173d7ac@sigmadesigns.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3820 Lines: 70 On Mon, Jul 03, 2017 at 05:30:28PM +0200, Marc Gonzalez wrote: > And at the end of smp8759_config_read: > > printk("in_atomic_preempt_off = %d\n", in_atomic_preempt_off()); That's confused... > stop_machine(do_nothing, NULL, NULL); > panic("STOP HERE FOR NOW\n"); > > The kernel outputs: > > [ 1.022725] in_atomic_preempt_off = 0 > [ 1.026568] BUG: scheduling while atomic: swapper/0/1/0x00000002 > [ 1.032625] 5 locks held by swapper/0/1: > [ 1.036575] #0: (&dev->mutex){......}, at: [] __driver_attach+0x50/0xd0 > [ 1.044319] #1: (&dev->mutex){......}, at: [] __driver_attach+0x60/0xd0 > [ 1.052050] #2: (pci_lock){+.+...}, at: [] pci_bus_read_config_dword+0x44/0x94 This is a raw_spinlock_t, that disables preemption > [ 1.060398] #3: (cpu_hotplug.dep_map){++++++}, at: [] get_online_cpus+0x2c/0xa0 > [ 1.068843] #4: (stop_cpus_mutex){+.+...}, at: [] stop_cpus+0x20/0x48 > [ 1.076404] Modules linked in: > [ 1.079483] Preemption disabled at:[ 1.082820] [< (null)>] (null) > [ 1.086165] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.9.23-1-rc4 #13 > [ 1.092723] Hardware name: Sigma Tango DT > [ 1.096765] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) > [ 1.104558] [] (show_stack) from [] (dump_stack+0x98/0xc4) > [ 1.111823] [] (dump_stack) from [] (__schedule_bug+0x94/0xec) > [ 1.119436] [] (__schedule_bug) from [] (__schedule+0x4a4/0x5f0) > [ 1.127220] [] (__schedule) from [] (schedule+0x4c/0xac) And here you try and schedule with preemption disabled. > [ 1.134308] [] (schedule) from [] (schedule_timeout+0x1f4/0x30c) > [ 1.142093] [] (schedule_timeout) from [] (wait_for_common+0x8c/0x13c) > [ 1.150401] [] (wait_for_common) from [] (wait_for_completion+0x10/0x14) > [ 1.158886] [] (wait_for_completion) from [] (__stop_cpus+0x50/0x64) > [ 1.167021] [] (__stop_cpus) from [] (stop_cpus+0x30/0x48) > [ 1.174282] [] (stop_cpus) from [] (stop_machine+0x84/0x118) > [ 1.181719] [] (stop_machine) from [] (smp8759_config_read+0x84/0x90) > [ 1.189942] [] (smp8759_config_read) from [] (pci_bus_read_config_dword+0x6c/0x94) > [ 1.199301] [] (pci_bus_read_config_dword) from [] (pci_bus_read_dev_vendor_id+0x24/0xe8) > [ 1.209270] [] (pci_bus_read_dev_vendor_id) from [] (pci_scan_single_device+0x40/0xb0) > [ 1.218977] [] (pci_scan_single_device) from [] (pci_scan_slot+0x58/0x100) > [ 1.227636] [] (pci_scan_slot) from [] (pci_scan_child_bus+0x20/0xf8) > [ 1.235858] [] (pci_scan_child_bus) from [] (pci_scan_root_bus_msi+0xcc/0xd8) > [ 1.244779] [] (pci_scan_root_bus_msi) from [] (pci_scan_root_bus+0x18/0x20) > [ 1.253612] [] (pci_scan_root_bus) from [] (pci_host_common_probe+0xc8/0x314) > [ 1.262533] [] (pci_host_common_probe) from [] (tango_pcie_probe+0x148/0x350) > [ 1.271455] [] (tango_pcie_probe) from [] (platform_drv_probe+0x34/0x6c) > The panic call stack looks suspicious. > > smp8759_config_read() never calls tango_check_pcie_link(). > > (I compile with -fno-optimize-sibling-calls to get more accurate > call stacks.) > > in_atomic_preempt_off is false before calling stop_machine() Yes, but that's a pointless statement. > I suppose I'm doing something wrong, but I'm not sure what yet. Using stop_machine() is per definition doing it wrong ;-) But see above.