From: Nishanth Aravamudan <[EMAIL PROTECTED]>
Replace custom wait-queue usage with
wait_event_interruptible_timeout(). This required some more complex
return code evaluation, but simplifies the loop itself to one statement.
Signed-off-by: Nishanth Aravamudan <[EMAIL PROTECTED]>
Signed-off-by: Domen Puncer <[EMAIL PROTECTED]>
---
i830_irq.c | 45 ++++++++++++++++++---------------------------
1 files changed, 18 insertions(+), 27 deletions(-)
Index: quilt/drivers/char/drm/i830_irq.c
===================================================================
--- quilt.orig/drivers/char/drm/i830_irq.c
+++ quilt/drivers/char/drm/i830_irq.c
@@ -32,6 +32,7 @@
#include "i830_drv.h"
#include <linux/interrupt.h> /* For task queue support */
#include <linux/delay.h>
+#include <linux/wait.h> /* For wait_event */
irqreturn_t i830_driver_irq_handler( DRM_IRQ_ARGS )
@@ -76,9 +77,7 @@ static int i830_wait_irq(drm_device_t *d
{
drm_i830_private_t *dev_priv =
(drm_i830_private_t *)dev->dev_private;
- DECLARE_WAITQUEUE(entry, current);
- unsigned long end = jiffies + HZ*3;
- int ret = 0;
+ int ret;
DRM_DEBUG("%s\n", __FUNCTION__);
@@ -87,31 +86,23 @@ static int i830_wait_irq(drm_device_t *d
dev_priv->sarea_priv->perf_boxes |= I830_BOX_WAIT;
- add_wait_queue(&dev_priv->irq_queue, &entry);
+ ret = wait_event_interruptible_timeout(dev_priv->irq_queue,
+ (atomic_read(&dev_priv->irq_received) >= irq_nr),
+ HZ*3);
+
+ if (ret == 0) {
+ DRM_ERROR("timeout iir %x imr %x ier %x hwstam %x\n",
+ I830_READ16( I830REG_INT_IDENTITY_R ),
+ I830_READ16( I830REG_INT_MASK_R ),
+ I830_READ16( I830REG_INT_ENABLE_R ),
+ I830_READ16( I830REG_HWSTAM ));
+
+ ret = -EBUSY; /* Lockup? Missed irq? */
+ } else if (ret == -ERESTARTSYS) {
+ ret = -EINTR; /* interrupted */
+ } else
+ ret = 0; /* condition */
- for (;;) {
- __set_current_state(TASK_INTERRUPTIBLE);
- if (atomic_read(&dev_priv->irq_received) >= irq_nr)
- break;
- if((signed)(end - jiffies) <= 0) {
- DRM_ERROR("timeout iir %x imr %x ier %x hwstam %x\n",
- I830_READ16( I830REG_INT_IDENTITY_R ),
- I830_READ16( I830REG_INT_MASK_R ),
- I830_READ16( I830REG_INT_ENABLE_R ),
- I830_READ16( I830REG_HWSTAM ));
-
- ret = -EBUSY; /* Lockup? Missed irq? */
- break;
- }
- schedule_timeout(HZ*3);
- if (signal_pending(current)) {
- ret = -EINTR;
- break;
- }
- }
-
- __set_current_state(TASK_RUNNING);
- remove_wait_queue(&dev_priv->irq_queue, &entry);
return ret;
}
--
-------------------------------------------------------
SF.Net email is sponsored by: Discover Easy Linux Migration Strategies
from IBM. Find simple to follow Roadmaps, straightforward articles,
informative Webcasts and more! Get everything you need to get up to
speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel