Hi Gustavo, On 1/11/2019 6:33 PM, Gustavo Pimentel wrote: > Add Synopsys eDMA IP test and sample driver to be use for testing > purposes and also as a reference for any developer who needs to > implement and use Synopsys eDMA. > > This driver can be compile as built-in or external module in kernel. > > To enable this driver just select DW_EDMA_TEST option in kernel > configuration, however it requires and selects automatically DW_EDMA > option too. > > Changes: > RFC v1->RFC v2: > - No changes > RFC v2->RFC v3: > - Add test module > > Signed-off-by: Gustavo Pimentel <gustavo.pimentel@xxxxxxxxxxxx> > Cc: Vinod Koul <vkoul@xxxxxxxxxx> > Cc: Dan Williams <dan.j.williams@xxxxxxxxx> > Cc: Eugeniy Paltsev <paltsev@xxxxxxxxxxxx> > Cc: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > Cc: Russell King <rmk+kernel@xxxxxxxxxxxxxxx> > Cc: Niklas Cassel <niklas.cassel@xxxxxxxxxx> > Cc: Joao Pinto <jpinto@xxxxxxxxxxxx> > Cc: Jose Abreu <jose.abreu@xxxxxxxxxxxx> > Cc: Luis Oliveira <lolivei@xxxxxxxxxxxx> > Cc: Vitor Soares <vitor.soares@xxxxxxxxxxxx> > Cc: Nelson Costa <nelson.costa@xxxxxxxxxxxx> > Cc: Pedro Sousa <pedrom.sousa@xxxxxxxxxxxx> > +static int dw_edma_test_add_channel(struct dw_edma_test_info *info, > + struct dma_chan *chan, > + u32 channel) > +{ > + struct dw_edma_test_params *params = &info->params; > + struct dw_edma_test_thread *thread; > + struct dw_edma_test_chan *tchan; > + > + tchan = kvmalloc(sizeof(*tchan), GFP_KERNEL); > + if (!tchan) > + return -ENOMEM; > + > + tchan->chan = chan; > + > + thread = kvzalloc(sizeof(*thread), GFP_KERNEL); > + if (!thread) { > + kvfree(tchan); > + return -ENOMEM; > + } > + > + thread->info = info; > + thread->chan = tchan->chan; > + switch (channel) { > + case EDMA_CH_WR: > + thread->direction = DMA_DEV_TO_MEM; > + break; > + case EDMA_CH_RD: > + thread->direction = DMA_MEM_TO_DEV; > + break; > + default: > + kvfree(tchan); You are leaking thread here. > + return -EPERM; > + } > + thread->test_done.wait = &thread->done_wait; > + init_waitqueue_head(&thread->done_wait); > + > + if (!params->repetitions) > + thread->task = kthread_create(dw_edma_test_sg, thread, "%s", > + dma_chan_name(chan)); > + else > + thread->task = kthread_create(dw_edma_test_cyclic, thread, "%s", > + dma_chan_name(chan)); > + > + if (IS_ERR(thread->task)) { > + pr_err("failed to create thread %s\n", dma_chan_name(chan)); > + kvfree(tchan); > + kvfree(thread); > + return -EPERM; > + } > + > + tchan->thread = thread; > + dev_dbg(chan->device->dev, "add thread %s\n", dma_chan_name(chan)); > + list_add_tail(&tchan->node, &info->channels); > + > + return 0; > +} > +