summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdrm/xf86drm.c6
-rw-r--r--linux-core/drm_bo.c4
-rw-r--r--linux-core/drm_compat.c14
-rw-r--r--linux-core/i915_fence.c1
4 files changed, 21 insertions, 4 deletions
diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index 606f098b..a7d4beb4 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2984,8 +2984,10 @@ int drmBOWaitIdle(int fd, drmBO *buf, unsigned hint)
req->hint = hint;
arg.next = 0;
- ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
-
+ do {
+ ret = ioctl(fd, DRM_IOCTL_BUFOBJ, &arg);
+ } while (ret && errno == EAGAIN);
+
if (ret)
return ret;
if (!arg.handled)
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index d176392a..8e51985e 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -1115,6 +1115,7 @@ static int drm_bo_handle_wait(drm_file_t * priv, uint32_t handle,
if (!bo) {
return -EINVAL;
}
+
mutex_lock(&bo->mutex);
ret = drm_bo_wait_unfenced(bo, no_wait, 0);
if (ret)
@@ -1124,10 +1125,11 @@ static int drm_bo_handle_wait(drm_file_t * priv, uint32_t handle,
goto out;
drm_bo_fill_rep_arg(bo, rep);
+
out:
mutex_unlock(&bo->mutex);
drm_bo_usage_deref_unlocked(bo->dev, bo);
- return 0;
+ return ret;
}
/*
diff --git a/linux-core/drm_compat.c b/linux-core/drm_compat.c
index d387678e..e56f6608 100644
--- a/linux-core/drm_compat.c
+++ b/linux-core/drm_compat.c
@@ -124,6 +124,7 @@ static inline void change_pud_range(struct mm_struct *mm, pgd_t * pgd,
* This function should be called with all relevant spinlocks held.
*/
+#if 1
void drm_clear_vma(struct vm_area_struct *vma,
unsigned long addr, unsigned long end)
{
@@ -146,6 +147,19 @@ void drm_clear_vma(struct vm_area_struct *vma,
flush_tlb_range(vma, addr, end);
#endif
}
+#else
+
+void drm_clear_vma(struct vm_area_struct *vma,
+ unsigned long addr, unsigned long end)
+{
+ struct mm_struct *mm = vma->vm_mm;
+
+ spin_unlock(&mm->page_table_lock);
+ (void) zap_page_range(vma, addr, end - addr, NULL);
+ spin_lock(&mm->page_table_lock);
+}
+#endif
+
pgprot_t vm_get_page_prot(unsigned long vm_flags)
{
diff --git a/linux-core/i915_fence.c b/linux-core/i915_fence.c
index 8a3f81fe..7491a672 100644
--- a/linux-core/i915_fence.c
+++ b/linux-core/i915_fence.c
@@ -86,7 +86,6 @@ static void i915_perform_flush(drm_device_t * dev)
}
if (fm->pending_flush && !dev_priv->flush_pending) {
- DRM_ERROR("Sync flush");
dev_priv->flush_sequence = (uint32_t) READ_BREADCRUMB(dev_priv);
dev_priv->flush_flags = fm->pending_flush;
dev_priv->saved_flush_status = READ_HWSP(dev_priv, 0);