Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-13 Thread Robin Gong
Hi Lucas,
I have identified the root cause besides the lockdep issue.
Will contain the UART patch into my next v4 patchset.

Hi Sascha,
Will address your comments in v4 too. Thank you both input.

On 三, 2018-06-13 at 18:07 +0200, Lucas Stach wrote:
> Hi Robin,
> 
> Am Dienstag, den 12.06.2018, 08:58 + schrieb Robin Gong:
> > 
> > Hi Lucas,
> > Is the below DEAD LOCK issue same as your side? If yes, then
> > I'm afraid that we have to make another patch for uart to split dma
> > functions in uart driver out of the code area which protected by
> > port.lock. The warning make sense since allocate sdma bd memory
> > dynamically in virt-dma instead of static allocated as before. I'll
> > make another uart patch into my next version patchset.
> Yes, I see the same lockdep splat on my system. Though I'm not sure
> if
> this is really the root cause of the issue I see.
> 
> I'm getting timeouts for a serdev attached device and I don't think
> this system ever enters memory reclaim, so the issue reported by
> lockdep seems to be a mostly theoretical on this system. But lets see
> how far I get when you fixed this issue, maybe the real bug is hiding
> behind this one.
> 
> Regards,
> Lucas

Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-13 Thread Robin Gong
Hi Lucas,
I have identified the root cause besides the lockdep issue.
Will contain the UART patch into my next v4 patchset.

Hi Sascha,
Will address your comments in v4 too. Thank you both input.

On 三, 2018-06-13 at 18:07 +0200, Lucas Stach wrote:
> Hi Robin,
> 
> Am Dienstag, den 12.06.2018, 08:58 + schrieb Robin Gong:
> > 
> > Hi Lucas,
> > Is the below DEAD LOCK issue same as your side? If yes, then
> > I'm afraid that we have to make another patch for uart to split dma
> > functions in uart driver out of the code area which protected by
> > port.lock. The warning make sense since allocate sdma bd memory
> > dynamically in virt-dma instead of static allocated as before. I'll
> > make another uart patch into my next version patchset.
> Yes, I see the same lockdep splat on my system. Though I'm not sure
> if
> this is really the root cause of the issue I see.
> 
> I'm getting timeouts for a serdev attached device and I don't think
> this system ever enters memory reclaim, so the issue reported by
> lockdep seems to be a mostly theoretical on this system. But lets see
> how far I get when you fixed this issue, maybe the real bug is hiding
> behind this one.
> 
> Regards,
> Lucas

Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-13 Thread Lucas Stach
Hi Robin,

Am Dienstag, den 12.06.2018, 08:58 + schrieb Robin Gong:
> Hi Lucas,
>   Is the below DEAD LOCK issue same as your side? If yes, then
> I'm afraid that we have to make another patch for uart to split dma
> functions in uart driver out of the code area which protected by
> port.lock. The warning make sense since allocate sdma bd memory
> dynamically in virt-dma instead of static allocated as before. I'll
> make another uart patch into my next version patchset.

Yes, I see the same lockdep splat on my system. Though I'm not sure if
this is really the root cause of the issue I see.

I'm getting timeouts for a serdev attached device and I don't think
this system ever enters memory reclaim, so the issue reported by
lockdep seems to be a mostly theoretical on this system. But lets see
how far I get when you fixed this issue, maybe the real bug is hiding
behind this one.

Regards,
Lucas


Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-13 Thread Lucas Stach
Hi Robin,

Am Dienstag, den 12.06.2018, 08:58 + schrieb Robin Gong:
> Hi Lucas,
>   Is the below DEAD LOCK issue same as your side? If yes, then
> I'm afraid that we have to make another patch for uart to split dma
> functions in uart driver out of the code area which protected by
> port.lock. The warning make sense since allocate sdma bd memory
> dynamically in virt-dma instead of static allocated as before. I'll
> make another uart patch into my next version patchset.

Yes, I see the same lockdep splat on my system. Though I'm not sure if
this is really the root cause of the issue I see.

I'm getting timeouts for a serdev attached device and I don't think
this system ever enters memory reclaim, so the issue reported by
lockdep seems to be a mostly theoretical on this system. But lets see
how far I get when you fixed this issue, maybe the real bug is hiding
behind this one.

