[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20210731051328.GA10526@sol>
Date: Sat, 31 Jul 2021 13:13:28 +0800
From: Kent Gibson <warthog618@...il.com>
To: Dipen Patel <dipenp@...dia.com>
Cc: thierry.reding@...il.com, jonathanh@...dia.com,
linux-kernel@...r.kernel.org, linux-tegra@...r.kernel.org,
linux-gpio@...r.kernel.org, linus.walleij@...aro.org,
bgolaszewski@...libre.com, devicetree@...r.kernel.org,
linux-doc@...r.kernel.org, robh+dt@...nel.org
Subject: Re: [RFC 06/11] gpiolib: Add HTE support
On Thu, Jul 29, 2021 at 07:25:36PM -0700, Dipen Patel wrote:
>
> On 7/1/21 7:24 AM, Kent Gibson wrote:
> > On Fri, Jun 25, 2021 at 04:55:27PM -0700, Dipen Patel wrote:
> >> Some GPIO chip can provide hardware timestamp support on its GPIO lines
> >> , in order to support that additional functions needs to be added which
> >> can talk to both GPIO chip and HTE (hardware timestamping engine)
> >> subsystem. This patch introduces functions which gpio consumer can use
> >> to request hardware assisted timestamping. Below is the list of the APIs
> >> that are added in gpiolib subsystem.
> >>
> >> - gpiod_hw_timestamp_control - to enable/disable HTE on specified GPIO
> >> line. This API will return HTE specific descriptor for the specified
> >> GPIO line during the enable call, it will be stored as pointer in the
> >> gpio_desc structure as hw_ts_data.
> >> - gpiod_is_hw_timestamp_enabled - to query if HTE is enabled on
> >> specified GPIO line.
> >> - gpiod_get_hw_timestamp - to retrieve hardware timestamps.
> >>
> >> Signed-off-by: Dipen Patel <dipenp@...dia.com>
> >> ---
> >> drivers/gpio/gpiolib.c | 92 +++++++++++++++++++++++++++++++++++
> >> drivers/gpio/gpiolib.h | 11 +++++
> >> include/linux/gpio/consumer.h | 21 +++++++-
> >> include/linux/gpio/driver.h | 13 +++++
> >> 4 files changed, 135 insertions(+), 2 deletions(-)
> >>
> >> diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
> >> index 220a9d8dd4e3..335eaddfde98 100644
> >> --- a/drivers/gpio/gpiolib.c
> >> +++ b/drivers/gpio/gpiolib.c
> >> @@ -2361,6 +2361,98 @@ int gpiod_direction_output(struct gpio_desc *desc, int value)
> >> }
> >> EXPORT_SYMBOL_GPL(gpiod_direction_output);
> >>
> >> +/**
> >> + * gpiod_hw_timestamp_control - set the hardware assisted timestamp control.
> >> + * @desc: GPIO to set
> >> + * @enable: Set true to enable the hardware timestamp, false otherwise.
> >> + *
> >> + * Certain GPIO chip can rely on hardware assisted timestamp engines which can
> >> + * record timestamp at the occurance of the configured events on selected GPIO
> >> + * lines. This is helper API to control such engine.
> >> + *
> >> + * Return 0 in case of success, else an error code.
> >> + */
> >> +int gpiod_hw_timestamp_control(struct gpio_desc *desc, bool enable)
> >> +{
> >> + struct gpio_chip *gc;
> >> + int ret = 0;
> >> +
> >> + VALIDATE_DESC(desc);
> >> + gc = desc->gdev->chip;
> >> +
> >> + if (!gc->timestamp_control) {
> >> + gpiod_warn(desc,
> >> + "%s: Hardware assisted ts not supported\n",
> >> + __func__);
> >> + return -ENOTSUPP;
> >> + }
> >> +
> >> + ret = gc->timestamp_control(gc, gpio_chip_hwgpio(desc),
> >> + &desc->hdesc, enable);
> >> +
> >> + if (ret) {
> >> + gpiod_warn(desc,
> >> + "%s: ts control operation failed\n", __func__);
> >> + return ret;
> >> + }
> >> +
> >> + if (!enable)
> >> + desc->hdesc = NULL;
> >> +
> >> + return ret;
> >> +}
> > Last I checked, pointer accesses are not guaranteed atomic, so how is
> > hdesc protected from concurrent access?
> > Here is it modified unprotected.
> > Below it is read unprotected.
>
> The assumption I made here was, gpiod_hw_timestamp_control will be
>
> called after client has made at least gpdio_request call. With that assumption,
>
> how two or more client/consumers call gpiod_hw_timestamp_control API
>
> with the same gpio_desc? I believe its not allowed as gpiod_request call will
>
> fail for the looser if there is a race and hence there will not be any race here
>
> in this API. Let me know your thoughts.
>
My assumptions are that the userspace client is multi-threaded and that
there is nothing preventing concurrent uAPI calls, including closing the
line request fd.
The specific case I had in mind is one thread closing the req fd while
another is using set_config to switch to the hardware event clock.
In that race, the close be calling linereq_free() at the same time the
linereq_set_config_unlocked() is being called. Both of those functions
make calls to the functions here that read and write the hdesc.
There may be others, e.g. line_event_timestamp() running in the
irq_thread at the same time a set_config call switches the event clock
away from the hardware clock.
So assume concurrent access unless you can prove otherwise.
Cheers,
Kent.
Powered by blists - more mailing lists