lkml.org 
[lkml]   [2018]   [Apr]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v2 2/4] ARM: amba: Fix race condition with driver_override
    Reviewed-by: Todd Kjos <tkjos@android.com>

    On Tue, Apr 10, 2018 at 6:21 AM, Geert Uytterhoeven
    <geert+renesas@glider.be> wrote:
    > The driver_override implementation is susceptible to a race condition
    > when different threads are reading vs storing a different driver
    > override. Add locking to avoid this race condition.
    >
    > Cfr. commits 6265539776a0810b ("driver core: platform: fix race
    > condition with driver_override") and 9561475db680f714 ("PCI: Fix race
    > condition with driver_override").
    >
    > Fixes: 3cf385713460eb2b ("ARM: 8256/1: driver coamba: add device binding path 'driver_override'")
    > Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
    > ---
    > drivers/amba/bus.c | 11 +++++++++--
    > 1 file changed, 9 insertions(+), 2 deletions(-)
    >
    > diff --git a/drivers/amba/bus.c b/drivers/amba/bus.c
    > index 6ffd778352e6d953..36c5653ced5742b7 100644
    > --- a/drivers/amba/bus.c
    > +++ b/drivers/amba/bus.c
    > @@ -69,8 +69,12 @@ static ssize_t driver_override_show(struct device *_dev,
    > struct device_attribute *attr, char *buf)
    > {
    > struct amba_device *dev = to_amba_device(_dev);
    > + ssize_t len;
    >
    > - return sprintf(buf, "%s\n", dev->driver_override);
    > + device_lock(_dev);
    > + len = sprintf(buf, "%s\n", dev->driver_override);
    > + device_unlock(_dev);
    > + return len;
    > }
    >
    > static ssize_t driver_override_store(struct device *_dev,
    > @@ -78,7 +82,7 @@ static ssize_t driver_override_store(struct device *_dev,
    > const char *buf, size_t count)
    > {
    > struct amba_device *dev = to_amba_device(_dev);
    > - char *driver_override, *old = dev->driver_override, *cp;
    > + char *driver_override, *old, *cp;
    >
    > if (count > PATH_MAX)
    > return -EINVAL;
    > @@ -91,12 +95,15 @@ static ssize_t driver_override_store(struct device *_dev,
    > if (cp)
    > *cp = '\0';
    >
    > + device_lock(_dev);
    > + old = dev->driver_override;
    > if (strlen(driver_override)) {
    > dev->driver_override = driver_override;
    > } else {
    > kfree(driver_override);
    > dev->driver_override = NULL;
    > }
    > + device_unlock(_dev);
    >
    > kfree(old);
    >
    > --
    > 2.7.4
    >

    \
     
     \ /
      Last update: 2018-04-25 17:56    [W:3.224 / U:0.460 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site