Regards,
Lucas


Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-12 Thread Robin Gong
Hi Lucas,
Is the below DEAD LOCK issue same as your side? If yes, then
I'm afraid that we have to make another patch for uart to split dma
functions in uart driver out of the code area which protected by
port.lock. The warning make sense since allocate sdma bd memory
dynamically in virt-dma instead of static allocated as before. I'll
make another uart patch into my next version patchset.


[   46.155406] =
[   46.161503] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order
detected
[   46.168122] 4.17.0-rc6-8-g7caafa3-dirty #48 Not tainted
[   46.173696] -
[   46.179795] mxc_uart_stress/419 [HC0[0]:SC0[0]:HE0:SE1] is trying to
acquire:
[   46.186934] fa7c1440 (fs_reclaim){+.+.}, at:
fs_reclaim_acquire.part.3+0x0/0x48
[   46.194270]
[   46.194270] and this task is already holding:
[   46.200106] 09a17fda (_lock_key){-.-.}, at:
uart_write+0x84/0x190
[   46.206658] which would create a new lock dependency:
[   46.211710]  (_lock_key){-.-.} -> (fs_reclaim){+.+.}
[   46.217132]
[   46.217132] but this new dependency connects a HARDIRQ-irq-safe
lock:
[   46.225051]  (_lock_key){-.-.}
[   46.225062]
[   46.225062] ... which became HARDIRQ-irq-safe at:
[   46.234740]   lock_acquire+0x70/0x90
[   46.238326]   _raw_spin_lock_irqsave+0x40/0x54
[   46.242777]   imx_uart_console_write+0x1bc/0x1e0
[   46.247402]   console_unlock+0x320/0x5f0
[   46.251329]   vprintk_emit+0x22c/0x3fc
[   46.255082]   vprintk_default+0x28/0x30
[   46.258923]   vprintk_func+0x78/0xcc
[   46.262503]   printk+0x34/0x54
[   46.265566]   crng_fast_load+0xf8/0x138
[   46.269407]   add_interrupt_randomness+0x21c/0x24c
[   46.274204]   handle_irq_event_percpu+0x40/0x84
[   46.278739]   handle_irq_event+0x40/0x64
[   46.282667]   handle_fasteoi_irq+0xbc/0x178
[   46.286854]   generic_handle_irq+0x28/0x3c
[   46.290954]   __handle_domain_irq+0x6c/0xe8
[   46.295148]   gic_handle_irq+0x64/0xc4
[   46.298904]   __irq_svc+0x70/0x98
[   46.302225]   _raw_spin_unlock_irq+0x30/0x34
[   46.306505]   finish_task_switch+0xc0/0x27c
[   46.310693]   __schedule+0x2c0/0x79c
[   46.314272]   schedule_idle+0x40/0x84
[   46.317941]   do_idle+0x178/0x2b4
[   46.321259]   cpu_startup_entry+0x20/0x24
[   46.325278]   rest_init+0x214/0x264
[   46.328775]   start_kernel+0x39c/0x424
[   46.332527] (null)
[   46.334891]
[   46.334891] to a HARDIRQ-irq-unsafe lock:
[   46.340379]  (fs_reclaim){+.+.}
[   46.340391]
[   46.340391] ... which became HARDIRQ-irq-unsafe at:
[   46.349885] ...
[   46.349895]   lock_acquire+0x70/0x90
[   46.355225]   fs_reclaim_acquire.part.3+0x38/0x48
[   46.359933]   fs_reclaim_acquire+0x1c/0x20
[   46.364036]   kmem_cache_alloc+0x2c/0x174
[   46.368051]   alloc_worker.constprop.10+0x1c/0x58
[   46.372759]   init_rescuer.part.4+0x18/0xa4
[   46.376952]   workqueue_init+0xc0/0x210
[   46.380793]   kernel_init_freeable+0x58/0x1d8
[   46.385156]   kernel_init+0x10/0x11c
[   46.388736]   ret_from_fork+0x14/0x20
[   46.392399] (null)
[   46.394762]
[   46.394762] other info that might help us debug this:
[   46.394762]
[   46.402769]  Possible interrupt unsafe locking scenario:
[   46.402769]
[   46.409560]CPU0CPU1
[   46.414092]
[   46.418622]   lock(fs_reclaim);
[   46.421772]local_irq_disable();
[   46.427693]lock(_lock_key);
[   46.433707]lock(fs_reclaim);
[   46.439372]   
[   46.441993] lock(_lock_key);
[   46.445661]
[   46.445661]  *** DEADLOCK ***
[   46.445661]

