block/ps3: fix slow VRAM IO
authorHideyuki Sasaki <[email protected]>
Wed, 4 Nov 2009 08:09:28 +0000 (09:09 +0100)
committerJens Axboe <[email protected]>
Wed, 4 Nov 2009 08:09:28 +0000 (09:09 +0100)
The current PS3 VRAM driver uses msleep() to wait for completion of RSX
DMA transfers between system memory and VRAM.  Depending on the system
timing, the processing delay and overhead of this msleep() call can
significantly impact VRAM driver IO.

To avoid the condition, add a short duration (200 usec max) udelay()
polling loop before entering the msleep() polling loop.

Signed-off-by: Hideyuki Sasaki <[email protected]>
Signed-off-by: Geoff Levand <[email protected]>
Acked-by: Jim Paris <[email protected]>
Cc: Geert Uytterhoeven <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
drivers/block/ps3vram.c

index 3bb7c47c869fa5c3749acc689cfc427920b7caf1..1fb6c3135fc8db04f278dc0d45809fc0ad10181d 100644 (file)
@@ -123,7 +123,15 @@ static int ps3vram_notifier_wait(struct ps3_system_bus_device *dev,
 {
        struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev);
        u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
-       unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms);
+       unsigned long timeout;
+
+       for (timeout = 20; timeout; timeout--) {
+               if (!notify[3])
+                       return 0;
+               udelay(10);
+       }
+
+       timeout = jiffies + msecs_to_jiffies(timeout_ms);
 
        do {
                if (!notify[3])