lkml.org 
[lkml]   [2009]   [Mar]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
SubjectRe: [PATCH 1/2] dmaengine: TXx9 Soc DMA Controller driver
From
On Fri, 13 Mar 2009 01:19:50 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> wrote:
> Subject: dmaengine: Use chan_id provided by DMA device driver
> From: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
>
> If chan_id was already given by the DMA device driver, use it.
> Otherwise assign an incremental number for each channels.
>
> This allows the DMA device driver to reserve some channel ID numbers.
...
> @@ -663,7 +664,9 @@ int dma_async_device_register(struct dma_device *device)
> continue;
> }
>
> - chan->chan_id = chancnt++;
> + if (!chan->chan_id)
> + chan->chan_id = chan_id++;
> + chancnt++;
> chan->dev->device.class = &dma_devclass;
> chan->dev->device.parent = device->dev;
> chan->dev->chan = chan;

This patch will fix another potential problem. Some driver, for
example ipu, assumes chan_id is an index of its internal array. But
dmaengine core does not guarantee it.

/* represent channels in sysfs. Probably want devs too */
list_for_each_entry(chan, &device->channels, device_node) {
chan->local = alloc_percpu(typeof(*chan->local));
if (chan->local == NULL)
continue;
chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL);
if (chan->dev == NULL) {
free_percpu(chan->local);
continue;
}

chan->chan_id = chancnt++;
...
}
device->chancnt = chancnt;

If alloc_percpu or kzalloc failed, chan_id does not match with its
position in device->channels list.


And above "continue" looks buggy anyway. Keeping incomplete channels
in device->channels list looks very dangerous...

---
Atsushi Nemoto


\
 
 \ /
  Last update: 2009-03-13 15:19    [W:0.474 / U:0.268 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site