On 一, 2018-06-11 at 13:01 +0200, Lucas Stach wrote:
> Hi Robin,
> 
> this series breaks serial DMA for me. I wasn't able to dig in deeper
> yet. Please let me know if you can test/reproduce at your side, if
> not
> I'll try to find some time to collect some more debug info.
> 
> Regards,
> Lucas
> 
> Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
> > 
> > The legacy sdma driver has below limitations or drawbacks:
> >   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and
> > alloc
> >  one page size for one channel regardless of only few BDs
> > needed
> >  most time. But in few cases, the max PAGE_SIZE maybe not
> > enough.
> >   2. One SDMA channel can't stop immediatley once channel disabled
> > which
> >  means SDMA interrupt may come in after this channel
> > terminated.There
> >  are some patches for this corner case such as commit
> > "2746e2c389f9",
> >  but not cover non-cyclic.
> > 
> > The common virt-dma overcomes the above limitations. It can alloc
> > bd
> > dynamically and free bd once this tx transfer done. No memory
> > wasted or
> > maximum limititation here, only depends on how many memory can be
> > requested
> > from kernel. For No.2, such issue can be workaround by checking if
> > there
> > is available descript("sdmac->desc") now once 

Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-12 Thread Robin Gong
Hi Lucas,
Is the below DEAD LOCK issue same as your side? If yes, then
I'm afraid that we have to make another patch for uart to split dma
functions in uart driver out of the code area which protected by
port.lock. The warning make sense since allocate sdma bd memory
dynamically in virt-dma instead of static allocated as before. I'll
make another uart patch into my next version patchset.


[   46.155406] =
[   46.161503] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order
detected
[   46.168122] 4.17.0-rc6-8-g7caafa3-dirty #48 Not tainted
[   46.173696] -
[   46.179795] mxc_uart_stress/419 [HC0[0]:SC0[0]:HE0:SE1] is trying to
acquire:
[   46.186934] fa7c1440 (fs_reclaim){+.+.}, at:
fs_reclaim_acquire.part.3+0x0/0x48
[   46.194270]
[   46.194270] and this task is already holding:
[   46.200106] 09a17fda (_lock_key){-.-.}, at:
uart_write+0x84/0x190
[   46.206658] which would create a new lock dependency:
[   46.211710]  (_lock_key){-.-.} -> (fs_reclaim){+.+.}
[   46.217132]
[   46.217132] but this new dependency connects a HARDIRQ-irq-safe
lock:
[   46.225051]  (_lock_key){-.-.}
[   46.225062]
[   46.225062] ... which became HARDIRQ-irq-safe at:
[   46.234740]   lock_acquire+0x70/0x90
[   46.238326]   _raw_spin_lock_irqsave+0x40/0x54
[   46.242777]   imx_uart_console_write+0x1bc/0x1e0
[   46.247402]   console_unlock+0x320/0x5f0
[   46.251329]   vprintk_emit+0x22c/0x3fc
[   46.255082]   vprintk_default+0x28/0x30
[   46.258923]   vprintk_func+0x78/0xcc
[   46.262503]   printk+0x34/0x54
[   46.265566]   crng_fast_load+0xf8/0x138
[   46.269407]   add_interrupt_randomness+0x21c/0x24c
[   46.274204]   handle_irq_event_percpu+0x40/0x84
[   46.278739]   handle_irq_event+0x40/0x64
[   46.282667]   handle_fasteoi_irq+0xbc/0x178
[   46.286854]   generic_handle_irq+0x28/0x3c
[   46.290954]   __handle_domain_irq+0x6c/0xe8
[   46.295148]   gic_handle_irq+0x64/0xc4
[   46.298904]   __irq_svc+0x70/0x98
[   46.302225]   _raw_spin_unlock_irq+0x30/0x34
[   46.306505]   finish_task_switch+0xc0/0x27c
[   46.310693]   __schedule+0x2c0/0x79c
[   46.314272]   schedule_idle+0x40/0x84
[   46.317941]   do_idle+0x178/0x2b4
[   46.321259]   cpu_startup_entry+0x20/0x24
[   46.325278]   rest_init+0x214/0x264
[   46.328775]   start_kernel+0x39c/0x424
[   46.332527] (null)
[   46.334891]
[   46.334891] to a HARDIRQ-irq-unsafe lock:
[   46.340379]  (fs_reclaim){+.+.}
[   46.340391]
[   46.340391] ... which became HARDIRQ-irq-unsafe at:
[   46.349885] ...
[   46.349895]   lock_acquire+0x70/0x90
[   46.355225]   fs_reclaim_acquire.part.3+0x38/0x48
[   46.359933]   fs_reclaim_acquire+0x1c/0x20
[   46.364036]   kmem_cache_alloc+0x2c/0x174
[   46.368051]   alloc_worker.constprop.10+0x1c/0x58
[   46.372759]   init_rescuer.part.4+0x18/0xa4
[   46.376952]   workqueue_init+0xc0/0x210
[   46.380793]   kernel_init_freeable+0x58/0x1d8
[   46.385156]   kernel_init+0x10/0x11c
[   46.388736]   ret_from_fork+0x14/0x20
[   46.392399] (null)
[   46.394762]
[   46.394762] other info that might help us debug this:
[   46.394762]
[   46.402769]  Possible interrupt unsafe locking scenario:
[   46.402769]
[   46.409560]CPU0CPU1
[   46.414092]
[   46.418622]   lock(fs_reclaim);
[   46.421772]local_irq_disable();
[   46.427693]lock(_lock_key);
[   46.433707]lock(fs_reclaim);
[   46.439372]   
[   46.441993] lock(_lock_key);
[   46.445661]
[   46.445661]  *** DEADLOCK ***
[   46.445661]

