* [PATCH v0] NFC: reorganize the functions in nci_request
@ 2021-11-15 14:29 Lin Ma
2021-11-15 14:32 ` Denis Kirjanov
0 siblings, 1 reply; 2+ messages in thread
From: Lin Ma @ 2021-11-15 14:29 UTC (permalink / raw)
To: netdev
Cc: krzysztof.kozlowski, davem, kuba, jirislaby, gregkh,
linux-kernel, Lin Ma
There is a possible data race as shown below:
thread-A in nci_request() | thread-B in nci_close_device()
| mutex_lock(&ndev->req_lock);
test_bit(NCI_UP, &ndev->flags); |
... | test_and_clear_bit(NCI_UP, &ndev->flags)
mutex_lock(&ndev->req_lock); |
|
This race will allow __nci_request() to be awaked while the device is
getting removed.
Similar to commit e2cb6b891ad2 ("bluetooth: eliminate the potential race
condition when removing the HCI controller"). this patch alters the
function sequence in nci_request() to prevent the data races between the
nci_close_device().
Signed-off-by: Lin Ma <linma@zju.edu.cn>
---
net/nfc/nci/core.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 6fd873aa86be..2ab2d6a1a143 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -144,12 +144,15 @@ inline int nci_request(struct nci_dev *ndev,
{
int rc;
- if (!test_bit(NCI_UP, &ndev->flags))
- return -ENETDOWN;
-
/* Serialize all requests */
mutex_lock(&ndev->req_lock);
- rc = __nci_request(ndev, req, opt, timeout);
+ /* check the state after obtaing the lock against any races
+ * from nci_close_device when the device gets removed.
+ */
+ if (test_bit(NCI_UP, &ndev->flags))
+ rc = __nci_request(ndev, req, opt, timeout);
+ else
+ rc = -ENETDOWN;
mutex_unlock(&ndev->req_lock);
return rc;
--
2.33.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v0] NFC: reorganize the functions in nci_request
2021-11-15 14:29 [PATCH v0] NFC: reorganize the functions in nci_request Lin Ma
@ 2021-11-15 14:32 ` Denis Kirjanov
0 siblings, 0 replies; 2+ messages in thread
From: Denis Kirjanov @ 2021-11-15 14:32 UTC (permalink / raw)
To: Lin Ma, netdev
Cc: krzysztof.kozlowski, davem, kuba, jirislaby, gregkh, linux-kernel
11/15/21 5:29 PM, Lin Ma пишет:
> There is a possible data race as shown below:
>
> thread-A in nci_request() | thread-B in nci_close_device()
> | mutex_lock(&ndev->req_lock);
> test_bit(NCI_UP, &ndev->flags); |
> ... | test_and_clear_bit(NCI_UP, &ndev->flags)
> mutex_lock(&ndev->req_lock); |
> |
>
> This race will allow __nci_request() to be awaked while the device is
> getting removed.
>
> Similar to commit e2cb6b891ad2 ("bluetooth: eliminate the potential race
> condition when removing the HCI controller"). this patch alters the
> function sequence in nci_request() to prevent the data races between the
> nci_close_device().
Please add Fixes tag
>
> Signed-off-by: Lin Ma <linma@zju.edu.cn>
> ---
> net/nfc/nci/core.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
> index 6fd873aa86be..2ab2d6a1a143 100644
> --- a/net/nfc/nci/core.c
> +++ b/net/nfc/nci/core.c
> @@ -144,12 +144,15 @@ inline int nci_request(struct nci_dev *ndev,
> {
> int rc;
>
> - if (!test_bit(NCI_UP, &ndev->flags))
> - return -ENETDOWN;
> -
> /* Serialize all requests */
> mutex_lock(&ndev->req_lock);
> - rc = __nci_request(ndev, req, opt, timeout);
> + /* check the state after obtaing the lock against any races
> + * from nci_close_device when the device gets removed.
> + */
> + if (test_bit(NCI_UP, &ndev->flags))
> + rc = __nci_request(ndev, req, opt, timeout);
> + else
> + rc = -ENETDOWN;
> mutex_unlock(&ndev->req_lock);
>
> return rc;
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-11-15 14:34 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-15 14:29 [PATCH v0] NFC: reorganize the functions in nci_request Lin Ma
2021-11-15 14:32 ` Denis Kirjanov
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.