All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rui Wang <rui.y.wang@intel.com>
To: helgaas@kernel.org
Cc: tglx@linutronix.de, rjw@rjwysocki.net, tony.luck@intel.com,
	bhelgaas@google.com, linux-acpi@vger.kernel.org,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	rui.y.wang@intel.com
Subject: [PATCH V4 1/3] x86/ioapic: Support hot-removal of IOAPICs present during boot
Date: Wed, 22 Jun 2016 15:40:19 +0800	[thread overview]
Message-ID: <1466581219-20538-1-git-send-email-rui.y.wang@intel.com> (raw)
In-Reply-To: <20160616170958.GA7250@localhost>

v4: Add comments explaining when to call acpi_ioapic_add().
v3: Previous versions break mips. This version fixes it.

IOAPICs present during system boot aren't added to ioapic_list,
thus are unable to be hot-removed. Fix it by calling
acpi_ioapic_add() during root bus enumeration.

Signed-off-by: Rui Wang <rui.y.wang@intel.com>
---
 drivers/acpi/internal.h |  2 --
 drivers/acpi/ioapic.c   |  7 ++++---
 drivers/acpi/pci_root.c | 13 ++++++++++++-
 drivers/pci/setup-bus.c |  7 ++++++-
 include/linux/acpi.h    |  3 +++
 5 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 27cc7fe..6d8e67e 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -40,10 +40,8 @@ int acpi_sysfs_init(void);
 void acpi_container_init(void);
 void acpi_memory_hotplug_init(void);
 #ifdef	CONFIG_ACPI_HOTPLUG_IOAPIC
-int acpi_ioapic_add(struct acpi_pci_root *root);
 int acpi_ioapic_remove(struct acpi_pci_root *root);
 #else
-static inline int acpi_ioapic_add(struct acpi_pci_root *root) { return 0; }
 static inline int acpi_ioapic_remove(struct acpi_pci_root *root) { return 0; }
 #endif
 #ifdef CONFIG_ACPI_DOCK
diff --git a/drivers/acpi/ioapic.c b/drivers/acpi/ioapic.c
index ccdc8db..0f272e2 100644
--- a/drivers/acpi/ioapic.c
+++ b/drivers/acpi/ioapic.c
@@ -189,16 +189,17 @@ exit:
 	return AE_OK;
 }
 
-int acpi_ioapic_add(struct acpi_pci_root *root)
+int acpi_ioapic_add(acpi_handle root_handle)
 {
 	acpi_status status, retval = AE_OK;
 
-	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, root->device->handle,
+	status = acpi_walk_namespace(ACPI_TYPE_DEVICE, root_handle,
 				     UINT_MAX, handle_ioapic_add, NULL,
-				     root->device->handle, (void **)&retval);
+				     root_handle, (void **)&retval);
 
 	return ACPI_SUCCESS(status) && ACPI_SUCCESS(retval) ? 0 : -ENODEV;
 }
