lkml.org 
[lkml]   [2014]   [Nov]   [2]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[Patch v8 14/18] x86, irq, ACPI: Introduce a rwsem to protect IOAPIC operations from hotplug
    Date
    We are going to support ACPI based IOAPIC hotplug, so introduce a rwsem
    to protect IOAPIC data structures from IOAPIC hotplug. We choose to
    serialize in ACPI instead of in the IOAPIC core because:
    1) currently we are only plan to support ACPI based IOAPIC hotplug
    2) it's much more cleaner and easier
    3) It does't affect IOAPIC discovered by devicetree, SFI and mpparse.

    Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com>
    ---
    arch/x86/kernel/acpi/boot.c | 21 +++++++++++++++++++++
    1 file changed, 21 insertions(+)

    diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
    index e077c080a519..96d775580821 100644
    --- a/arch/x86/kernel/acpi/boot.c
    +++ b/arch/x86/kernel/acpi/boot.c
    @@ -76,6 +76,19 @@ int acpi_fix_pin2_polarity __initdata;
    static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE;
    #endif

    +/*
    + * Locks related to IOAPIC hotplug
    + * Hotplug side:
    + * ->lock_device_hotplug() //device_hotplug_lock
    + * ->acpi_ioapic_lock
    + * ->ioapic_lock
    + * Interrupt mapping side:
    + * ->acpi_ioapic_lock
    + * ->ioapic_mutex
    + * ->ioapic_lock
    + */
    +static DEFINE_MUTEX(acpi_ioapic_lock);
    +
    /* --------------------------------------------------------------------------
    Boot-time Configuration
    -------------------------------------------------------------------------- */
    @@ -609,8 +622,10 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irqp)
    if (acpi_irq_model == ACPI_IRQ_MODEL_PIC) {
    *irqp = gsi;
    } else {
    + mutex_lock(&acpi_ioapic_lock);
    irq = mp_map_gsi_to_irq(gsi,
    IOAPIC_MAP_ALLOC | IOAPIC_MAP_CHECK);
    + mutex_unlock(&acpi_ioapic_lock);
    if (irq < 0)
    return -1;
    *irqp = irq;
    @@ -651,7 +666,9 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
    int irq = gsi;

    #ifdef CONFIG_X86_IO_APIC
    + mutex_lock(&acpi_ioapic_lock);
    irq = mp_register_gsi(dev, gsi, trigger, polarity);
    + mutex_unlock(&acpi_ioapic_lock);
    #endif

    return irq;
    @@ -660,7 +677,9 @@ static int acpi_register_gsi_ioapic(struct device *dev, u32 gsi,
    static void acpi_unregister_gsi_ioapic(u32 gsi)
    {
    #ifdef CONFIG_X86_IO_APIC
    + mutex_lock(&acpi_ioapic_lock);
    mp_unregister_gsi(gsi);
    + mutex_unlock(&acpi_ioapic_lock);
    #endif
    }

    @@ -1186,7 +1205,9 @@ static void __init acpi_process_madt(void)
    /*
    * Parse MADT IO-APIC entries
    */
    + mutex_lock(&acpi_ioapic_lock);
    error = acpi_parse_madt_ioapic_entries();
    + mutex_unlock(&acpi_ioapic_lock);
    if (!error) {
    acpi_set_irq_model_ioapic();

    --
    1.7.10.4


    \
     
     \ /
      Last update: 2014-11-02 07:41    [W:2.922 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site