lkml.org 
[lkml]   [2021]   [Jul]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 106/149] PCI: iproc: Fix multi-MSI base vector number allocation
    Date
    From: Sandor Bodo-Merle <sbodomerle@gmail.com>

    [ Upstream commit e673d697b9a234fc3544ac240e173cef8c82b349 ]

    Commit fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    introduced multi-MSI support with a broken allocation mechanism (it failed
    to reserve the proper number of bits from the inner domain). Natural
    alignment of the base vector number was also not guaranteed.

    Link: https://lore.kernel.org/r/20210622152630.40842-1-sbodomerle@gmail.com
    Fixes: fc54bae28818 ("PCI: iproc: Allow allocation of multiple MSIs")
    Reported-by: Pali Rohár <pali@kernel.org>
    Signed-off-by: Sandor Bodo-Merle <sbodomerle@gmail.com>
    Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
    Acked-by: Marc Zyngier <maz@kernel.org>
    Acked-by: Pali Rohár <pali@kernel.org>
    Acked-by: Ray Jui <ray.jui@broadcom.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/pci/controller/pcie-iproc-msi.c | 21 +++++++++++----------
    1 file changed, 11 insertions(+), 10 deletions(-)

    diff --git a/drivers/pci/controller/pcie-iproc-msi.c b/drivers/pci/controller/pcie-iproc-msi.c
    index f40d17b285c5..b77811dcead1 100644
    --- a/drivers/pci/controller/pcie-iproc-msi.c
    +++ b/drivers/pci/controller/pcie-iproc-msi.c
    @@ -252,18 +252,18 @@ static int iproc_msi_irq_domain_alloc(struct irq_domain *domain,

    mutex_lock(&msi->bitmap_lock);

    - /* Allocate 'nr_cpus' number of MSI vectors each time */
    - hwirq = bitmap_find_next_zero_area(msi->bitmap, msi->nr_msi_vecs, 0,
    - msi->nr_cpus, 0);
    - if (hwirq < msi->nr_msi_vecs) {
    - bitmap_set(msi->bitmap, hwirq, msi->nr_cpus);
    - } else {
    - mutex_unlock(&msi->bitmap_lock);
    - return -ENOSPC;
    - }
    + /*
    + * Allocate 'nr_irqs' multiplied by 'nr_cpus' number of MSI vectors
    + * each time
    + */
    + hwirq = bitmap_find_free_region(msi->bitmap, msi->nr_msi_vecs,
    + order_base_2(msi->nr_cpus * nr_irqs));

    mutex_unlock(&msi->bitmap_lock);

    + if (hwirq < 0)
    + return -ENOSPC;
    +
    for (i = 0; i < nr_irqs; i++) {
    irq_domain_set_info(domain, virq + i, hwirq + i,
    &iproc_msi_bottom_irq_chip,
    @@ -284,7 +284,8 @@ static void iproc_msi_irq_domain_free(struct irq_domain *domain,
    mutex_lock(&msi->bitmap_lock);

    hwirq = hwirq_to_canonical_hwirq(msi, data->hwirq);
    - bitmap_clear(msi->bitmap, hwirq, msi->nr_cpus);
    + bitmap_release_region(msi->bitmap, hwirq,
    + order_base_2(msi->nr_cpus * nr_irqs));

    mutex_unlock(&msi->bitmap_lock);

    --
    2.30.2


    \
     
     \ /
      Last update: 2021-07-19 19:11    [W:4.137 / U:0.728 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site