From: Kent Gibson <warthog618@gmail.com>
To: Dipen Patel <dipenp@nvidia.com>
Cc: thierry.reding@gmail.com, jonathanh@nvidia.com,
linux-kernel@vger.kernel.org, linux-tegra@vger.kernel.org,
linux-gpio@vger.kernel.org, linus.walleij@linaro.org,
bgolaszewski@baylibre.com, devicetree@vger.kernel.org,
linux-doc@vger.kernel.org, robh+dt@kernel.org
Subject: Re: [RFC 06/11] gpiolib: Add HTE support
Date: Sat, 31 Jul 2021 13:13:28 +0800 [thread overview]
Message-ID: <20210731051328.GA10526@sol> (raw)
In-Reply-To: <5ed6ca9e-ee1e-23dd-5f2c-d674c74b3ea3@nvidia.com>
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@nvidia.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.
next prev parent reply other threads:[~2021-07-31 5:13 UTC|newest]
Thread overview: 75+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-25 23:55 [RFC 00/11] Intro to Hardware timestamping engine Dipen Patel
2021-06-25 23:55 ` [RFC 01/11] Documentation: Add HTE subsystem guide Dipen Patel
2021-07-04 18:55 ` Jonathan Cameron
2021-07-27 23:44 ` Dipen Patel
2021-08-01 15:24 ` Jonathan Cameron
2021-06-25 23:55 ` [RFC 02/11] drivers: Add HTE subsystem Dipen Patel
2021-06-27 17:40 ` Randy Dunlap
2021-07-04 20:15 ` Jonathan Cameron
2021-07-04 20:45 ` Jonathan Cameron
2021-07-28 5:12 ` Dipen Patel
2021-08-01 16:48 ` Jonathan Cameron
2021-07-28 4:38 ` Dipen Patel
2021-08-01 16:13 ` Jonathan Cameron
2021-09-14 5:43 ` Dipen Patel
2021-09-26 15:42 ` Jonathan Cameron
2021-07-05 7:30 ` Greg KH
2021-07-28 0:34 ` Dipen Patel
2021-06-25 23:55 ` [RFC 03/11] hte: Add tegra194 HTE kernel provider Dipen Patel
2021-07-01 14:21 ` Kent Gibson
2021-07-28 23:59 ` Dipen Patel
2021-07-30 7:01 ` Dipen Patel
2021-07-31 15:43 ` Kent Gibson
2021-08-03 22:40 ` Dipen Patel
2021-08-03 23:02 ` Kent Gibson
2021-08-07 2:41 ` Dipen Patel
2021-08-07 3:07 ` Kent Gibson
2021-08-07 4:52 ` Dipen Patel
2021-08-07 4:51 ` Kent Gibson
2021-08-07 5:35 ` Dipen Patel
2021-08-07 5:42 ` Kent Gibson
2021-08-07 5:47 ` Dipen Patel
2021-07-04 20:27 ` Jonathan Cameron
2021-07-29 2:42 ` Dipen Patel
2021-07-08 23:33 ` Michał Mirosław
2021-07-29 2:43 ` Dipen Patel
2021-06-25 23:55 ` [RFC 04/11] dt-bindings: Add HTE bindings Dipen Patel
2021-06-27 10:56 ` Linus Walleij
2021-07-30 1:32 ` Dipen Patel
2021-07-01 14:02 ` Rob Herring
2021-07-30 1:56 ` Dipen Patel
2021-07-01 15:54 ` Rob Herring
2021-07-30 1:58 ` Dipen Patel
2021-06-25 23:55 ` [RFC 05/11] hte: Add Tegra194 IRQ HTE test driver Dipen Patel
2021-06-27 17:42 ` Randy Dunlap
2021-06-25 23:55 ` [RFC 06/11] gpiolib: Add HTE support Dipen Patel
2021-06-27 11:41 ` Linus Walleij
2021-07-01 14:24 ` Kent Gibson
2021-07-30 2:25 ` Dipen Patel
2021-07-31 5:13 ` Kent Gibson [this message]
2021-06-25 23:55 ` [RFC 07/11] gpio: tegra186: Add HTE in gpio-tegra186 driver Dipen Patel
2021-06-25 23:55 ` [RFC 08/11] gpiolib: cdev: Add hardware timestamp clock type Dipen Patel
2021-06-27 11:38 ` Linus Walleij
2021-06-27 11:49 ` Linus Walleij
2021-07-30 3:16 ` Dipen Patel
2021-07-01 14:24 ` Kent Gibson
2021-07-30 3:07 ` Dipen Patel
2021-07-31 6:05 ` Kent Gibson
2021-08-03 22:41 ` Dipen Patel
2021-08-03 22:38 ` Kent Gibson
2021-07-09 8:30 ` Jon Hunter
2021-07-30 2:33 ` Dipen Patel
2021-08-03 16:42 ` Jon Hunter
2021-08-03 22:51 ` Dipen Patel
2021-08-03 23:09 ` Kent Gibson
2021-06-25 23:55 ` [RFC 09/11] tools: gpio: Add new hardware " Dipen Patel
2021-06-27 11:36 ` Linus Walleij
2021-07-30 3:17 ` Dipen Patel
2021-07-31 6:16 ` Kent Gibson
2021-08-11 9:11 ` Linus Walleij
2021-06-25 23:55 ` [RFC 10/11] hte: Add tegra GPIO HTE test driver Dipen Patel
2021-06-27 17:43 ` Randy Dunlap
2021-06-25 23:55 ` [RFC 11/11] MAINTAINERS: Added HTE Subsystem Dipen Patel
2021-06-27 13:07 ` [RFC 00/11] Intro to Hardware timestamping engine Andy Shevchenko
2021-06-27 14:40 ` Linus Walleij
2021-06-28 12:02 ` Andy Shevchenko
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=20210731051328.GA10526@sol \
--to=warthog618@gmail.com \
--cc=bgolaszewski@baylibre.com \
--cc=devicetree@vger.kernel.org \
--cc=dipenp@nvidia.com \
--cc=jonathanh@nvidia.com \
--cc=linus.walleij@linaro.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-gpio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=robh+dt@kernel.org \
--cc=thierry.reding@gmail.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).