+EXPORT_SYMBOL_GPL(acpi_ioapic_add);
 
 int acpi_ioapic_remove(struct acpi_pci_root *root)
 {
diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
index ae3fe4e..31e4440 100644
--- a/drivers/acpi/pci_root.c
+++ b/drivers/acpi/pci_root.c
@@ -614,7 +614,18 @@ static int acpi_pci_root_add(struct acpi_device *device,
 	if (hotadd) {
 		pcibios_resource_survey_bus(root->bus);
 		pci_assign_unassigned_root_bus_resources(root->bus);
-		acpi_ioapic_add(root);
+
+		/*
+ 		 * This is only called for the hotadd case. For the boot-time
+ 		 * case, we need to wait until after PCI initialization in
+ 		 * order to deal with IOAPICs mapped in on a PCI BAR.
+ 		 *
+ 		 * This is currently x86-specific, because acpi_ioapic_add()
+ 		 * is an empty function without CONFIG_ACPI_HOTPLUG_IOAPIC.
+ 		 * And CONFIG_ACPI_HOTPLUG_IOAPIC depends on CONFIG_X86_IO_APIC
+ 		 * (see drivers/acpi/Kconfig).
+ 		 */
+		acpi_ioapic_add(root->device->handle);
 	}
 
 	pci_lock_rescan_remove();
diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
index 55641a3..0658921 100644
--- a/drivers/pci/setup-bus.c
+++ b/drivers/pci/setup-bus.c
@@ -25,6 +25,7 @@
 #include <linux/ioport.h>
 #include <linux/cache.h>
 #include <linux/slab.h>
+#include <linux/acpi.h>
 #include "pci.h"
 
 unsigned int pci_flags;
@@ -1779,8 +1780,12 @@ void __init pci_assign_unassigned_resources(void)
 {
 	struct pci_bus *root_bus;
 
-	list_for_each_entry(root_bus, &pci_root_buses, node)
+	list_for_each_entry(root_bus, &pci_root_buses, node) {
 		pci_assign_unassigned_root_bus_resources(root_bus);
+#ifdef CONFIG_X86
+		acpi_ioapic_add(ACPI_HANDLE(root_bus->bridge));
+#endif
+	}
 }
 
 void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 288fac5..3ed22df 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -262,6 +262,9 @@ int acpi_unmap_cpu(int cpu);
 
 #ifdef CONFIG_ACPI_HOTPLUG_IOAPIC
 int acpi_get_ioapic_id(acpi_handle handle, u32 gsi_base, u64 *phys_addr);
+int acpi_ioapic_add(acpi_handle root);
+#else
+static inline int acpi_ioapic_add(acpi_handle root) { return 0; }
 #endif
 
 int acpi_register_ioapic(acpi_handle handle, u64 phys_addr, u32 gsi_base);
-- 
1.8.3.1

  parent reply	other threads:[~2016-06-22  7:40 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-08  6:59 [PATCH V2 0/3] ioapic hot-removal bugs Rui Wang
2016-06-08  6:59 ` [PATCH V2 1/3] x86/ioapic: Support hot-removal of IOAPICs present during boot Rui Wang
2016-06-08  8:05   ` kbuild test robot
2016-06-08  8:05     ` kbuild test robot
2016-06-08  9:32   ` [PATCH V3 " Rui Wang
2016-06-10 12:57     ` Thomas Gleixner
2016-06-10 13:56       ` Rafael J. Wysocki
2016-06-10 16:43     ` Bjorn Helgaas
2016-06-12  6:06       ` Rui Wang
2016-06-16 17:09         ` Bjorn Helgaas
2016-06-22  7:13           ` Rui Wang
2016-06-22 14:53             ` Bjorn Helgaas
2016-06-24 15:18               ` Rui Wang
2016-06-22  7:40           ` Rui Wang [this message]
2016-06-22 15:14             ` [PATCH V4 " Bjorn Helgaas
2016-06-23  5:11               ` Unknown, 
2016-06-23  5:11                 ` 
2016-06-23  5:11                 ` 
2016-06-23 17:34                 ` Bjorn Helgaas
2016-06-24 15:30                   ` Rui Wang
2016-06-26  3:44                   ` [PATCH V5 " Rui Wang
2016-08-08 20:22                     ` Bjorn Helgaas
2016-08-09  3:23                       ` Rui Wang
2016-08-09 12:09                         ` Rafael J. Wysocki
2016-06-08  6:59 ` [PATCH V2 2/3] x86/ioapic: Fix wrong pointers in ioapic_setup_resources() Rui Wang
2016-06-10  9:45   ` [tip:x86/urgent] " tip-bot for Rui Wang
2016-06-10 12:01   ` [tip:x86/apic] x86/ioapic: Fix incorrect " tip-bot for Rui Wang
2016-06-10 12:48   ` [tip:x86/urgent] " tip-bot for Rui Wang
2016-06-08  6:59 ` [PATCH V2 3/3] x86/ioapic: Simplify ioapic_setup_resources() Rui Wang
2016-06-10  9:48   ` [tip:x86/apic] " tip-bot for Rui Wang
2016-06-10 12:54   ` tip-bot for Rui Wang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1466581219-20538-1-git-send-email-rui.y.wang@intel.com \
    --to=rui.y.wang@intel.com \
    --cc=bhelgaas@google.com \
    --cc=helgaas@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=rjw@rjwysocki.net \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.