iris: Move SET_DOMAIN to alloc_fresh_bo()
authorKenneth Graunke <kenneth@whitecape.org>
Thu, 30 May 2019 06:40:20 +0000 (23:40 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 30 May 2019 07:15:26 +0000 (00:15 -0700)
Chris pointed out that the order between SET_DOMAIN and SET_TILING
doesn't matter, so we can just do the page allocation when creating
a new BO.  Simplifies the flow a bit.

Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
src/gallium/drivers/iris/iris_bufmgr.c

index 6531118d1b0a35eff503220565845ff2af053448..4628d72643c1c59c0824dac6b9e1c553a11df5fe 100644 (file)
@@ -434,6 +434,21 @@ alloc_fresh_bo(struct iris_bufmgr *bufmgr, uint64_t bo_size)
    bo->swizzle_mode = I915_BIT_6_SWIZZLE_NONE;
    bo->stride = 0;
 
+   /* Calling set_domain() will allocate pages for the BO outside of the
+    * struct mutex lock in the kernel, which is more efficient than waiting
+    * to create them during the first execbuf that uses the BO.
+    */
+   struct drm_i915_gem_set_domain sd = {
+      .handle = bo->gem_handle,
+      .read_domains = I915_GEM_DOMAIN_CPU,
+      .write_domain = 0,
+   };
+
+   if (drm_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd) != 0) {
+      bo_free(bo);
+      return NULL;
+   }
+
    return bo;
 }
 
@@ -448,7 +463,6 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
 {
    struct iris_bo *bo;
    unsigned int page_size = getpagesize();
-   bool alloc_pages = false;
    struct bo_cache_bucket *bucket = bucket_for_size(bufmgr, size);
 
    /* Round the size up to the bucket size, or if we don't have caching
@@ -469,7 +483,6 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
       bo = alloc_bo_from_cache(bufmgr, bucket, memzone, flags, false);
 
    if (!bo) {
-      alloc_pages = true;
       bo = alloc_fresh_bo(bufmgr, bo_size);
       if (!bo)
          goto err;
@@ -485,21 +498,6 @@ bo_alloc_internal(struct iris_bufmgr *bufmgr,
    if (bo_set_tiling_internal(bo, tiling_mode, stride))
       goto err_free;
 
-   if (alloc_pages) {
-      /* Calling set_domain() will allocate pages for the BO outside of the
-       * struct mutex lock in the kernel, which is more efficient than waiting
-       * to create them during the first execbuf that uses the BO.
-       */
-      struct drm_i915_gem_set_domain sd = {
-         .handle = bo->gem_handle,
-         .read_domains = I915_GEM_DOMAIN_CPU,
-         .write_domain = 0,
-      };
-
-      if (drm_ioctl(bo->bufmgr->fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &sd) != 0)
-         goto err_free;
-   }
-
    mtx_unlock(&bufmgr->lock);
 
    bo->name = name;