From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760587AbXHGJEb (ORCPT ); Tue, 7 Aug 2007 05:04:31 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756320AbXHGJEY (ORCPT ); Tue, 7 Aug 2007 05:04:24 -0400 Received: from swsoft-mipt-nat.sw.ru ([195.214.233.10]:51313 "EHLO iris" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1755902AbXHGJEX (ORCPT ); Tue, 7 Aug 2007 05:04:23 -0400 Date: Tue, 7 Aug 2007 13:04:47 +0400 From: "Denis V. Lunev" To: den@openvz.org, dev@openvz.org, akpm@linux-foundation.org, gregkh@suse.de Cc: devel@openvz.org, linux-kernel@vger.kernel.org, xemul@openvz.org Subject: [PATCH] pci_get_device call from interrupt in reboot fixups Message-ID: <20070807090447.GA14294@iris.sw.ru> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.15 (2007-04-06) Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org The following calltrace is possible now: handle_sysrq machine_emergency_restart mach_reboot_fixups pci_get_device pci_get_subsys down_read The patch skips reboot fixup if called from sysrq-B code. --- --- ./arch/i386/kernel/reboot_fixups.c.fixup2 2007-08-07 12:30:30.000000000 +0400 +++ ./arch/i386/kernel/reboot_fixups.c 2007-08-07 12:31:22.000000000 +0400 @@ -11,6 +11,7 @@ #include #include #include +#include static void cs5530a_warm_reset(struct pci_dev *dev) { @@ -43,6 +44,11 @@ void mach_reboot_fixups(void) struct pci_dev *dev; int i; + /* we can be called from sysrq-B code. In such a case it is + * prohibited to dig PCI */ + if (in_interrupt()) + return; + for (i=0; i < ARRAY_SIZE(fixups_table); i++) { cur = &(fixups_table[i]); dev = pci_get_device(cur->vendor, cur->device, NULL);