• Johan Hovold's avatar
    irqdomain: Switch to per-domain locking · 9dbb8e34
    Johan Hovold authored
    The IRQ domain structures are currently protected by the global
    irq_domain_mutex. Switch to using more fine-grained per-domain locking,
    which can speed up parallel probing by reducing lock contention.
    
    On a recent arm64 laptop, the total time spent waiting for the locks
    during boot drops from 160 to 40 ms on average, while the maximum
    aggregate wait time drops from 550 to 90 ms over ten runs for example.
    
    Note that the domain lock of the root domain (innermost domain) must be
    used for hierarchical domains. For non-hierarchical domains (as for root
    domains), the new root pointer is set to the domain itself so that
    &domain->root->mutex always points to the right lock.
    
    Also note that hierarchical domains should be constructed using
    irq_domain_create_hierarchy() (or irq_domain_add_hierarchy()) to avoid
    having racing allocations access a not fully initialised domain. As a
    safeguard, the lockdep assertion in irq_domain_set_mapping() will catch
    any offenders that also fail to set the root domain pointer.
    Tested-by: default avatarHsin-Yi Wang <hsinyi@chromium.org>
    Tested-by: default avatarMark-PK Tsai <mark-pk.tsai@mediatek.com>
    Signed-off-by: default avatarJohan Hovold <johan+linaro@kernel.org>
    Signed-off-by: default avatarMarc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20230213104302.17307-21-johan+linaro@kernel.org
    9dbb8e34
irqdomain.c 54 KB