On 一, 2018-06-11 at 13:01 +0200, Lucas Stach wrote:
> Hi Robin,
> 
> this series breaks serial DMA for me. I wasn't able to dig in deeper
> yet. Please let me know if you can test/reproduce at your side, if
> not
> I'll try to find some time to collect some more debug info.
> 
> Regards,
> Lucas
> 
> Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
> > 
> > The legacy sdma driver has below limitations or drawbacks:
> >   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and
> > alloc
> >  one page size for one channel regardless of only few BDs
> > needed
> >  most time. But in few cases, the max PAGE_SIZE maybe not
> > enough.
> >   2. One SDMA channel can't stop immediatley once channel disabled
> > which
> >  means SDMA interrupt may come in after this channel
> > terminated.There
> >  are some patches for this corner case such as commit
> > "2746e2c389f9",
> >  but not cover non-cyclic.
> > 
> > The common virt-dma overcomes the above limitations. It can alloc
> > bd
> > dynamically and free bd once this tx transfer done. No memory
> > wasted or
> > maximum limititation here, only depends on how many memory can be
> > requested
> > from kernel. For No.2, such issue can be workaround by checking if
> > there
> > is available descript("sdmac->desc") now once 

Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Robin Gong

Hi Lucas,
Thank for your report, I tested it only on SPI, will update to you after 
try on uart tomorrow.

> 在 2018年6月11日,下午7:01,Lucas Stach  写道:
> 
> Hi Robin,
> 
> this series breaks serial DMA for me. I wasn't able to dig in deeper
> yet. Please let me know if you can test/reproduce at your side, if not
> I'll try to find some time to collect some more debug info.
> 
> Regards,
> Lucas
> 
> Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
>> The legacy sdma driver has below limitations or drawbacks:
>>   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
>>  one page size for one channel regardless of only few BDs needed
>>  most time. But in few cases, the max PAGE_SIZE maybe not enough.
>>   2. One SDMA channel can't stop immediatley once channel disabled which
>>  means SDMA interrupt may come in after this channel terminated.There
>>  are some patches for this corner case such as commit "2746e2c389f9",
>>  but not cover non-cyclic.
>> 
>> The common virt-dma overcomes the above limitations. It can alloc bd
>> dynamically and free bd once this tx transfer done. No memory wasted or
>> maximum limititation here, only depends on how many memory can be requested
>> from kernel. For No.2, such issue can be workaround by checking if there
>> is available descript("sdmac->desc") now once the unwanted interrupt
>> coming. At last the common virt-dma is easier for sdma driver maintain.
>> 
>> Change from v2:
>>   1. include Sascha's patch to make the main patch easier to review.
>>  Thanks Sacha.
>>   2. remove useless 'desc'/'chan' in struct sdma_channe.
>> 
>> Change from v1:
>>   1. split v1 patch into 5 patches.
>>   2. remove some unnecessary condition check.
>>   3. remove unnecessary 'pending' list.
>> 
>> Robin Gong (5):
>>   dmaengine: imx-sdma: add virt-dma support
>>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
>> during interrupt"
>>   dmaengine: imx-sdma: remove usless lock
>>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
>> 
>>  drivers/dma/Kconfig|   1 +
>>  drivers/dma/imx-sdma.c | 392 
>> -
>>  2 files changed, 227 insertions(+), 166 deletions(-)
>> 
>> -- 
>> 2.7.4
>> 
>> Robin Gong (5):
>>   dmaengine: imx-sdma: add virt-dma support
>>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
>> during interrupt"
>>   dmaengine: imx-sdma: remove usless lock
>>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
>> 
>> Sascha Hauer (1):
>>   dmaengine: imx-sdma: factor out a struct sdma_desc from struct
>> sdma_channel
>> 
>>  drivers/dma/Kconfig|   1 +
>>  drivers/dma/imx-sdma.c | 391 
>> -
>>  2 files changed, 226 insertions(+), 166 deletions(-)
>> 


Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Robin Gong

