Skip to content

Commit

Permalink
DMAENGINE: ste_dma40: fix desc_get
Browse files Browse the repository at this point in the history
Fix desc_get to alloc a descriptor from the cache if the ones in the
list are waiting for the ack.  Also, memzero the descriptor when
allocated from the list to ensure all fields are cleared.

Acked-by: Jonas Aaberg <jonas.aberg@stericsson.com>
Signed-off-by: Rabin Vincent <rabin.vincent@stericsson.com>
Signed-off-by: Linus Walleij <linus.walleij@stericsson.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Rabin Vincent authored and Dan Williams committed Oct 7, 2010
1 parent c6134c9 commit a2c15fa
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/dma/ste_dma40.c
Original file line number Diff line number Diff line change
Expand Up @@ -419,24 +419,29 @@ static void d40_desc_remove(struct d40_desc *d40d)

static struct d40_desc *d40_desc_get(struct d40_chan *d40c)
{
struct d40_desc *d;
struct d40_desc *_d;
struct d40_desc *desc = NULL;

if (!list_empty(&d40c->client)) {
struct d40_desc *d;
struct d40_desc *_d;

list_for_each_entry_safe(d, _d, &d40c->client, node)
if (async_tx_test_ack(&d->txd)) {
d40_pool_lli_free(d);
d40_desc_remove(d);
desc = d;
memset(desc, 0, sizeof(*desc));
break;
}
} else {
d = kmem_cache_alloc(d40c->base->desc_slab, GFP_NOWAIT);
if (d != NULL) {
memset(d, 0, sizeof(struct d40_desc));
INIT_LIST_HEAD(&d->node);
}
}
return d;

if (!desc)
desc = kmem_cache_zalloc(d40c->base->desc_slab, GFP_NOWAIT);

if (desc)
INIT_LIST_HEAD(&desc->node);

return desc;
}

static void d40_desc_free(struct d40_chan *d40c, struct d40_desc *d40d)
Expand Down

0 comments on commit a2c15fa

Please sign in to comment.