From: dan.j.williams@intel.com (Dan Williams)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 11/31] dma: add channel request API that supports deferred probe
Date: Thu, 21 Nov 2013 22:54:26 -0800 [thread overview]
Message-ID: <CAPcyv4jTUVjhFFXP8RL2jCqFj1MqxSCKQYvfdLHTj+1PRDDL3Q@mail.gmail.com> (raw)
In-Reply-To: <528E4F55.9070204@wwwdotorg.org>
On Thu, Nov 21, 2013 at 10:22 AM, Stephen Warren <swarren@wwwdotorg.org> wrote:
> On 11/20/2013 08:22 PM, Dan Williams wrote:
>> On Wed, Nov 20, 2013 at 1:24 PM, Stephen Warren <swarren@wwwdotorg.org> wrote:
>>> On 11/20/2013 01:23 PM, Williams, Dan J wrote:
>>> ...
>>>> Why do the drivers that call dma_request_channel need to convert it to
>>>> an ERR value? i.e. what's problematic about the below (not compile
>>>> tested)?
>>> ...
>>>> diff --git a/arch/arm/plat-samsung/dma-ops.c b/arch/arm/plat-samsung/dma-ops.c
>>> ...
>>>> @@ -22,16 +22,20 @@ static unsigned samsung_dmadev_request(enum dma_ch dma_ch,
>>>> struct samsung_dma_req *param,
>>>> struct device *dev, char *ch_name)
>>> ...
>>>> + if (dev->of_node) {
>>>> + chan = dma_request_slave_channel(dev, ch_name);
>>>> + return IS_ERR(chan) ? (unsigned) NULL : (unsigned) chan;
>>>> + } else {
>>>> return (unsigned)dma_request_channel(mask, pl330_filter,
>>>> (void *)dma_ch);
>>>> + }
>>>
>>> The argument is that if a function returns errors encoded as an ERR
>>> pointer, then callers must assume that any non-IS_ERR value that the
>>> function returns is valid. NULL is one of those values. As such, callers
>>> can no longer check the value against NULL, but must use IS_ERR().
>>> Converting any IS_ERR() returns to NULL theoretically is the act of
>>> converting one valid return value to some other completely random return
>>> value.
>>
>> You describe how IS_ERR() works, but you didn't address the patch.
>> There's nothing random about the changes to samsung_dmadev_request().
>> It still returns NULL or a valid channel just as before.
>
> I was addressing the patch. I guess I should have explained as follows.
>
> First, the following code is technically buggy:
No, it's not, but I think we have different implementations in mind.
>
> + chan = dma_request_slave_channel(dev, ch_name);
> + return IS_ERR(chan) ? (unsigned) NULL : (unsigned) chan;
>
> ... since it assumes that dma_request_slave_channel() never returns NULL
> as a valid non-error value. This is specifically prohibited by the fact
> that dma_request_slave_channel() returns either an ERR value or a valid
> value; in that case, NULL is not an ERR value, and hence must be
> considered valid.
Let's stop there and be clear we are talking about the same proposal.
The proposal is dma_request_slave_channel only returns errors or valid
pointers, never NULL.
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
index 9162ac80c18f..64c163664b9d 100644
--- a/drivers/dma/dmaengine.c
+++ b/drivers/dma/dmaengine.c
@@ -593,15 +593,20 @@ EXPORT_SYMBOL_GPL(__dma_request_channel);
*/
struct dma_chan *dma_request_slave_channel(struct device *dev, const
char *name)
{
+ struct dma_chan *chan = ERR_PTR(-ENODEV);
+
/* If device-tree is present get slave info from here */
if (dev->of_node)
return of_dma_request_slave_channel(dev->of_node, name);
/* If device was enumerated by ACPI get slave info from here */
- if (ACPI_HANDLE(dev))
- return acpi_dma_request_slave_chan_by_name(dev, name);
+ if (ACPI_HANDLE(dev)) {
+ chan = acpi_dma_request_slave_chan_by_name(dev, name);
+ if (!chan)
+ chan = ERR_PTR(-ENODEV);
+ }
- return NULL;
+ return chan;
}
In the above the assumption is that of_dma_request_slave_channel() is
modified to guarantee it only returns ERR_PTRs or valid pointers never
NULL. acpi_dma_request_slave_chan_by_name() can continue returning
NULL and dma_request_slave_channel will translate it to an ERR_PTR, or
you can convert it as you do in your patch. Not much value in
converting acpi_dma_request_slave_chan_by_name as it does not return
EPROBE_DEFER and nothing currently cares about the other error values.
next prev parent reply other threads:[~2013-11-22 6:54 UTC|newest]
Thread overview: 176+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-11-15 20:53 [PATCH 00/31] ARM: tegra: use common reset and DMA bindings Stephen Warren
2013-11-15 20:53 ` [PATCH 01/31] ARM: tegra: add missing clock documentation to DT bindings Stephen Warren
2013-11-16 22:00 ` Marc Dietrich
2013-11-18 17:36 ` Stephen Warren
2013-11-29 11:49 ` Thierry Reding
2013-12-01 19:05 ` Stephen Warren
2013-12-02 8:52 ` Thierry Reding
2013-12-03 18:31 ` Stephen Warren
2013-12-04 8:48 ` Thierry Reding
2013-12-04 17:34 ` Stephen Warren
2013-12-04 19:27 ` Thierry Reding
2013-12-03 18:36 ` Stephen Warren
2013-12-04 8:49 ` Thierry Reding
2013-11-15 20:53 ` [PATCH 02/31] ARM: tegra: document reset properties in " Stephen Warren
2013-11-29 12:23 ` Thierry Reding
2013-12-01 19:06 ` Stephen Warren
2013-12-02 9:08 ` Thierry Reding
2013-12-03 18:48 ` Stephen Warren
2013-12-04 8:56 ` Thierry Reding
2013-11-15 20:53 ` [PATCH 03/31] ARM: tegra: document use of standard DMA " Stephen Warren
2013-11-29 12:29 ` Thierry Reding
2013-12-01 19:09 ` Stephen Warren
2013-12-02 9:05 ` Thierry Reding
2013-12-03 18:52 ` Stephen Warren
2013-12-04 8:56 ` Thierry Reding
2013-11-15 20:53 ` [PATCH 04/31] ARM: tegra: update DT files to add reset properties Stephen Warren
2013-11-29 13:00 ` Thierry Reding
2013-12-01 19:15 ` Stephen Warren
2013-12-02 9:01 ` Thierry Reding
2013-12-03 18:59 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 05/31] ARM: tegra: update DT files to add DMA properties Stephen Warren
2013-11-29 13:08 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 06/31] ARM: tegra: select the reset framework Stephen Warren
2013-11-29 13:10 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 07/31] clk: tegra: implement a reset driver Stephen Warren
2013-11-29 13:26 ` Thierry Reding
2013-12-03 19:07 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 08/31] pci: tegra: use reset framework Stephen Warren
2013-11-15 21:16 ` Bjorn Helgaas
2013-11-29 13:29 ` Thierry Reding
2013-11-29 13:33 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 09/31] drm/tegra: " Stephen Warren
2013-11-29 13:42 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 10/31] ARM: tegra: pass reset to tegra_powergate_sequence_power_up() Stephen Warren
2013-11-15 21:17 ` Bjorn Helgaas
2013-11-29 13:45 ` Thierry Reding
2013-11-29 13:46 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 11/31] dma: add channel request API that supports deferred probe Stephen Warren
2013-11-15 21:01 ` Dan Williams
2013-11-15 21:05 ` Dan Williams
2013-11-18 9:18 ` Shevchenko, Andriy
2013-11-18 17:42 ` Stephen Warren
2013-11-19 12:00 ` Andy Shevchenko
2013-11-19 17:15 ` Stephen Warren
2013-11-19 23:37 ` Dan Williams
2013-11-20 0:09 ` Stephen Warren
2013-11-20 0:38 ` Dan Williams
2013-11-20 18:24 ` Stephen Warren
2013-11-20 19:15 ` Dan Williams
2013-11-20 19:22 ` Stephen Warren
2013-11-20 20:23 ` Williams, Dan J
2013-11-20 21:24 ` Stephen Warren
2013-11-21 3:22 ` Dan Williams
2013-11-21 9:13 ` Andy Shevchenko
2013-11-21 18:22 ` Stephen Warren
2013-11-22 6:54 ` Dan Williams [this message]
2013-11-22 17:34 ` Stephen Warren
2013-11-22 18:04 ` Dan Williams
2013-11-22 18:10 ` Stephen Warren
2013-11-22 19:49 ` Dan Williams
2013-11-22 19:53 ` Stephen Warren
2013-11-22 20:46 ` Dan Williams
2013-11-22 21:50 ` Stephen Warren
2013-11-22 23:13 ` Dan Williams
2013-11-22 23:45 ` Stephen Warren
2013-11-23 0:40 ` Russell King - ARM Linux
2013-11-23 0:34 ` Russell King - ARM Linux
2013-11-25 17:26 ` Stephen Warren
2013-11-25 17:45 ` Dan Williams
2013-11-25 18:00 ` Russell King - ARM Linux
2013-11-25 18:07 ` Stephen Warren
2013-11-25 18:42 ` Dan Williams
2013-11-25 19:00 ` Stephen Warren
2013-11-25 19:28 ` Dan Williams
2013-11-25 19:30 ` Stephen Warren
2013-11-25 19:45 ` Dan Williams
2013-11-25 19:47 ` Stephen Warren
2013-11-25 19:09 ` Russell King - ARM Linux
2013-11-25 17:53 ` Russell King - ARM Linux
2013-11-25 17:57 ` Stephen Warren
2013-11-25 20:28 ` Gerhard Sittig
2013-11-25 20:52 ` Russell King - ARM Linux
2013-11-28 21:20 ` NULL clock items (was: [PATCH 11/31] dma: add channel request API that supports deferred probe) Gerhard Sittig
2013-11-22 23:45 ` [PATCH 11/31] dma: add channel request API that supports deferred probe Dan Williams
2013-11-23 0:17 ` Stephen Warren
2013-11-23 0:37 ` Dan Williams
2013-11-15 23:08 ` Stephen Warren
2013-11-22 23:50 ` Dan Williams
2013-11-23 0:05 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 12/31] dma: tegra: use reset framework Stephen Warren
2013-11-25 22:11 ` Stephen Warren
2013-11-29 13:47 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 13/31] dma: tegra: register as an OF DMA controller Stephen Warren
2013-11-20 15:28 ` Arnd Bergmann
2013-11-20 18:22 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 14/31] ASoC: dmaengine: support deferred probe for DMA channels Stephen Warren
2013-11-16 9:29 ` Mark Brown
2013-11-16 10:49 ` [alsa-devel] " Lars-Peter Clausen
2013-11-18 17:59 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 15/31] ASoC: dmaengine: add custom DMA config to snd_dmaengine_pcm_config Stephen Warren
2013-11-16 9:44 ` Mark Brown
2013-11-18 18:45 ` Stephen Warren
2013-11-19 9:35 ` Mark Brown
2013-11-16 10:43 ` [alsa-devel] " Lars-Peter Clausen
2013-11-15 20:54 ` [PATCH 16/31] ASoC: tegra: use reset framework Stephen Warren
2013-11-16 9:55 ` Mark Brown
2013-11-18 17:21 ` Stephen Warren
2013-11-18 18:37 ` Mark Brown
2013-11-25 21:56 ` Stephen Warren
2013-11-26 13:14 ` Mark Brown
2013-11-26 16:31 ` Stephen Warren
2013-11-26 18:37 ` Mark Brown
2013-11-26 18:45 ` Stephen Warren
2013-11-15 20:54 ` [PATCH 17/31] ASoC: tegra: call pm_runtime APIs around register accesses Stephen Warren
2013-11-16 10:02 ` Mark Brown
2013-11-18 17:25 ` Stephen Warren
2013-11-18 18:39 ` Mark Brown
2013-11-18 22:38 ` Stephen Warren
2013-11-19 9:53 ` Mark Brown
2013-11-15 20:54 ` [PATCH 18/31] ASoC: tegra: allocate AHUB FIFO during probe() not startup() Stephen Warren
2013-11-16 10:04 ` Mark Brown
2013-11-29 14:40 ` Thierry Reding
2013-12-03 19:55 ` Stephen Warren
2013-12-04 9:00 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 19/31] ASoC: tegra: convert to standard DMA DT bindings Stephen Warren
2013-11-16 10:05 ` Mark Brown
2013-11-15 20:54 ` [PATCH 20/31] i2c: tegra: use reset framework Stephen Warren
2013-11-15 22:20 ` Wolfram Sang
2013-11-29 14:46 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 21/31] staging: nvec: " Stephen Warren
2013-11-16 22:33 ` Marc Dietrich
2013-11-19 23:23 ` Greg Kroah-Hartman
2013-11-29 14:47 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 22/31] spi: tegra: " Stephen Warren
2013-11-16 10:07 ` Mark Brown
2013-11-29 14:48 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 23/31] spi: tegra: convert to standard DMA DT bindings Stephen Warren
2013-11-16 10:14 ` Mark Brown
2013-11-18 17:30 ` Stephen Warren
2013-11-18 18:41 ` Mark Brown
2013-11-15 20:54 ` [PATCH 24/31] serial: tegra: use reset framework Stephen Warren
2013-11-19 23:24 ` Greg Kroah-Hartman
2013-11-29 14:49 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 25/31] serial: tegra: convert to standard DMA DT bindings Stephen Warren
2013-11-19 23:23 ` Greg Kroah-Hartman
2013-11-15 20:54 ` [PATCH 26/31] Input: tegra-kbc - use reset framework Stephen Warren
2013-11-19 21:17 ` Dmitry Torokhov
2013-11-29 14:50 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 27/31] USB: EHCI: tegra: " Stephen Warren
2013-11-16 18:12 ` Alan Stern
2013-11-19 23:24 ` Greg Kroah-Hartman
2013-11-29 14:51 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 28/31] ARM: tegra: remove legacy clock entries from DT Stephen Warren
2013-11-29 14:53 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 29/31] ARM: tegra: remove legacy DMA " Stephen Warren
2013-11-29 14:53 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 30/31] clk: tegra: remove legacy reset APIs Stephen Warren
2013-11-29 14:55 ` Thierry Reding
2013-11-15 20:54 ` [PATCH 31/31] clk: tegra: remove bogus PCIE_XCLK Stephen Warren
2013-11-29 14:56 ` Thierry Reding
2013-11-18 8:24 ` [PATCH 00/31] ARM: tegra: use common reset and DMA bindings Terje Bergström
2013-11-20 15:37 ` Arnd Bergmann
2013-11-20 16:45 ` Stephen Warren
2013-11-20 17:03 ` Arnd Bergmann
2013-11-20 17:23 ` Stephen Warren
2013-12-12 0:11 ` Stephen Warren
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=CAPcyv4jTUVjhFFXP8RL2jCqFj1MqxSCKQYvfdLHTj+1PRDDL3Q@mail.gmail.com \
--to=dan.j.williams@intel.com \
--cc=linux-arm-kernel@lists.infradead.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;
as well as URLs for NNTP newsgroup(s).