Hi Lucas,
Thank for your report, I tested it only on SPI, will update to you after 
try on uart tomorrow.

> 在 2018年6月11日,下午7:01,Lucas Stach  写道:
> 
> Hi Robin,
> 
> this series breaks serial DMA for me. I wasn't able to dig in deeper
> yet. Please let me know if you can test/reproduce at your side, if not
> I'll try to find some time to collect some more debug info.
> 
> Regards,
> Lucas
> 
> Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
>> The legacy sdma driver has below limitations or drawbacks:
>>   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
>>  one page size for one channel regardless of only few BDs needed
>>  most time. But in few cases, the max PAGE_SIZE maybe not enough.
>>   2. One SDMA channel can't stop immediatley once channel disabled which
>>  means SDMA interrupt may come in after this channel terminated.There
>>  are some patches for this corner case such as commit "2746e2c389f9",
>>  but not cover non-cyclic.
>> 
>> The common virt-dma overcomes the above limitations. It can alloc bd
>> dynamically and free bd once this tx transfer done. No memory wasted or
>> maximum limititation here, only depends on how many memory can be requested
>> from kernel. For No.2, such issue can be workaround by checking if there
>> is available descript("sdmac->desc") now once the unwanted interrupt
>> coming. At last the common virt-dma is easier for sdma driver maintain.
>> 
>> Change from v2:
>>   1. include Sascha's patch to make the main patch easier to review.
>>  Thanks Sacha.
>>   2. remove useless 'desc'/'chan' in struct sdma_channe.
>> 
>> Change from v1:
>>   1. split v1 patch into 5 patches.
>>   2. remove some unnecessary condition check.
>>   3. remove unnecessary 'pending' list.
>> 
>> Robin Gong (5):
>>   dmaengine: imx-sdma: add virt-dma support
>>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
>> during interrupt"
>>   dmaengine: imx-sdma: remove usless lock
>>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
>> 
>>  drivers/dma/Kconfig|   1 +
>>  drivers/dma/imx-sdma.c | 392 
>> -
>>  2 files changed, 227 insertions(+), 166 deletions(-)
>> 
>> -- 
>> 2.7.4
>> 
>> Robin Gong (5):
>>   dmaengine: imx-sdma: add virt-dma support
>>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
>> during interrupt"
>>   dmaengine: imx-sdma: remove usless lock
>>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
>> 
>> Sascha Hauer (1):
>>   dmaengine: imx-sdma: factor out a struct sdma_desc from struct
>> sdma_channel
>> 
>>  drivers/dma/Kconfig|   1 +
>>  drivers/dma/imx-sdma.c | 391 
>> -
>>  2 files changed, 226 insertions(+), 166 deletions(-)
>> 


Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Lucas Stach
Hi Robin,

this series breaks serial DMA for me. I wasn't able to dig in deeper
yet. Please let me know if you can test/reproduce at your side, if not
I'll try to find some time to collect some more debug info.

