From: David Daney <ddaney@caviumnetworks.com>
To: Arnd Bergmann <arnd@arndb.de>
Cc: Matt Redfearn <matt.redfearn@imgtec.com>,
ulf.hansson@linaro.org, linux-mmc@vger.kernel.org,
Aleksey Makarov <aleksey.makarov@caviumnetworks.com>,
Chandrakala Chavva <cchavva@caviumnetworks.com>,
David Daney <david.daney@cavium.com>,
Aleksey Makarov <aleksey.makarov@auriga.com>,
Leonid Rosenboim <lrosenboim@caviumnetworks.com>,
Peter Swain <pswain@cavium.com>,
Aaron Williams <aaron.williams@cavium.com>
Subject: Re: [RESEND PATCH v7 2/2] mmc: OCTEON: Add host driver for OCTEON MMC controller
Date: Tue, 19 Apr 2016 16:27:03 -0700 [thread overview]
Message-ID: <5716BEC7.5000706@caviumnetworks.com> (raw)
In-Reply-To: <37975265.p6gUi9hTMt@wuerfel>
On 04/19/2016 03:09 PM, Arnd Bergmann wrote:
> On Tuesday 19 April 2016 14:45:35 David Daney wrote:
>> On 04/19/2016 01:46 PM, Arnd Bergmann wrote:
>>> On Thursday 31 March 2016 16:26:53 Matt Redfearn wrote:
>>>> +struct octeon_mmc_host {
>>>> + u64 base;
>>>> + u64 ndf_base;
>>>> + u64 emm_cfg;
>>>> + u64 n_minus_one; /* OCTEON II workaround location */
>>>> + int last_slot;
>>>> +
>>>> + struct semaphore mmc_serializer;
>>>
>>> Please don't add any new semaphores to the kernel, use a mutex or
>>> a completion instead.
>>
>> The last time I checked, a mutex could not be used from interrupt context.
>>
>> Since we are in interrupt context and we really want mutex-like behavior
>> here, it seems like a semaphore is just the thing we need.
>>
>> I am not sure how completions would be of use, perhaps you could elaborate.
>
> Completions are used when you have one thread waiting for an event,
> which is often an interrupt: the process calls
> wait_for_completion(&completion); and the interrupt handler calls
> complete(&completion);
>
> It seems that you are using the semaphore for two reasons here (I
> only read it briefly so I may be wrong):
> waiting for the interrupt handler and serializing against another
> thread. In this case you need both a mutex (to guarantee mutual
> exclusion) and a completion (to wait for the interrupt handler
> to finish).
>
The way the MMC driver works is that the driver's .request() method is
called to initiate a request. After .request() is finished, it returns
back to the kernel so other work can be done.
From the interrupt handler, when the request is complete, the interrupt
handler calls req->done(req); to terminate the whole thing.
So we have:
CPU-A CPU-B CPU-C
octeon_mmc_request(0) . .
down() . .
queue_request(0); . .
return; . .
other_useful_work . .
. . .
. . .
. . .
octeon_mmc_request(1) . .
down() -> blocks . .
octeon_mmc_interrupt() .
up() -> unblocks .
down() <-unblocks req->done(0) .
queue_request(1); return; .
return; . .
other_useful_work . .
. . octeon_mmc_interrupt()
. . up()
. . req->done(1)
. . return;
. . .
We don't want to have the thread on CPU-A wait around in an extra mutex
or completion for the command to finish. The MMC core already has its
own request waiting code, but it doesn't handle the concept of a slot.
These commands can take hundreds or thousands of mS to terminate. The
whole idea of the MMC framework is to queue the request and get back to
doing other work ASAP.
In the case of this octeon_mmc driver we need to serialize the commands
issued to multiple slots, for this we use the semaphore. If you don't
like struct semaphore, we would have to invent a proprietary wait queue
mechanism that has semantics nearly identical to struct semaphore, and
people would complain that we are reinventing the semaphore.
It doesn't seem clean to cobble up multiple waiting structures
(completion + mutex + logic that surely would contain errors) where a
single (well debugged) struct semaphore does what we want.
David Daney
next prev parent reply other threads:[~2016-04-19 23:27 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-31 15:26 [RESEND PATCH v7 1/2] mmc: OCTEON: Add DT bindings for OCTEON MMC controller Matt Redfearn
2016-03-31 15:26 ` [RESEND PATCH v7 2/2] mmc: OCTEON: Add host driver " Matt Redfearn
2016-04-19 20:46 ` Arnd Bergmann
2016-04-19 21:45 ` David Daney
2016-04-19 22:09 ` Arnd Bergmann
2016-04-19 23:27 ` David Daney [this message]
2016-04-19 23:57 ` Arnd Bergmann
2016-04-20 0:02 ` Arnd Bergmann
2016-04-21 8:02 ` Ulf Hansson
2016-04-21 10:15 ` Arnd Bergmann
2016-04-21 12:44 ` Ulf Hansson
2016-04-21 13:19 ` Arnd Bergmann
2016-04-22 13:54 ` Ulf Hansson
2016-04-22 16:42 ` Arnd Bergmann
2016-04-22 17:49 ` David Daney
2016-04-22 20:23 ` Arnd Bergmann
2016-04-14 12:45 ` [RESEND PATCH v7 1/2] mmc: OCTEON: Add DT bindings " Ulf Hansson
2016-04-18 8:53 ` Matt Redfearn
2016-04-18 11:13 ` Ulf Hansson
2016-04-18 11:37 ` Matt Redfearn
2016-04-18 12:08 ` Ulf Hansson
2016-04-18 12:57 ` Matt Redfearn
2016-04-18 22:59 ` David Daney
2016-04-19 9:15 ` Ulf Hansson
2016-04-19 16:13 ` David Daney
2016-04-19 19:33 ` Ulf Hansson
2016-04-19 20:25 ` David Daney
2016-04-19 20:56 ` Arnd Bergmann
2016-04-19 21:50 ` David Daney
2016-04-20 9:32 ` Ulf Hansson
2016-04-20 22:32 ` David Daney
2016-04-20 22:42 ` Arnd Bergmann
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=5716BEC7.5000706@caviumnetworks.com \
--to=ddaney@caviumnetworks.com \
--cc=aaron.williams@cavium.com \
--cc=aleksey.makarov@auriga.com \
--cc=aleksey.makarov@caviumnetworks.com \
--cc=arnd@arndb.de \
--cc=cchavva@caviumnetworks.com \
--cc=david.daney@cavium.com \
--cc=linux-mmc@vger.kernel.org \
--cc=lrosenboim@caviumnetworks.com \
--cc=matt.redfearn@imgtec.com \
--cc=pswain@cavium.com \
--cc=ulf.hansson@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.