Alternative implementation of page table zeroing using zap page_range.
authorThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Mon, 18 Sep 2006 18:43:31 +0000 (20:43 +0200)
committerThomas Hellstrom <thomas-at-tungstengraphics-dot-com>
Mon, 18 Sep 2006 18:43:31 +0000 (20:43 +0200)
(Disabled for now)
Fix bo_wait_idle bug.
Remove stray debug message.

libdrm/xf86drm.c
linux-core/drm_bo.c
linux-core/drm_compat.c
linux-core/i915_fence.c

index 606f098..a7d4beb 100644 (file)
@@ -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)
index d176392..8e51985 100644 (file)
@@ -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;
 }
 
 /*
index d387678..e56f660 100644 (file)
@@ -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)
 {
index 8a3f81f..7491a67 100644 (file)
@@ -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);