From: Christoph Winklhofer <cj.winklhofer@gmail.com>
To: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Cc: Krzysztof Kozlowski <krzk@kernel.org>,
Rob Herring <robh+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>, Rob Herring <robh@kernel.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
Krzysztof Kozlowski <krzysztof.kozlowski+dt@linaro.org>,
Jonathan Corbet <corbet@lwn.net>,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-serial@vger.kernel.org, linux-doc@vger.kernel.org
Subject: Re: [PATCH v5 3/3] w1: add UART w1 bus driver
Date: Fri, 2 Feb 2024 20:23:30 +0100 [thread overview]
Message-ID: <Zb1BMswaaZTXzaFJ@cjw-notebook> (raw)
In-Reply-To: <94075be0-b91c-4147-86b1-582b124e71a0@linaro.org>
On Thu, Feb 01, 2024 at 10:35:32AM +0100, Krzysztof Kozlowski wrote:
> On 01/02/2024 08:29, Christoph Winklhofer wrote:
> >>> +
> >>> +static void w1_uart_remove(struct serdev_device *serdev)
> >>> +{
> >>> + struct w1_uart_device *w1dev = serdev_device_get_drvdata(serdev);
> >>> +
> >>> + mutex_lock(&w1dev->mutex);
> >>> +
> >>> + w1_remove_master_device(&w1dev->bus);
> >>> +
> >>> + mutex_unlock(&w1dev->mutex);
> >>
> >> This is still suspicious. You do not have serdev_device_close and you
> >> want to protect from concurrent access but it looks insufficient.
> >>
> >> This code assumes that:
> >>
> >> w1_uart_remove()
> >> <-- here concurrent read/write might start
> >> mutex_lock()
> >> w1_remove_master_device()
> >> mutex_unlock()
> >> <-- now w1_uart_serdev_tx_rx() or w1_uart_serdev_receive_buf() can be
> >> executed, but device is removed. So what's the point of the mutex here?
> >>
> >> What exactly is protected by the mutex? So far it looks like only some
> >> contents of w1dev, but it does not matter, because it that memory is
> >> still valid at this point.
> >>
> >> After describing what is protected we can think whether it is really
> >> protected...
> >>
> >>
> >>>
> >>
> >> Best regards,
> >> Krzysztof
> >>
> >
> > Yes, it is still suspicious, sorry..
> >
> > After w1_uart_remove, serdev is closed and w1dev is released. Therefore
> > the w1-callback (w1_uart_serdev_tx_rx) must be finished before returning
>
> I did not even go to end of w1_uart_remove(). In my code above, that
> thread is still in w1_uart_remove(), just after unlocking mutex.
>
Ok, I looked more closely at the underlying w1-code and think it is
sufficient to only call w1_remove_master_device() in w1_uart_remove.
This function waits until all slaves have finished their work, so
w1_uart_serdev_tx_rx finished too. The lock is not required.
Hence, I will use the mutex only to protected concurrent access of
serdev and w1-callbacks (for rx_byte and rx_err).
> > from w1_uart_remove. That was the intention with the lock and trylock.
>
> Then it does not look really protected. To be honest, w1-gpio and other
> drivers also might have a race here. You can test it by adding long
> sleeps in read/write paths and then trying to unbind device. Maybe this
> should be fixed everywhere, but this mutex here brings more questions.
>
I added a delay, unbind takes longer but works without problems when its
done during a temperature read.
IMO also the other drivers should be fine. From w1_int.c: The w1_master
is ref-counted and released when it is unused (2). In w1_slave_detach
(1), the slaves decrement this count, perform specific clean up (in
remove_slave) and remove sysfs entries.
w1_int.c:
void __w1_remove_master_device(struct w1_master *dev)
...
list_for_each_entry_safe(sl, sln, &dev->slist, w1_slave_entry) {
mutex_unlock(&dev->list_mutex);
w1_slave_detach(sl); (1)
...
while (atomic_read(&dev->refcnt)) { (2)
...
}
...
w1_free_dev(dev);
For example w1_therm waits in remove_slave until its w1-operations are
done. The other slave-drivers (e.g. w1_ds2405.c) use w1-operations in
their sysfs-callback and I suppose that sysfs-removal waits until the
sysfs-read is finished.
Kind regards,
Christoph
prev parent reply other threads:[~2024-02-02 19:23 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-26 15:42 [PATCH v5 0/3] w1: add UART w1 bus driver Christoph Winklhofer via B4 Relay
2024-01-26 15:42 ` [PATCH v5 1/3] dt-bindings: w1: UART 1-Wire bus Christoph Winklhofer via B4 Relay
2024-01-30 22:52 ` Rob Herring
2024-01-26 15:42 ` [PATCH v5 2/3] dt-bindings: serial: allow onewire as child node Christoph Winklhofer via B4 Relay
2024-01-31 13:09 ` Krzysztof Kozlowski
2024-01-26 15:42 ` [PATCH v5 3/3] w1: add UART w1 bus driver Christoph Winklhofer via B4 Relay
2024-01-31 13:12 ` Krzysztof Kozlowski
2024-02-01 7:29 ` Christoph Winklhofer
2024-02-01 9:35 ` Krzysztof Kozlowski
2024-02-02 19:23 ` Christoph Winklhofer [this message]
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=Zb1BMswaaZTXzaFJ@cjw-notebook \
--to=cj.winklhofer@gmail.com \
--cc=conor+dt@kernel.org \
--cc=corbet@lwn.net \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=krzk@kernel.org \
--cc=krzysztof.kozlowski+dt@linaro.org \
--cc=krzysztof.kozlowski@linaro.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=robh+dt@kernel.org \
--cc=robh@kernel.org \
/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).