From: Adrian Hunter <adrian.hunter@nokia.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Jarkko Lavinen <jarkko.lavinen@nokia.com>,
Adrian Hunter <adrian.hunter@nokia.com>,
Madhusudhan Chikkature <madhu.cr@ti.com>,
linux-mmc Mailing List <linux-mmc@vger.kernel.org>,
linux-omap Mailing List <linux-omap@vger.kernel.org>,
Pierre Ossman <pierre@ossman.eu>,
Matt Fleming <matt@console-pimps.org>
Subject: [PATCH V3 2/30] mmc: allow host claim / release nesting
Date: Wed, 09 Sep 2009 14:56:49 +0300 [thread overview]
Message-ID: <20090909115649.12833.23833.sendpatchset@ahunter-laptop> (raw)
In-Reply-To: <20090909115633.12833.39619.sendpatchset@ahunter-laptop>
>From 38406738784f19de180db9872a7e10bd02908dc8 Mon Sep 17 00:00:00 2001
From: Adrian Hunter <adrian.hunter@nokia.com>
Date: Mon, 27 Apr 2009 13:38:42 +0300
Subject: [PATCH] mmc: allow host claim / release nesting
This change allows the MMC host to be claimed in
situations where the host may or may not have
already been claimed. Also 'mmc_try_claim_host()'
is now exported.
Signed-off-by: Adrian Hunter <adrian.hunter@nokia.com>
---
drivers/mmc/core/core.c | 34 +++++++++++++++++++++++++---------
include/linux/mmc/core.h | 1 +
include/linux/mmc/host.h | 2 ++
3 files changed, 28 insertions(+), 9 deletions(-)
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 9bc8d27..bab5015 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -461,16 +461,18 @@ int __mmc_claim_host(struct mmc_host *host, atomic_t *abort)
while (1) {
set_current_state(TASK_UNINTERRUPTIBLE);
stop = abort ? atomic_read(abort) : 0;
- if (stop || !host->claimed)
+ if (stop || !host->claimed || host->claimer == current)
break;
spin_unlock_irqrestore(&host->lock, flags);
schedule();
spin_lock_irqsave(&host->lock, flags);
}
set_current_state(TASK_RUNNING);
- if (!stop)
+ if (!stop) {
host->claimed = 1;
- else
+ host->claimer = current;
+ host->claim_cnt += 1;
+ } else
wake_up(&host->wq);
spin_unlock_irqrestore(&host->lock, flags);
remove_wait_queue(&host->wq, &wait);
@@ -481,29 +483,43 @@ int __mmc_claim_host(struct mmc_host *host, atomic_t *abort)
EXPORT_SYMBOL(__mmc_claim_host);
-static int mmc_try_claim_host(struct mmc_host *host)
+/**
+ * mmc_try_claim_host - try exclusively to claim a host
+ * @host: mmc host to claim
+ *
+ * Returns %1 if the host is claimed, %0 otherwise.
+ */
+int mmc_try_claim_host(struct mmc_host *host)
{
int claimed_host = 0;
unsigned long flags;
spin_lock_irqsave(&host->lock, flags);
- if (!host->claimed) {
+ if (!host->claimed || host->claimer == current) {
host->claimed = 1;
+ host->claimer = current;
+ host->claim_cnt += 1;
claimed_host = 1;
}
spin_unlock_irqrestore(&host->lock, flags);
return claimed_host;
}
+EXPORT_SYMBOL(mmc_try_claim_host);
static void mmc_do_release_host(struct mmc_host *host)
{
unsigned long flags;
spin_lock_irqsave(&host->lock, flags);
- host->claimed = 0;
- spin_unlock_irqrestore(&host->lock, flags);
-
- wake_up(&host->wq);
+ if (--host->claim_cnt) {
+ /* Release for nested claim */
+ spin_unlock_irqrestore(&host->lock, flags);
+ } else {
+ host->claimed = 0;
+ host->claimer = NULL;
+ spin_unlock_irqrestore(&host->lock, flags);
+ wake_up(&host->wq);
+ }
}
void mmc_host_deeper_disable(struct work_struct *work)
diff --git a/include/linux/mmc/core.h b/include/linux/mmc/core.h
index 7ac8b50..e4898e9 100644
--- a/include/linux/mmc/core.h
+++ b/include/linux/mmc/core.h
@@ -139,6 +139,7 @@ extern unsigned int mmc_align_data_size(struct mmc_card *, unsigned int);
extern int __mmc_claim_host(struct mmc_host *host, atomic_t *abort);
extern void mmc_release_host(struct mmc_host *host);
+extern int mmc_try_claim_host(struct mmc_host *host);
/**
* mmc_claim_host - exclusively claim a host
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 338a9b3..631a2fe 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -182,6 +182,8 @@ struct mmc_host {
struct mmc_card *card; /* device attached to this host */
wait_queue_head_t wq;
+ struct task_struct *claimer; /* task that has host claimed */
+ int claim_cnt; /* "claim" nesting count */
struct delayed_work detect;
--
1.5.6.3
next prev parent reply other threads:[~2009-09-09 11:56 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-09 11:56 [PATCH V3 0/30] mmc and omap_hsmmc patches Adrian Hunter
2009-09-09 11:56 ` [PATCH V3 1/30] mmc: add 'enable' and 'disable' methods to mmc host Adrian Hunter
2009-09-09 11:56 ` Adrian Hunter [this message]
2009-09-09 11:56 ` [PATCH V3 3/30] mmc: add MMC_CAP_NONREMOVABLE host capability Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 4/30] mmc: add ability to save power by powering off cards Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 5/30] mmc: add mmc card sleep and awake support Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 6/30] mmc: power off once at removal Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 7/30] mmc: check status after MMC SWITCH command Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 8/30] omap_hsmmc: add debugfs entry (host registers) Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 9/30] omap_hsmmc: make use of new enable/disable interface Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 10/30] ARM: OMAP: mmc-twl4030: add context loss counter support Adrian Hunter
2009-09-09 11:57 ` [PATCH V3 11/30] omap_hsmmc: keep track of power mode Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 12/30] omap_hsmmc: context save/restore support Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 13/30] omap_hsmmc: set open drain bit correctly Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 14/30] omap_hsmmc: ensure workqueues are empty before suspend Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 15/30] omap_hsmmc: fix scatter-gather list sanity checking Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 16/30] omap_hsmmc: make use of new MMC_CAP_NONREMOVABLE host capability Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 17/30] omap_hsmmc: support for deeper power saving states Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 18/30] ARM: OMAP: mmc-twl4030: add regulator sleep / wake function Adrian Hunter
2009-09-09 11:58 ` [PATCH V3 19/30] omap_hsmmc: put MMC regulator to sleep Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 20/30] omap_hsmmc: add mmc card sleep and awake support Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 21/30] omap_hsmmc: fix NULL pointer dereference Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 22/30] omap_hsmmc: cleanup macro usage Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 23/30] omap_hsmmc: clear interrupt status after init sequence Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 24/30] omap_hsmmc: cater for weird CMD6 behaviour Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 25/30] omap_hsmmc: prevent races with irq handler Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 26/30] omap_hsmmc: code refactoring Adrian Hunter
2009-09-09 11:59 ` [PATCH V3 27/30] omap_hsmmc: protect the card when the cover is open Adrian Hunter
2009-09-09 12:00 ` [PATCH V3 28/30] omap_hsmmc: ensure all clock enables and disables are paired Adrian Hunter
2009-09-10 22:02 ` Andrew Morton
2009-09-11 8:31 ` Adrian Hunter
2009-09-09 12:00 ` [PATCH V3 29/30] omap_hsmmc: set a large data timeout for commands with busy signal Adrian Hunter
2009-09-09 12:00 ` [PATCH V3 30/30] ARM: OMAP: RX51: set MMC capabilities and power-saving flag Adrian Hunter
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=20090909115649.12833.23833.sendpatchset@ahunter-laptop \
--to=adrian.hunter@nokia.com \
--cc=akpm@linux-foundation.org \
--cc=jarkko.lavinen@nokia.com \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=madhu.cr@ti.com \
--cc=matt@console-pimps.org \
--cc=pierre@ossman.eu \
/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