All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ulf Hansson <ulf.hansson@linaro.org>
To: Adrian Hunter <adrian.hunter@intel.com>
Cc: "linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>,
	Jens Axboe <axboe@kernel.dk>,
	Paolo Valente <paolo.valente@linaro.org>,
	linux-block@vger.kernel.org,
	Linus Walleij <linus.walleij@linaro.org>,
	Mark Brown <broonie@kernel.org>
Subject: Re: [RFC PATCH 1/3] mmc: sdio: Don't use abort-able claim host method from SDIO IRQ thread
Date: Mon, 15 May 2017 14:51:04 +0200	[thread overview]
Message-ID: <CAPDyKFr9eWCSrjx0qcxKzfJ+Oq7Z48h39dsCcn2iu_JNWJz=mQ@mail.gmail.com> (raw)
In-Reply-To: <6b359de4-4503-ca19-0e1d-84b909b21786@intel.com>

On 12 May 2017 at 09:42, Adrian Hunter <adrian.hunter@intel.com> wrote:
> On 11/05/17 15:39, Ulf Hansson wrote:
>> In a step to simplify the use of the lock, mmc_claim|release_host(), let's
>> change the SDIO IRQ thread to move away from using the abort-able claim
>> host method.
>>
>> In the SDIO IRQ thread case, we can instead check the numbers of SDIO IRQs
>> that are currently claimed via host->sdio_irqs, as this field is protected
>> from updates unless the host is claimed. When host->sdio_irqs has become
>> zero, it means the SDIO func driver(s) has released the SDIO IRQ, then we
>> can bail out and stop running the SDIO IRQ thread.
>
> Does that work?  It looks a like kthread_stop() will wait on the thread,
> which is waiting to claim the host, which is claimed by the caller of
> sdio_card_irq_put() which called kthread_stop() i.e. deadlock.

Adrian, you are right and thanks for your analyze!

Maybe it's better that I first continue with my other series,
converting the kthread to a work/work-queue. As that makes it easier
to move away from using the abort-able claim host API.

Kind regards
Uffe

>
>>
>> Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
>> ---
>>  drivers/mmc/core/sdio_irq.c | 10 ++++++----
>>  include/linux/mmc/host.h    |  1 -
>>  2 files changed, 6 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c
>> index 6d4b720..95f7a09 100644
>> --- a/drivers/mmc/core/sdio_irq.c
>> +++ b/drivers/mmc/core/sdio_irq.c
>> @@ -137,9 +137,13 @@ static int sdio_irq_thread(void *_host)
>>                * holding of the host lock does not cover too much work
>>                * that doesn't require that lock to be held.
>>                */
>> -             ret = __mmc_claim_host(host, &host->sdio_irq_thread_abort);
>> -             if (ret)
>> +             mmc_claim_host(host);
>> +             if (!host->sdio_irqs) {
>> +                     ret = 1;
>> +                     mmc_release_host(host);
>>                       break;
>> +             }
>> +
>>               ret = process_sdio_pending_irqs(host);
>>               host->sdio_irq_pending = false;
>>               mmc_release_host(host);
>> @@ -195,7 +199,6 @@ static int sdio_card_irq_get(struct mmc_card *card)
>>
>>       if (!host->sdio_irqs++) {
>>               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
>> -                     atomic_set(&host->sdio_irq_thread_abort, 0);
>>                       host->sdio_irq_thread =
>>                               kthread_run(sdio_irq_thread, host,
>>                                           "ksdioirqd/%s", mmc_hostname(host));
>> @@ -223,7 +226,6 @@ static int sdio_card_irq_put(struct mmc_card *card)
>>
>>       if (!--host->sdio_irqs) {
>>               if (!(host->caps2 & MMC_CAP2_SDIO_IRQ_NOTHREAD)) {
>> -                     atomic_set(&host->sdio_irq_thread_abort, 1);
>>                       kthread_stop(host->sdio_irq_thread);
>>               } else if (host->caps & MMC_CAP_SDIO_IRQ) {
>>                       host->ops->enable_sdio_irq(host, 0);
>> diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
>> index 21385ac..8a4131f 100644
>> --- a/include/linux/mmc/host.h
>> +++ b/include/linux/mmc/host.h
>> @@ -359,7 +359,6 @@ struct mmc_host {
>>       unsigned int            sdio_irqs;
>>       struct task_struct      *sdio_irq_thread;
>>       bool                    sdio_irq_pending;
>> -     atomic_t                sdio_irq_thread_abort;
>>
>>       mmc_pm_flag_t           pm_flags;       /* requested pm features */
>>
>>
>

  reply	other threads:[~2017-05-15 12:51 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-05-11 12:38 [RFC PATCH 0/3] mmc: core: Prepare mmc host locking for blk-mq Ulf Hansson
2017-05-11 12:39 ` [RFC PATCH 1/3] mmc: sdio: Don't use abort-able claim host method from SDIO IRQ thread Ulf Hansson
2017-05-12  7:42   ` Adrian Hunter
2017-05-15 12:51     ` Ulf Hansson [this message]
2017-05-11 12:39 ` [RFC PATCH 2/3] mmc: core: Remove redundant abort-able claim host API Ulf Hansson
2017-05-11 12:39 ` [RFC PATCH 3/3] mmc: core: Allow mmc block device to re-claim the host Ulf Hansson
2017-05-12  8:36   ` Adrian Hunter
2017-05-15 14:05     ` Ulf Hansson
2017-05-16 13:24       ` Adrian Hunter
2017-05-16 14:32         ` Ulf Hansson

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='CAPDyKFr9eWCSrjx0qcxKzfJ+Oq7Z48h39dsCcn2iu_JNWJz=mQ@mail.gmail.com' \
    --to=ulf.hansson@linaro.org \
    --cc=adrian.hunter@intel.com \
    --cc=axboe@kernel.dk \
    --cc=broonie@kernel.org \
    --cc=linus.walleij@linaro.org \
    --cc=linux-block@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=paolo.valente@linaro.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 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.