lkml.org 
[lkml]   [2020]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.5 359/399] irqchip/gic-v3: Only provision redistributors that are enabled in ACPI
    Date
    From: Marc Zyngier <maz@kernel.org>

    [ Upstream commit 926b5dfa6b8dc666ff398044af6906b156e1d949 ]

    We currently allocate redistributor region structures for
    individual redistributors when ACPI doesn't present us with
    compact MMIO regions covering multiple redistributors.

    It turns out that we allocate these structures even when
    the redistributor is flagged as disabled by ACPI. It works
    fine until someone actually tries to tarse one of these
    structures, and access the corresponding MMIO region.

    Instead, track the number of enabled redistributors, and
    only allocate what is required. This makes sure that there
    is no invalid data to misuse.

    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Reported-by: Heyi Guo <guoheyi@huawei.com>
    Tested-by: Heyi Guo <guoheyi@huawei.com>
    Link: https://lore.kernel.org/r/20191216062745.63397-1-guoheyi@huawei.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/irqchip/irq-gic-v3.c | 9 +++++++--
    1 file changed, 7 insertions(+), 2 deletions(-)

    diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c
    index d6218012097b4..3f5baa5043db4 100644
    --- a/drivers/irqchip/irq-gic-v3.c
    +++ b/drivers/irqchip/irq-gic-v3.c
    @@ -1821,6 +1821,7 @@ static struct
    struct redist_region *redist_regs;
    u32 nr_redist_regions;
    bool single_redist;
    + int enabled_rdists;
    u32 maint_irq;
    int maint_irq_mode;
    phys_addr_t vcpu_base;
    @@ -1915,8 +1916,10 @@ static int __init gic_acpi_match_gicc(union acpi_subtable_headers *header,
    * If GICC is enabled and has valid gicr base address, then it means
    * GICR base is presented via GICC
    */
    - if ((gicc->flags & ACPI_MADT_ENABLED) && gicc->gicr_base_address)
    + if ((gicc->flags & ACPI_MADT_ENABLED) && gicc->gicr_base_address) {
    + acpi_data.enabled_rdists++;
    return 0;
    + }

    /*
    * It's perfectly valid firmware can pass disabled GICC entry, driver
    @@ -1946,8 +1949,10 @@ static int __init gic_acpi_count_gicr_regions(void)

    count = acpi_table_parse_madt(ACPI_MADT_TYPE_GENERIC_INTERRUPT,
    gic_acpi_match_gicc, 0);
    - if (count > 0)
    + if (count > 0) {
    acpi_data.single_redist = true;
    + count = acpi_data.enabled_rdists;
    + }

    return count;
    }
    --
    2.20.1


    \
     
     \ /
      Last update: 2020-02-21 09:01    [W:4.538 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site