From ca1b15d645c74e20f638f5a09981bcf02f58caee Mon Sep 17 00:00:00 2001 From: Thomas Hellstrom Date: Mon, 18 Sep 2006 20:43:31 +0200 Subject: Alternative implementation of page table zeroing using zap page_range. (Disabled for now) Fix bo_wait_idle bug. Remove stray debug message. --- libdrm/xf86drm.c | 6 ++++-- linux-core/drm_bo.c | 4 +++- linux-core/drm_compat.c | 14 ++++++++++++++ linux-core/i915_fence.c | 1 - 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); -- cgit v1.2.3