From: Ben Greear <greearb@candelatech.com>
To: "Michał Kazior" <kazikcz@gmail.com>
Cc: linux-wireless@vger.kernel.org, ath10k@lists.infradead.org
Subject: Re: [RFC] ath10k: Attempt to work around napi_synchronize hang.
Date: Wed, 28 Feb 2018 10:05:04 -0800 [thread overview]
Message-ID: <95ddec98-2613-7e6d-3ec8-d47d1aa527db@candelatech.com> (raw)
In-Reply-To: <CABvG-CU1jf4xN+LZdkdejqr67Mcs-JdvGrvHnh0pB2VSJjJZzQ@mail.gmail.com>
On 02/28/2018 09:31 AM, Michał Kazior wrote:
> On 28 February 2018 at 02:22, <greearb@candelatech.com> wrote:
> [...]
>> @@ -2086,8 +2087,28 @@ static void ath10k_pci_hif_stop(struct ath10k *ar)
>> ath10k_pci_irq_disable(ar);
>> ath10k_pci_irq_sync(ar);
>> ath10k_pci_flush(ar);
>> - napi_synchronize(&ar->napi);
>> - napi_disable(&ar->napi);
>> +
>> + /* Calling napi_disable twice in a row (w/out starting it and/or without
>> + * having NAPI active leads to deadlock because napi_disable sets
>> + * NAPI_STATE_SCHED and NAPI_STATE_NPSVC when it returns, as far as I
>> + * can tell. So, guard this call to napi_disable. I believe the
>> + * failure case is something like this:
>> + * rmmod ath10k_pci ath10k_core
>> + * Firmware crashes before hif_stop is called by the rmmod path
>> + * The crash handling logic calls hif_stop
>> + * Then rmmod gets around to calling hif_stop, but spins endlessly
>> + * in napi_synchronize.
>> + *
>> + * I think one way this could happen is that ath10k_stop checks
>> + * for state != ATH10K_STATE_OFF, but STATE_RESTARTING is also
>> + * a possibility. That might be how we can have hif_stop called twice
>> + * without a hif_start in between. --Ben
>> + */
>> + if (ar->napi_enabled) {
>> + napi_synchronize(&ar->napi);
>> + napi_disable(&ar->napi);
>> + ar->napi_enabled = false;
>> + }
>
> Looking at the code and your comment the described fail case seems
> legit. I would consider tuning ath10k_stop() so that it calls
> ath10k_halt() only if ar->state != OFF & ar->state != RESTARTING
> though. Or did you try already?
I did not try tuning ath10k_stop(). The code in this area is quite complex,
and in my opinion trying to keep the start/stop calls exactly matched without
individual 'has_started' flags seems ripe for bugs.
> While your approach will probably work it won't prevent other non-NAPI
> bad things from happening. Even if there's nothing today it might
> creep up in the future. And you'd need to update ahb.c too.
I'll update ahb.c to match.
Thanks,
Ben
>
>
> Michał
>
--
Ben Greear <greearb@candelatech.com>
Candela Technologies Inc http://www.candelatech.com
_______________________________________________
ath10k mailing list
ath10k@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/ath10k
prev parent reply other threads:[~2018-02-28 18:05 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-28 1:22 [RFC] ath10k: Attempt to work around napi_synchronize hang greearb
2018-02-28 17:31 ` Michał Kazior
2018-02-28 18:05 ` Ben Greear [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=95ddec98-2613-7e6d-3ec8-d47d1aa527db@candelatech.com \
--to=greearb@candelatech.com \
--cc=ath10k@lists.infradead.org \
--cc=kazikcz@gmail.com \
--cc=linux-wireless@vger.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