Regards,
Lucas

Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
> The legacy sdma driver has below limitations or drawbacks:
>   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
>  one page size for one channel regardless of only few BDs needed
>  most time. But in few cases, the max PAGE_SIZE maybe not enough.
>   2. One SDMA channel can't stop immediatley once channel disabled which
>  means SDMA interrupt may come in after this channel terminated.There
>  are some patches for this corner case such as commit "2746e2c389f9",
>  but not cover non-cyclic.
> 
> The common virt-dma overcomes the above limitations. It can alloc bd
> dynamically and free bd once this tx transfer done. No memory wasted or
> maximum limititation here, only depends on how many memory can be requested
> from kernel. For No.2, such issue can be workaround by checking if there
> is available descript("sdmac->desc") now once the unwanted interrupt
> coming. At last the common virt-dma is easier for sdma driver maintain.
> 
> Change from v2:
>   1. include Sascha's patch to make the main patch easier to review.
>  Thanks Sacha.
>   2. remove useless 'desc'/'chan' in struct sdma_channe.
> 
> Change from v1:
>   1. split v1 patch into 5 patches.
>   2. remove some unnecessary condition check.
>   3. remove unnecessary 'pending' list.
> 
> Robin Gong (5):
>   dmaengine: imx-sdma: add virt-dma support
>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
> during interrupt"
>   dmaengine: imx-sdma: remove usless lock
>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
> 
>  drivers/dma/Kconfig|   1 +
>  drivers/dma/imx-sdma.c | 392 
> -
>  2 files changed, 227 insertions(+), 166 deletions(-)
> 
> -- 
> 2.7.4
> 
> Robin Gong (5):
>   dmaengine: imx-sdma: add virt-dma support
>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
> during interrupt"
>   dmaengine: imx-sdma: remove usless lock
>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
> 
> Sascha Hauer (1):
>   dmaengine: imx-sdma: factor out a struct sdma_desc from struct
> sdma_channel
> 
>  drivers/dma/Kconfig|   1 +
>  drivers/dma/imx-sdma.c | 391 
> -
>  2 files changed, 226 insertions(+), 166 deletions(-)
> 


