Thread (29 messages) 29 messages, 3 authors, 2023-02-11

Re: [PATCH v5 19/19] irqdomain: Switch to per-domain locking

From: Johan Hovold <johan@kernel.org>
Date: 2023-02-11 11:35:00
Also in: linux-mips, lkml, platform-driver-x86

On Fri, Feb 10, 2023 at 03:06:37PM +0000, Marc Zyngier wrote:
On Fri, 10 Feb 2023 12:57:40 +0000,
Johan Hovold [off-list ref] wrote:
quoted
On Fri, Feb 10, 2023 at 11:38:58AM +0000, Marc Zyngier wrote:
quoted
On Fri, 10 Feb 2023 09:56:03 +0000,
Johan Hovold [off-list ref] wrote:
 
quoted
quoted
quoted
quoted
quoted
@@ -1132,6 +1147,7 @@ struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,
 	else
 		domain = irq_domain_create_tree(fwnode, ops, host_data);
 	if (domain) {
+		domain->root = parent->root;
 		domain->parent = parent;
 		domain->flags |= flags;
So we still have a bug here, as we have published a domain that we
keep updating. A parallel probing could find it in the interval and do
something completely wrong.
Indeed we do, even if device links should make this harder to hit these
days.
quoted
Splitting the work would help, as per the following patch.
Looks good to me. Do you want to submit that as a patch that I'll rebase
on or should I submit it as part of a v6?
Just take it directly.
Ok, thanks.
I've added a commit message and turned it into a patch to include in v6
now:

commit 3af395aa894c7df94ef2337e572e5e1710b4bbda (HEAD -> work)
Author: Marc Zyngier [off-list ref]
Date:   Thu Feb 9 16:00:55 2023 +0000

    irqdomain: Fix domain registration race
    
    Hierarchical domains created using irq_domain_create_hierarchy() are
    currently added to the domain list before having been fully initialised.
    
    This specifically means that a racing allocation request might fail to
    allocate irq data for the inner domains of a hierarchy in case the
    parent domain pointer has not yet been set up.
    
    Note that this is not really any issue for irqchip drivers that are
    registered early via IRQCHIP_DECLARE() or IRQCHIP_ACPI_DECLARE(), but
    could potentially cause trouble with drivers that are registered later
    (e.g. when using IRQCHIP_PLATFORM_DRIVER_BEGIN(), gpiochip drivers,
    etc.).
    
    Fixes: afb7da83b9f4 ("irqdomain: Introduce helper function irq_domain_add_hierarchy()")
    Cc: stable@vger.kernel.org      # 3.19
    ...
    [ johan: add a commit message ]
    Signed-off-by: Johan Hovold [off-list ref]

Could you just give your SoB for the diff here so I can credit you as
author?
quoted
I guess this turns the "Use irq_domain_create_hierarchy()" patches into
fixes that should be backported as well.
Maybe. Backports are not my immediate concern.
Turns out all of those drivers are registered early via
IRQCHIP_DECLARE() or IRQCHIP_ACPI_DECLARE() so there shouldn't really be
any risk of hitting this race for those.
 
quoted
But note that your proposed diff may not be sufficient to prevent
lookups from racing with domain registration generally. Many drivers
still update the bus token after the domain has been added (and
apparently some still set flags also after creating hierarchies I just
noticed, e.g. amd_iommu_create_irq_domain).
The bus token should only rarely be a problem, as it is often set on
an intermediate level which isn't directly looked-up by anything else.
And if it did happen, it would probably result in a the domain not
being found.

Flags, on the other hand, are more problematic. But I consider this a
driver bug which should be fixed independently.
I agree.
 
quoted
It seems we'd need to expose a separate allocation and registration
interface, or at least pass in the bus token to a new combined
interface.
Potentially, yes. But this could come later down the line. I'm more
concerned in getting this series into -next, as the merge window is
fast approaching.
I'll post a v6 first thing Monday if you can give me that SoB before
then.

Johan

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help