Rev 1182 | Rev 1404 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1182 | Rev 1321 | ||
---|---|---|---|
Line 166... | Line 166... | ||
166 | } |
166 | } |
167 | write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags); |
167 | write_unlock_irqrestore(&fence->rdev->fence_drv.lock, irq_flags); |
168 | return signaled; |
168 | return signaled; |
169 | } |
169 | } |
Line 170... | Line -... | ||
170 | - | ||
171 | int r600_fence_wait(struct radeon_fence *fence, bool intr, bool lazy) |
- | |
172 | { |
- | |
173 | struct radeon_device *rdev; |
- | |
174 | int ret = 0; |
- | |
175 | - | ||
176 | rdev = fence->rdev; |
- | |
177 | - | ||
178 | __set_current_state(intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE); |
- | |
179 | - | ||
180 | while (1) { |
- | |
181 | if (radeon_fence_signaled(fence)) |
- | |
182 | break; |
- | |
183 | - | ||
184 | if (time_after_eq(jiffies, fence->timeout)) { |
- | |
185 | ret = -EBUSY; |
- | |
186 | break; |
- | |
187 | } |
- | |
188 | - | ||
189 | if (lazy) |
- | |
190 | schedule_timeout(1); |
- | |
191 | - | ||
192 | if (intr && signal_pending(current)) { |
- | |
193 | ret = -ERESTARTSYS; |
- | |
194 | break; |
- | |
195 | } |
- | |
196 | } |
- | |
197 | __set_current_state(TASK_RUNNING); |
- | |
198 | return ret; |
- | |
199 | } |
- | |
200 | - | ||
201 | 170 | ||
202 | int radeon_fence_wait(struct radeon_fence *fence, bool intr) |
171 | int radeon_fence_wait(struct radeon_fence *fence, bool intr) |
203 | { |
172 | { |
204 | struct radeon_device *rdev; |
173 | struct radeon_device *rdev; |
205 | unsigned long cur_jiffies; |
174 | unsigned long cur_jiffies; |
Line 214... | Line 183... | ||
214 | rdev = fence->rdev; |
183 | rdev = fence->rdev; |
215 | if (radeon_fence_signaled(fence)) { |
184 | if (radeon_fence_signaled(fence)) { |
216 | return 0; |
185 | return 0; |
217 | } |
186 | } |
Line 218... | Line -... | ||
218 | - | ||
219 | if (rdev->family >= CHIP_R600) { |
- | |
220 | r = r600_fence_wait(fence, intr, 0); |
- | |
221 | if (r == -ERESTARTSYS) |
- | |
222 | return -EBUSY; |
- | |
223 | return r; |
- | |
224 | } |
- | |
225 | 187 | ||
226 | retry: |
188 | retry: |
227 | cur_jiffies = jiffies; |
189 | cur_jiffies = jiffies; |
228 | timeout = HZ / 100; |
190 | timeout = HZ / 100; |
229 | if (time_after(fence->timeout, cur_jiffies)) { |
191 | if (time_after(fence->timeout, cur_jiffies)) { |
230 | timeout = fence->timeout - cur_jiffies; |
192 | timeout = fence->timeout - cur_jiffies; |
Line 231... | Line 193... | ||
231 | } |
193 | } |
- | 194 | ||
232 | 195 | if (intr) { |
|
233 | if (intr) { |
196 | radeon_irq_kms_sw_irq_get(rdev); |
- | 197 | r = wait_event_interruptible_timeout(rdev->fence_drv.queue, |
|
234 | r = wait_event_interruptible_timeout(rdev->fence_drv.queue, |
198 | radeon_fence_signaled(fence), timeout); |
235 | radeon_fence_signaled(fence), timeout); |
199 | radeon_irq_kms_sw_irq_put(rdev); |
236 | if (unlikely(r == -ERESTARTSYS)) { |
- | |
237 | return -EBUSY; |
200 | if (unlikely(r < 0)) |
- | 201 | return r; |
|
238 | } |
202 | } else { |
239 | } else { |
203 | radeon_irq_kms_sw_irq_get(rdev); |
- | 204 | r = wait_event_timeout(rdev->fence_drv.queue, |
|
240 | r = wait_event_timeout(rdev->fence_drv.queue, |
205 | radeon_fence_signaled(fence), timeout); |
241 | radeon_fence_signaled(fence), timeout); |
206 | radeon_irq_kms_sw_irq_put(rdev); |
242 | } |
207 | } |
243 | if (unlikely(!radeon_fence_signaled(fence))) { |
208 | if (unlikely(!radeon_fence_signaled(fence))) { |
244 | if (unlikely(r == 0)) { |
209 | if (unlikely(r == 0)) { |