From: Milton Miller <miltonm@bga.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: David Miller <davem@davemloft.net>,
devicetree-discuss@lists.ozlabs.org,
linux-kernel@vger.kernel.org, sparclinux@vger.kernel.org
Subject: [PATCH] of: fix race when matching drivers
Date: Wed, 18 May 2011 15:27:39 +0000 [thread overview]
Message-ID: <1305732459_6563@mail4.comsite.net> (raw)
In-Reply-To: <alpine.SOC.1.00.1105021259220.6200@math.ut.ee>
If two drivers are probing devices at the same time, both will write
their match table result to the dev->of_match cache at the same time.
Only write the result if the device matches.
In a thread titled "SBus devices sometimes detected, sometimes not",
Meelis reported his SBus hme was not detected about 50% of the time.
From the debug suggested by Grant it was obvious another driver matched
some devices between the call to match the hme and the hme discovery
failling.
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: Milton Miller <miltonm@bga.com>
---
Grant, I really think this of_match cache in the device node is bad a
bad tradeoff, and am willing to submit patches to remove it for 2.6.40.
It is only used by about 26 drivers and all use it once during probe
to fill out their driver data. It comes at the cost of a long for
every struct device in every system.
I'll even offer to throw in a patch to cache the parsing of the
compatible property to speed up of_device_is_compatible if needed.
Index: work.git/include/linux/of_device.h
=================================--- work.git.orig/include/linux/of_device.h 2011-05-18 09:57:01.014386816 -0500
+++ work.git/include/linux/of_device.h 2011-05-18 09:58:27.537431575 -0500
@@ -21,8 +21,15 @@ extern void of_device_make_bus_id(struct
static inline int of_driver_match_device(struct device *dev,
const struct device_driver *drv)
{
- dev->of_match = of_match_device(drv->of_match_table, dev);
- return dev->of_match != NULL;
+ const struct of_device_id *match;
+
+ match = of_match_device(drv->of_match_table, dev);
+ if (match) {
+ dev->of_match = of_match_device(drv->of_match_table, dev);
+ return 1;
+ }
+
+ return 0;
}
extern struct platform_device *of_dev_get(struct platform_device *dev);
WARNING: multiple messages have this Message-ID (diff)
From: Milton Miller <miltonm@bga.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: David Miller <davem@davemloft.net>,
<devicetree-discuss@lists.ozlabs.org>,
<linux-kernel@vger.kernel.org>, <sparclinux@vger.kernel.org>
Subject: [PATCH] of: fix race when matching drivers
Date: Wed, 18 May 2011 10:27:39 -0500 [thread overview]
Message-ID: <1305732459_6563@mail4.comsite.net> (raw)
In-Reply-To: <alpine.SOC.1.00.1105021259220.6200@math.ut.ee>
If two drivers are probing devices at the same time, both will write
their match table result to the dev->of_match cache at the same time.
Only write the result if the device matches.
In a thread titled "SBus devices sometimes detected, sometimes not",
Meelis reported his SBus hme was not detected about 50% of the time.
>From the debug suggested by Grant it was obvious another driver matched
some devices between the call to match the hme and the hme discovery
failling.
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: Milton Miller <miltonm@bga.com>
---
Grant, I really think this of_match cache in the device node is bad a
bad tradeoff, and am willing to submit patches to remove it for 2.6.40.
It is only used by about 26 drivers and all use it once during probe
to fill out their driver data. It comes at the cost of a long for
every struct device in every system.
I'll even offer to throw in a patch to cache the parsing of the
compatible property to speed up of_device_is_compatible if needed.
Index: work.git/include/linux/of_device.h
===================================================================
--- work.git.orig/include/linux/of_device.h 2011-05-18 09:57:01.014386816 -0500
+++ work.git/include/linux/of_device.h 2011-05-18 09:58:27.537431575 -0500
@@ -21,8 +21,15 @@ extern void of_device_make_bus_id(struct
static inline int of_driver_match_device(struct device *dev,
const struct device_driver *drv)
{
- dev->of_match = of_match_device(drv->of_match_table, dev);
- return dev->of_match != NULL;
+ const struct of_device_id *match;
+
+ match = of_match_device(drv->of_match_table, dev);
+ if (match) {
+ dev->of_match = of_match_device(drv->of_match_table, dev);
+ return 1;
+ }
+
+ return 0;
}
extern struct platform_device *of_dev_get(struct platform_device *dev);
WARNING: multiple messages have this Message-ID (diff)
From: Milton Miller <miltonm@bga.com>
To: Grant Likely <grant.likely@secretlab.ca>
Cc: David Miller <davem@davemloft.net>,
devicetree-discuss@lists.ozlabs.org,
linux-kernel@vger.kernel.org, sparclinux@vger.kernel.org
Subject: [PATCH] of: fix race when matching drivers
Date: Wed, 18 May 2011 10:27:39 -0500 [thread overview]
Message-ID: <1305732459_6563@mail4.comsite.net> (raw)
In-Reply-To: <alpine.SOC.1.00.1105021259220.6200@math.ut.ee>
If two drivers are probing devices at the same time, both will write
their match table result to the dev->of_match cache at the same time.
Only write the result if the device matches.
In a thread titled "SBus devices sometimes detected, sometimes not",
Meelis reported his SBus hme was not detected about 50% of the time.
>From the debug suggested by Grant it was obvious another driver matched
some devices between the call to match the hme and the hme discovery
failling.
Reported-by: Meelis Roos <mroos@linux.ee>
Signed-off-by: Milton Miller <miltonm@bga.com>
---
Grant, I really think this of_match cache in the device node is bad a
bad tradeoff, and am willing to submit patches to remove it for 2.6.40.
It is only used by about 26 drivers and all use it once during probe
to fill out their driver data. It comes at the cost of a long for
every struct device in every system.
I'll even offer to throw in a patch to cache the parsing of the
compatible property to speed up of_device_is_compatible if needed.
Index: work.git/include/linux/of_device.h
===================================================================
--- work.git.orig/include/linux/of_device.h 2011-05-18 09:57:01.014386816 -0500
+++ work.git/include/linux/of_device.h 2011-05-18 09:58:27.537431575 -0500
@@ -21,8 +21,15 @@ extern void of_device_make_bus_id(struct
static inline int of_driver_match_device(struct device *dev,
const struct device_driver *drv)
{
- dev->of_match = of_match_device(drv->of_match_table, dev);
- return dev->of_match != NULL;
+ const struct of_device_id *match;
+
+ match = of_match_device(drv->of_match_table, dev);
+ if (match) {
+ dev->of_match = of_match_device(drv->of_match_table, dev);
+ return 1;
+ }
+
+ return 0;
}
extern struct platform_device *of_dev_get(struct platform_device *dev);
next prev parent reply other threads:[~2011-05-18 15:27 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-05-02 10:39 SBus devices sometimes detected, sometimes not Meelis Roos
2011-05-02 21:51 ` David Miller
2011-05-17 20:43 ` David Miller
2011-05-17 20:43 ` David Miller
2011-05-18 4:29 ` Grant Likely
2011-05-18 4:29 ` Grant Likely
2011-05-18 13:59 ` mroos
2011-05-18 13:59 ` mroos
2011-05-18 15:27 ` Milton Miller [this message]
2011-05-18 15:27 ` [PATCH] of: fix race when matching drivers Milton Miller
2011-05-18 15:27 ` Milton Miller
2011-05-18 15:41 ` Grant Likely
2011-05-18 15:41 ` Grant Likely
2011-05-18 15:41 ` Grant Likely
2011-05-18 15:47 ` Grant Likely
2011-05-18 15:47 ` Grant Likely
2011-05-18 15:47 ` Grant Likely
2011-05-18 15:45 ` Josip Rodin
2011-05-18 15:45 ` Josip Rodin
2011-05-18 16:21 ` Grant Likely
2011-05-18 16:21 ` Grant Likely
2011-05-18 17:03 ` Milton Miller
2011-05-18 17:03 ` Milton Miller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1305732459_6563@mail4.comsite.net \
--to=miltonm@bga.com \
--cc=davem@davemloft.net \
--cc=devicetree-discuss@lists.ozlabs.org \
--cc=grant.likely@secretlab.ca \
--cc=linux-kernel@vger.kernel.org \
--cc=sparclinux@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.