lkml.org 
[lkml]   [2016]   [Nov]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 20/20] x86/pci/amd-bus: Convert to hotplug state machine
    Date
    Install the callbacks via the state machine and let the core invoke
    the callbacks on the already online CPUs.

    The smp_call_function_single() is dropped because the ONLINE callback is
    invoked on the target CPU since commit 1cf4f629d9d2 ("cpu/hotplug: Move
    online calls to hotplugged cpu"). smp_call_function_single() invokes the
    invoked function with interrupts disabled, but this calling convention is
    not preserved as the MSR is not modified by anything else than this code.

    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: x86@kernel.org
    Cc: linux-pci@vger.kernel.org
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    ---
    arch/x86/pci/amd_bus.c | 34 +++++++---------------------------
    1 file changed, 7 insertions(+), 27 deletions(-)

    diff --git a/arch/x86/pci/amd_bus.c b/arch/x86/pci/amd_bus.c
    index c20d2cc7ef64..ae387e5ee6f7 100644
    --- a/arch/x86/pci/amd_bus.c
    +++ b/arch/x86/pci/amd_bus.c
    @@ -327,35 +327,18 @@ static int __init early_root_info_init(void)

    #define ENABLE_CF8_EXT_CFG (1ULL << 46)

    -static void enable_pci_io_ecs(void *unused)
    +static int amd_bus_cpu_online(unsigned int cpu)
    {
    u64 reg;
    +
    rdmsrl(MSR_AMD64_NB_CFG, reg);
    if (!(reg & ENABLE_CF8_EXT_CFG)) {
    reg |= ENABLE_CF8_EXT_CFG;
    wrmsrl(MSR_AMD64_NB_CFG, reg);
    }
    + return 0;
    }

    -static int amd_cpu_notify(struct notifier_block *self, unsigned long action,
    - void *hcpu)
    -{
    - int cpu = (long)hcpu;
    - switch (action) {
    - case CPU_ONLINE:
    - case CPU_ONLINE_FROZEN:
    - smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0);
    - break;
    - default:
    - break;
    - }
    - return NOTIFY_OK;
    -}
    -
    -static struct notifier_block amd_cpu_notifier = {
    - .notifier_call = amd_cpu_notify,
    -};
    -
    static void __init pci_enable_pci_io_ecs(void)
    {
    #ifdef CONFIG_AMD_NB
    @@ -385,7 +368,7 @@ static void __init pci_enable_pci_io_ecs(void)

    static int __init pci_io_ecs_init(void)
    {
    - int cpu;
    + int ret;

    /* assume all cpus from fam10h have IO ECS */
    if (boot_cpu_data.x86 < 0x10)
    @@ -395,12 +378,9 @@ static int __init pci_io_ecs_init(void)
    if (early_pci_allowed())
    pci_enable_pci_io_ecs();

    - cpu_notifier_register_begin();
    - for_each_online_cpu(cpu)
    - amd_cpu_notify(&amd_cpu_notifier, (unsigned long)CPU_ONLINE,
    - (void *)(long)cpu);
    - __register_cpu_notifier(&amd_cpu_notifier);
    - cpu_notifier_register_done();
    + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "pci/amd_bus:online",
    + amd_bus_cpu_online, NULL);
    + WARN_ON(ret < 0);

    pci_probe |= PCI_HAS_IO_ECS;

    --
    2.10.2
    \
     
     \ /
      Last update: 2016-11-17 19:37    [W:4.098 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site