Message ID | 20220118173404.1891800-1-robh@kernel.org |
---|---|
State | Accepted, archived |
Headers | show |
Series | of: Check 'of_node_reused' flag on of_match_device() | expand |
Context | Check | Description |
---|---|---|
robh/checkpatch | warning | total: 0 errors, 2 warnings, 8 lines checked |
robh/dtbs-check | success | |
robh/dt-meta-schema | success |
On Tue, 18 Jan 2022 11:34:04 -0600, Rob Herring wrote: > Commit 0f153a1b8193 ("usb: chipidea: Set the DT node on the child > device") caused the child device to match on the parent driver > instead of the child's driver since the child's DT node pointer matched. > The worst case result is a loop of the parent driver probing another > instance and creating yet another child device eventually exhausting the > stack. If the child driver happens to match first, then everything works > fine. > > A device sharing the DT node should never do DT based driver matching, > so let's simply check of_node_reused in of_match_device() to prevent > that. > > Fixes: 0f153a1b8193 ("usb: chipidea: Set the DT node on the child device") > Link: https://lore.kernel.org/all/20220114105620.GK18506@ediswmail.ad.cirrus.com/ > Reported-by: Charles Keepax <ckeepax@opensource.cirrus.com> > Cc: Frank Rowand <frowand.list@gmail.com> > Cc: Arnd Bergmann <arnd@arndb.de> > Cc: Tony Lindgren <tony@atomide.com> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Peter Chen <peter.chen@nxp.com> > Tested-by: Charles Keepax <ckeepax@opensource.cirrus.com> > Signed-off-by: Rob Herring <robh@kernel.org> > --- > drivers/of/device.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > Applied, thanks!
diff --git a/drivers/of/device.c b/drivers/of/device.c index b0800c260f64..874f031442dc 100644 --- a/drivers/of/device.c +++ b/drivers/of/device.c @@ -28,7 +28,7 @@ const struct of_device_id *of_match_device(const struct of_device_id *matches, const struct device *dev) { - if ((!matches) || (!dev->of_node)) + if (!matches || !dev->of_node || dev->of_node_reused) return NULL; return of_match_node(matches, dev->of_node); }