Re: [PATCH 03/13] dmaengine: up-level reference counting to themodule level

From: Guennadi Liakhovetski
Date: Thu Dec 04 2008 - 11:56:19 EST


On Fri, 14 Nov 2008, Dan Williams wrote:

> -/**
> * dma_async_client_register - register a &dma_client
> * @client: ptr to a client structure with valid 'event_callback' and 'cap_mask'
> */
> void dma_async_client_register(struct dma_client *client)
> {
> + struct dma_device *device, *_d;
> + struct dma_chan *chan;
> + int err;
> +
> /* validate client data */
> BUG_ON(dma_has_cap(DMA_SLAVE, client->cap_mask) &&
> !client->slave);
>
> mutex_lock(&dma_list_mutex);
> + dmaengine_ref_count++;
> +
> + /* try to grab channels */
> + list_for_each_entry_safe(device, _d, &dma_device_list, global_node)
> + list_for_each_entry(chan, &device->channels, device_node) {
> + err = dma_chan_get(chan);

Dan, could you please explain this: dma_chan_get() takes a reference on
the channel _and_ calls .device_alloc_chan_resources() on first invocation
for a specific channel. I now see three locations in dmaengine.c, where
dma_chan_get() is called: in dma_request_channel() - logical, but also in
dmaengine_get() and dma_async_device_register(), and these latter two I
don't understand. I do not understand why we have to grab references and
allocate resources for all (public) channels on all controllers in the
system if someone just called dmaengine_get()?

> @@ -420,6 +443,19 @@ int dma_async_device_register(struct dma_device *device)
> }
>
> mutex_lock(&dma_list_mutex);
> + list_for_each_entry(chan, &device->channels, device_node) {
> + /* if clients are already waiting for channels we need to
> + * take references on their behalf
> + */
> + if (dmaengine_ref_count && dma_chan_get(chan) == -ENODEV) {
> + /* note we can only get here for the first
> + * channel as the remaining channels are
> + * guaranteed to get a reference
> + */

This is the second location - where and how are clients waiting for
channels? In the old implementation clients had notification callbacks,
which were called as new channels became available. Now clients are gone,
so, what is meant here?

Confused
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/