aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHideyuki Sasaki <Hideyuki_Sasaki@hq.scei.sony.co.jp>2009-11-04 03:09:28 -0500
committerJens Axboe <jens.axboe@oracle.com>2009-11-04 03:09:28 -0500
commitf21121cde6e617b90cd03ce083652ca543004dc2 (patch)
tree9a2401e05c403cc4f6ce59e7936b89c1000798af
parente00ef7997195e4f8e10593727a6286e2e2802159 (diff)
block/ps3: fix slow VRAM IO
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 <xhide@rd.scei.sony.co.jp> Signed-off-by: Geoff Levand <geoffrey.levand@am.sony.com> Acked-by: Jim Paris <jim@jtan.com> Cc: Geert Uytterhoeven <Geert.Uytterhoeven@sonycom.com> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
-rw-r--r--drivers/block/ps3vram.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
index 3bb7c47c869f..1fb6c3135fc8 100644
--- a/drivers/block/ps3vram.c
+++ b/drivers/block/ps3vram.c
@@ -123,7 +123,15 @@ static int ps3vram_notifier_wait(struct ps3_system_bus_device *dev,
123{ 123{
124 struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev); 124 struct ps3vram_priv *priv = ps3_system_bus_get_drvdata(dev);
125 u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER); 125 u32 *notify = ps3vram_get_notifier(priv->reports, NOTIFIER);
126 unsigned long timeout = jiffies + msecs_to_jiffies(timeout_ms); 126 unsigned long timeout;
127
128 for (timeout = 20; timeout; timeout--) {
129 if (!notify[3])
130 return 0;
131 udelay(10);
132 }
133
134 timeout = jiffies + msecs_to_jiffies(timeout_ms);
127 135
128 do { 136 do {
129 if (!notify[3]) 137 if (!notify[3])