Skip to content

Commit

Permalink
of: fix race when matching drivers
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Milton Miller <[email protected]>
[grant.likely: modified to only call of_match_device() once]
Signed-off-by: Grant Likely <[email protected]>
  • Loading branch information
Milton Miller authored and glikely committed May 18, 2011
1 parent 2e9521f commit 01294d8
Showing 1 changed file with 6 additions and 2 deletions.
8 changes: 6 additions & 2 deletions include/linux/of_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@ extern void of_device_make_bus_id(struct device *dev);
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 = match;
return match != NULL;
}

extern struct platform_device *of_dev_get(struct platform_device *dev);
Expand Down

0 comments on commit 01294d8

Please sign in to comment.