linux-ti33x-psp: Check if scheduling is required after DMA
[glsdk/meta-ti-glsdk.git] / recipes-kernel / linux / linux-ti33x-psp-3.1 / 0006-usb-musb-cppi41_dma-Check-if-scheduling-is-required-.patch
1 From b564457d26931a00f8c5645981a00c1eb78e9a90 Mon Sep 17 00:00:00 2001
2 From: Joel A Fernandes <joelagnel@ti.com>
3 Date: Sat, 12 Nov 2011 23:42:26 -0600
4 Subject: [PATCH] usb::musb::cppi41_dma: Check if scheduling is required after DMA
6 Even after TX DMA, data can still be in the FIFO and we would keep
7 rescheduling the worker thread in a polling fashion taking up a lot
8 of CPU if the controller was slow to respond. We check if rescheduling
9 is required and sleep if so.
11 This fixes high CPU load issue seen with g_mass_storage on a BeagleBone
12 and could potentially fix similar issues seen with other gadget drivers.
14 Signed-off-by: Joel A Fernandes <joelagnel@ti.com>
15 ---
16  drivers/usb/musb/cppi41_dma.c |   10 ++++++++++
17  1 files changed, 10 insertions(+), 0 deletions(-)
19 diff --git a/drivers/usb/musb/cppi41_dma.c b/drivers/usb/musb/cppi41_dma.c
20 index a24707c..e68c5d7 100644
21 --- a/drivers/usb/musb/cppi41_dma.c
22 +++ b/drivers/usb/musb/cppi41_dma.c
23 @@ -1319,6 +1319,16 @@ void txdma_completion_work(struct work_struct *data)
24         struct musb *musb = cppi->musb;
25         unsigned long flags;
26  
27 +       /*
28 +        * txdma worker thread can call schedule_work on itself and cause
29 +        * itself to be scheduled immediately and because the data might still
30 +        * be in FIFO if it hasn't been pushed out after DMA, it is possible for
31 +        * the worker to consume lot of CPU when the controller is slow, so we
32 +        * reschedule if necessary.
33 +        */
34 +       if (need_resched())
35 +               cond_resched();
36 +
37         spin_lock_irqsave(&musb->lock, flags);
38         cppi41_check_fifo_empty(cppi);
39         spin_unlock_irqrestore(&musb->lock, flags);
40 -- 
41 1.7.4.1