Re: [PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Lucas Stach
Hi Robin,

this series breaks serial DMA for me. I wasn't able to dig in deeper
yet. Please let me know if you can test/reproduce at your side, if not
I'll try to find some time to collect some more debug info.

Regards,
Lucas

Am Montag, den 11.06.2018, 22:59 +0800 schrieb Robin Gong:
> The legacy sdma driver has below limitations or drawbacks:
>   1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
>  one page size for one channel regardless of only few BDs needed
>  most time. But in few cases, the max PAGE_SIZE maybe not enough.
>   2. One SDMA channel can't stop immediatley once channel disabled which
>  means SDMA interrupt may come in after this channel terminated.There
>  are some patches for this corner case such as commit "2746e2c389f9",
>  but not cover non-cyclic.
> 
> The common virt-dma overcomes the above limitations. It can alloc bd
> dynamically and free bd once this tx transfer done. No memory wasted or
> maximum limititation here, only depends on how many memory can be requested
> from kernel. For No.2, such issue can be workaround by checking if there
> is available descript("sdmac->desc") now once the unwanted interrupt
> coming. At last the common virt-dma is easier for sdma driver maintain.
> 
> Change from v2:
>   1. include Sascha's patch to make the main patch easier to review.
>  Thanks Sacha.
>   2. remove useless 'desc'/'chan' in struct sdma_channe.
> 
> Change from v1:
>   1. split v1 patch into 5 patches.
>   2. remove some unnecessary condition check.
>   3. remove unnecessary 'pending' list.
> 
> Robin Gong (5):
>   dmaengine: imx-sdma: add virt-dma support
>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
> during interrupt"
>   dmaengine: imx-sdma: remove usless lock
>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
> 
>  drivers/dma/Kconfig|   1 +
>  drivers/dma/imx-sdma.c | 392 
> -
>  2 files changed, 227 insertions(+), 166 deletions(-)
> 
> -- 
> 2.7.4
> 
> Robin Gong (5):
>   dmaengine: imx-sdma: add virt-dma support
>   Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
> during interrupt"
>   dmaengine: imx-sdma: remove usless lock
>   dmaengine: imx-sdma: remove the maximum limation for bd numbers
>   dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap
> 
> Sascha Hauer (1):
>   dmaengine: imx-sdma: factor out a struct sdma_desc from struct
> sdma_channel
> 
>  drivers/dma/Kconfig|   1 +
>  drivers/dma/imx-sdma.c | 391 
> -
>  2 files changed, 226 insertions(+), 166 deletions(-)
> 


[PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Robin Gong
The legacy sdma driver has below limitations or drawbacks:
  1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
 one page size for one channel regardless of only few BDs needed
 most time. But in few cases, the max PAGE_SIZE maybe not enough.
  2. One SDMA channel can't stop immediatley once channel disabled which
 means SDMA interrupt may come in after this channel terminated.There
 are some patches for this corner case such as commit "2746e2c389f9",
 but not cover non-cyclic.

The common virt-dma overcomes the above limitations. It can alloc bd
dynamically and free bd once this tx transfer done. No memory wasted or
maximum limititation here, only depends on how many memory can be requested
from kernel. For No.2, such issue can be workaround by checking if there
is available descript("sdmac->desc") now once the unwanted interrupt
coming. At last the common virt-dma is easier for sdma driver maintain.

Change from v2:
  1. include Sascha's patch to make the main patch easier to review.
 Thanks Sacha.
  2. remove useless 'desc'/'chan' in struct sdma_channe.

Change from v1:
  1. split v1 patch into 5 patches.
  2. remove some unnecessary condition check.
  3. remove unnecessary 'pending' list.

Robin Gong (5):
  dmaengine: imx-sdma: add virt-dma support
  Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
during interrupt"
  dmaengine: imx-sdma: remove usless lock
  dmaengine: imx-sdma: remove the maximum limation for bd numbers
  dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap

 drivers/dma/Kconfig|   1 +
 drivers/dma/imx-sdma.c | 392 -
 2 files changed, 227 insertions(+), 166 deletions(-)

-- 
2.7.4

Robin Gong (5):
  dmaengine: imx-sdma: add virt-dma support
  Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
during interrupt"
  dmaengine: imx-sdma: remove usless lock
  dmaengine: imx-sdma: remove the maximum limation for bd numbers
  dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap

Sascha Hauer (1):
  dmaengine: imx-sdma: factor out a struct sdma_desc from struct
sdma_channel

 drivers/dma/Kconfig|   1 +
 drivers/dma/imx-sdma.c | 391 -
 2 files changed, 226 insertions(+), 166 deletions(-)

-- 
2.7.4



[PATCH v3 0/6] add virt-dma support for imx-sdma

2018-06-11 Thread Robin Gong
The legacy sdma driver has below limitations or drawbacks:
  1. Hardcode the max BDs number as "PAGE_SIZE / sizeof(*)", and alloc
 one page size for one channel regardless of only few BDs needed
 most time. But in few cases, the max PAGE_SIZE maybe not enough.
  2. One SDMA channel can't stop immediatley once channel disabled which
 means SDMA interrupt may come in after this channel terminated.There
 are some patches for this corner case such as commit "2746e2c389f9",
 but not cover non-cyclic.

The common virt-dma overcomes the above limitations. It can alloc bd
dynamically and free bd once this tx transfer done. No memory wasted or
maximum limititation here, only depends on how many memory can be requested
from kernel. For No.2, such issue can be workaround by checking if there
is available descript("sdmac->desc") now once the unwanted interrupt
coming. At last the common virt-dma is easier for sdma driver maintain.

Change from v2:
  1. include Sascha's patch to make the main patch easier to review.
 Thanks Sacha.
  2. remove useless 'desc'/'chan' in struct sdma_channe.

Change from v1:
  1. split v1 patch into 5 patches.
  2. remove some unnecessary condition check.
  3. remove unnecessary 'pending' list.

Robin Gong (5):
  dmaengine: imx-sdma: add virt-dma support
  Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
during interrupt"
  dmaengine: imx-sdma: remove usless lock
  dmaengine: imx-sdma: remove the maximum limation for bd numbers
  dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap

 drivers/dma/Kconfig|   1 +
 drivers/dma/imx-sdma.c | 392 -
 2 files changed, 227 insertions(+), 166 deletions(-)

-- 
2.7.4

Robin Gong (5):
  dmaengine: imx-sdma: add virt-dma support
  Revert "dmaengine: imx-sdma: fix pagefault when channel is disabled
during interrupt"
  dmaengine: imx-sdma: remove usless lock
  dmaengine: imx-sdma: remove the maximum limation for bd numbers
  dmaengine: imx-sdma: add sdma_transfer_init to decrease code overlap

Sascha Hauer (1):
  dmaengine: imx-sdma: factor out a struct sdma_desc from struct
sdma_channel

 drivers/dma/Kconfig|   1 +
 drivers/dma/imx-sdma.c | 391 -
 2 files changed, 226 insertions(+), 166 deletions(-)

-- 
2.7.4