]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - glsdk/libdrm.git/commitdiff
intel: Account for potential pinned buffers hogging fences
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 9 Feb 2010 08:32:54 +0000 (08:32 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Tue, 9 Feb 2010 08:37:37 +0000 (08:37 +0000)
As the kernel reports the total number of fences, we must guess how many
fences are likely to be pinned. In the typical system these will be only
used by the scanout buffers, of which there may be one per pipe, and any
number of manually pinned fenced buffers. So take a conservative guess
and reserve two fences for use by the system.

Note this reduces the number of fences to 3 for i915 and prior.

Reference:
  http://bugs.freedesktop.org/show_bug.cgi?id=25911
  The latest intel driver 2.10.0 causes kernel oops and system hangs

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
intel/intel_bufmgr_gem.c

index 0d011a2afabf6bff48337065d81abc8ea0f546e4..66d12bce525d59e6e71d9ac0a66d3be438b5cd66 100644 (file)
@@ -1769,6 +1769,19 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size)
                        fprintf(stderr, "param: %d, val: %d\n", gp.param,
                                *gp.value);
                        bufmgr_gem->available_fences = 0;
+               } else {
+                       /* XXX The kernel reports the total number of fences,
+                        * including any that may be pinned.
+                        *
+                        * We presume that there will be at least one pinned
+                        * fence for the scanout buffer, but there may be more
+                        * than one scanout and the user may be manually
+                        * pinning buffers. Let's move to execbuffer2 and
+                        * thereby forget the insanity of using fences...
+                        */
+                       bufmgr_gem->available_fences -= 2;
+                       if (bufmgr_gem->available_fences < 0)
+                               bufmgr_gem->available_fences = 0;
                }
        }