From: "Jérôme Pouiller" <Jerome.Pouiller@silabs.com>
To: "Michał Mirosław" <mirq-linux@rere.qmqm.pl>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"devel@driverdev.osuosl.org" <devel@driverdev.osuosl.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [[PATCH staging] 4/7] staging: wfx: annotate nested gc_list vs tx queue locking
Date: Tue, 11 Feb 2020 10:34:30 +0000 [thread overview]
Message-ID: <263570919.qXAG0u9DAH@pc-42> (raw)
In-Reply-To: <c47c0b645071aff141fa0d39d92184b6dc5e4f52.1581410026.git.mirq-linux@rere.qmqm.pl>
On Tuesday 11 February 2020 09:46:55 CET Michał Mirosław wrote:
> Lockdep is complaining about recursive locking, because it can't make
> a difference between locked skb_queues. Annotate nested locks and avoid
> double bh_disable/enable.
>
> [...]
> insmod/815 is trying to acquire lock:
> cb7d6418 (&(&list->lock)->rlock){+...}, at: wfx_tx_queues_clear+0xfc/0x198 [wfx]
>
> but task is already holding lock:
> cb7d61f4 (&(&list->lock)->rlock){+...}, at: wfx_tx_queues_clear+0xa0/0x198 [wfx]
>
> [...]
> Possible unsafe locking scenario:
>
> CPU0
> ----
> lock(&(&list->lock)->rlock);
> lock(&(&list->lock)->rlock);
>
> Cc: stable@vger.kernel.org
> Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
> ---
> drivers/staging/wfx/queue.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/staging/wfx/queue.c b/drivers/staging/wfx/queue.c
> index 0bcc61feee1d..51d6c55ae91f 100644
> --- a/drivers/staging/wfx/queue.c
> +++ b/drivers/staging/wfx/queue.c
> @@ -130,12 +130,12 @@ static void wfx_tx_queue_clear(struct wfx_dev *wdev, struct wfx_queue *queue,
> spin_lock_bh(&queue->queue.lock);
> while ((item = __skb_dequeue(&queue->queue)) != NULL)
> skb_queue_head(gc_list, item);
> - spin_lock_bh(&stats->pending.lock);
> + spin_lock_nested(&stats->pending.lock, 1);
> for (i = 0; i < ARRAY_SIZE(stats->link_map_cache); ++i) {
> stats->link_map_cache[i] -= queue->link_map_cache[i];
> queue->link_map_cache[i] = 0;
> }
> - spin_unlock_bh(&stats->pending.lock);
> + spin_unlock(&stats->pending.lock);
> spin_unlock_bh(&queue->queue.lock);
> }
>
> @@ -207,9 +207,9 @@ void wfx_tx_queue_put(struct wfx_dev *wdev, struct wfx_queue *queue,
>
> ++queue->link_map_cache[tx_priv->link_id];
>
> - spin_lock_bh(&stats->pending.lock);
> + spin_lock_nested(&stats->pending.lock, 1);
> ++stats->link_map_cache[tx_priv->link_id];
> - spin_unlock_bh(&stats->pending.lock);
> + spin_unlock(&stats->pending.lock);
> spin_unlock_bh(&queue->queue.lock);
> }
>
> @@ -237,11 +237,11 @@ static struct sk_buff *wfx_tx_queue_get(struct wfx_dev *wdev,
> __skb_unlink(skb, &queue->queue);
> --queue->link_map_cache[tx_priv->link_id];
>
> - spin_lock_bh(&stats->pending.lock);
> + spin_lock_nested(&stats->pending.lock, 1);
> __skb_queue_tail(&stats->pending, skb);
> if (!--stats->link_map_cache[tx_priv->link_id])
> wakeup_stats = true;
> - spin_unlock_bh(&stats->pending.lock);
> + spin_unlock(&stats->pending.lock);
> }
> spin_unlock_bh(&queue->queue.lock);
> if (wakeup_stats)
> @@ -259,10 +259,10 @@ int wfx_pending_requeue(struct wfx_dev *wdev, struct sk_buff *skb)
> spin_lock_bh(&queue->queue.lock);
> ++queue->link_map_cache[tx_priv->link_id];
>
> - spin_lock_bh(&stats->pending.lock);
> + spin_lock_nested(&stats->pending.lock, 1);
> ++stats->link_map_cache[tx_priv->link_id];
> __skb_unlink(skb, &stats->pending);
> - spin_unlock_bh(&stats->pending.lock);
> + spin_unlock(&stats->pending.lock);
> __skb_queue_tail(&queue->queue, skb);
> spin_unlock_bh(&queue->queue.lock);
> return 0;
> --
> 2.20.1
>
Reviewed-by: Jérôme Pouiller <jerome.pouiller@silabs.com>
--
Jérôme Pouiller
next prev parent reply other threads:[~2020-02-11 10:34 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1581410026.git.mirq-linux@rere.qmqm.pl>
[not found] ` <8f0c51acc3b98fc55d6960036daef7556445cd0a.1581410026.git.mirq-linux@rere.qmqm.pl>
2020-02-11 9:23 ` [[PATCH staging] 3/7] staging: wfx: fix init/remove vs IRQ race Dan Carpenter
2020-02-11 10:39 ` Michał Mirosław
2020-02-11 12:52 ` Dan Carpenter
[not found] ` <c47c0b645071aff141fa0d39d92184b6dc5e4f52.1581410026.git.mirq-linux@rere.qmqm.pl>
2020-02-11 10:34 ` Jérôme Pouiller [this message]
[not found] ` <01ac32e4318da8a7db085c82cfca9831ecec5d40.1581410026.git.mirq-linux@rere.qmqm.pl>
2020-02-11 10:41 ` [[PATCH staging] 6/7] staging: wfx: use sleeping gpio accessors Jérôme Pouiller
[not found] ` <f32c850dcb02bf26faf04655c01aee4c4d20c139.1581410026.git.mirq-linux@rere.qmqm.pl>
2020-02-11 10:45 ` [[PATCH staging] 7/7] staging: wfx: use more power-efficient sleep for reset Jérôme Pouiller
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=263570919.qXAG0u9DAH@pc-42 \
--to=jerome.pouiller@silabs.com \
--cc=devel@driverdev.osuosl.org \
--cc=gregkh@linuxfoundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mirq-linux@rere.qmqm.pl \
/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 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.