Rev 6084 | Rev 6103 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6084 | Rev 6088 | ||
---|---|---|---|
Line 1008... | Line 1008... | ||
1008 | struct drm_device *dev = ring->dev; |
1008 | struct drm_device *dev = ring->dev; |
1009 | struct drm_i915_private *dev_priv = dev->dev_private; |
1009 | struct drm_i915_private *dev_priv = dev->dev_private; |
1010 | const bool irq_test_in_progress = |
1010 | const bool irq_test_in_progress = |
1011 | ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring); |
1011 | ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring); |
1012 | int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; |
1012 | int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; |
1013 | DEFINE_WAIT(wait); |
1013 | wait_queue_t wait; |
1014 | unsigned long timeout_expire; |
1014 | unsigned long timeout_expire; |
1015 | s64 before, now; |
1015 | s64 before, now; |
1016 | - | ||
1017 | wait_queue_t __wait; |
- | |
1018 | int ret; |
1016 | int ret; |
Line 1019... | Line 1017... | ||
1019 | 1017 | ||
Line 1020... | Line 1018... | ||
1020 | WARN(!intel_irqs_enabled(dev_priv), "IRQs disabled"); |
1018 | WARN(!intel_irqs_enabled(dev_priv), "IRQs disabled"); |
Line 1051... | Line 1049... | ||
1051 | if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring))) { |
1049 | if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring))) { |
1052 | ret = -ENODEV; |
1050 | ret = -ENODEV; |
1053 | goto out; |
1051 | goto out; |
1054 | } |
1052 | } |
Line 1055... | Line 1053... | ||
1055 | 1053 | ||
1056 | INIT_LIST_HEAD(&__wait.task_list); |
1054 | INIT_LIST_HEAD(&wait.task_list); |
1057 | __wait.evnt = CreateEvent(NULL, MANUAL_DESTROY); |
- | |
Line 1058... | Line 1055... | ||
1058 | 1055 | wait.evnt = CreateEvent(NULL, MANUAL_DESTROY); |
|
1059 | 1056 | ||
Line 1060... | Line 1057... | ||
1060 | for (;;) { |
1057 | for (;;) { |
Line 1080... | Line 1077... | ||
1080 | ret = -ETIME; |
1077 | ret = -ETIME; |
1081 | break; |
1078 | break; |
1082 | } |
1079 | } |
Line 1083... | Line 1080... | ||
1083 | 1080 | ||
1084 | spin_lock_irqsave(&ring->irq_queue.lock, flags); |
1081 | spin_lock_irqsave(&ring->irq_queue.lock, flags); |
1085 | if (list_empty(&__wait.task_list)) |
1082 | if (list_empty(&wait.task_list)) |
1086 | __add_wait_queue(&ring->irq_queue, &__wait); |
1083 | __add_wait_queue(&ring->irq_queue, &wait); |
Line 1087... | Line 1084... | ||
1087 | spin_unlock_irqrestore(&ring->irq_queue.lock, flags); |
1084 | spin_unlock_irqrestore(&ring->irq_queue.lock, flags); |
Line 1088... | Line 1085... | ||
1088 | 1085 | ||
1089 | WaitEventTimeout(__wait.evnt, 1); |
1086 | WaitEventTimeout(wait.evnt, 1); |
1090 | 1087 | ||
1091 | if (!list_empty(&__wait.task_list)) { |
1088 | if (!list_empty(&wait.task_list)) { |
1092 | spin_lock_irqsave(&ring->irq_queue.lock, flags); |
1089 | spin_lock_irqsave(&ring->irq_queue.lock, flags); |
1093 | list_del_init(&__wait.task_list); |
- | |
Line 1094... | Line 1090... | ||
1094 | spin_unlock_irqrestore(&ring->irq_queue.lock, flags); |
1090 | list_del_init(&wait.task_list); |
Line 1095... | Line 1091... | ||
1095 | } |
1091 | spin_unlock_irqrestore(&ring->irq_queue.lock, flags); |
1096 | }; |
1092 | } |
Line 1097... | Line 1093... | ||
1097 | 1093 | ||
- | 1094 | }; |
|
1098 | DestroyEvent(__wait.evnt); |
1095 | |
1099 | 1096 | if (!irq_test_in_progress) |
|
1100 | if (!irq_test_in_progress) |
1097 | ring->irq_put(ring); |
Line 1101... | Line 1098... | ||
1101 | ring->irq_put(ring); |
1098 |