On Thu, Sep 18, 2014 at 06:54:34PM +0300, Octavian Purdila wrote: > On Thu, Sep 18, 2014 at 3:46 PM, Johan Hovold <johan@xxxxxxxxxx> wrote: > > On Thu, Sep 18, 2014 at 03:43:07PM +0300, Octavian Purdila wrote: > >> On Thu, Sep 18, 2014 at 1:54 PM, Johan Hovold <johan@xxxxxxxxxx> wrote: > >> > On Tue, Sep 09, 2014 at 10:24:46PM +0300, Octavian Purdila wrote: > > > >> > Either way, it looks like this could race with get_direction() if you > >> > get a set_direction() while get_direction() is retrieving the direction > >> > from the device. > >> > > >> > This would break gpio_get(). > >> > > >> I don't think gpio_set_direction() and gpio_get() are allowed to race. > > > > I wrote that set_direction() and get_direction() could race, which in > > turn would break gpio_get() as you would be caching the wrong > > direction setting. > > > > OK, I now see the problem. I think doing this in get_direction() will > fix the issue: > > if (!test_and_set_bit(offset, dln2->pin_dir_set)) > set/clear_bit(offset, dln2->pin_dir); > > because gpiolib calls get_direction() while requesting a pin and > request cannot race with itself. Which means that get_direction() can > not race with itself the first time it is called, when the set/clear > operation will be run. > > And because we know that get_direction() is called first, we can even > remove the set/clear operation from set_direction(). Why not simply fetch the direction in request() and get rid of the pin_dir_set bitmask? Johan -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html