]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915: Reduce the pointer dance of i915_is_ggtt()
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 26 Feb 2016 11:03:20 +0000 (11:03 +0000)
committerTvrtko Ursulin <tvrtko.ursulin@intel.com>
Fri, 26 Feb 2016 13:15:39 +0000 (13:15 +0000)
The multiple levels of indirect do nothing but hinder the compiler and
the pointer chasing turns to be quite painful but painless to fix.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: Dave Gordon <david.s.gordon@intel.com>
Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1456484600-11477-1-git-send-email-tvrtko.ursulin@linux.intel.com
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.h
drivers/gpu/drm/i915/i915_trace.h

index d7f03bceea57fd433e81cf649f00093715356986..a0f1bd711b533910ce00a2bbe642591419c4d198 100644 (file)
@@ -118,7 +118,7 @@ static u64 i915_gem_obj_total_ggtt_size(struct drm_i915_gem_object *obj)
        struct i915_vma *vma;
 
        list_for_each_entry(vma, &obj->vma_list, obj_link) {
-               if (i915_is_ggtt(vma->vm) && drm_mm_node_allocated(&vma->node))
+               if (vma->is_ggtt && drm_mm_node_allocated(&vma->node))
                        size += vma->node.size;
        }
 
@@ -165,12 +165,11 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
                seq_printf(m, " (fence: %d)", obj->fence_reg);
        list_for_each_entry(vma, &obj->vma_list, obj_link) {
                seq_printf(m, " (%sgtt offset: %08llx, size: %08llx",
-                          i915_is_ggtt(vma->vm) ? "g" : "pp",
+                          vma->is_ggtt ? "g" : "pp",
                           vma->node.start, vma->node.size);
-               if (i915_is_ggtt(vma->vm))
-                       seq_printf(m, ", type: %u)", vma->ggtt_view.type);
-               else
-                       seq_puts(m, ")");
+               if (vma->is_ggtt)
+                       seq_printf(m, ", type: %u", vma->ggtt_view.type);
+               seq_puts(m, ")");
        }
        if (obj->stolen)
                seq_printf(m, " (stolen: %08llx)", obj->stolen->start);
@@ -347,7 +346,7 @@ static int per_file_stats(int id, void *ptr, void *data)
                        if (!drm_mm_node_allocated(&vma->node))
                                continue;
 
-                       if (i915_is_ggtt(vma->vm)) {
+                       if (vma->is_ggtt) {
                                stats->global += obj->base.size;
                                continue;
                        }
index 9e76bfc7d5ab4970d941d12cda7d0fdc74d376c5..a4dcb744bfe844325020ae93988fde9bf7c28bbc 100644 (file)
@@ -3156,18 +3156,11 @@ bool i915_gem_obj_is_pinned(struct drm_i915_gem_object *obj);
 /* Some GGTT VM helpers */
 #define i915_obj_to_ggtt(obj) \
        (&((struct drm_i915_private *)(obj)->base.dev->dev_private)->gtt.base)
-static inline bool i915_is_ggtt(struct i915_address_space *vm)
-{
-       struct i915_address_space *ggtt =
-               &((struct drm_i915_private *)(vm)->dev->dev_private)->gtt.base;
-       return vm == ggtt;
-}
 
 static inline struct i915_hw_ppgtt *
 i915_vm_to_ppgtt(struct i915_address_space *vm)
 {
        WARN_ON(i915_is_ggtt(vm));
-
        return container_of(vm, struct i915_hw_ppgtt, base);
 }
 
index bcd2e481d01475afb5319552f3ab8d6894598a5d..3d31d3ac589e8a10f4c446294a738ee10955f581 100644 (file)
@@ -3336,8 +3336,7 @@ static int __i915_vma_unbind(struct i915_vma *vma, bool wait)
                        return ret;
        }
 
-       if (i915_is_ggtt(vma->vm) &&
-           vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL) {
+       if (vma->is_ggtt && vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL) {
                i915_gem_object_finish_gtt(obj);
 
                /* release the fence reg _after_ flushing */
@@ -3352,7 +3351,7 @@ static int __i915_vma_unbind(struct i915_vma *vma, bool wait)
        vma->bound = 0;
 
        list_del_init(&vma->vm_link);
-       if (i915_is_ggtt(vma->vm)) {
+       if (vma->is_ggtt) {
                if (vma->ggtt_view.type == I915_GGTT_VIEW_NORMAL) {
                        obj->map_and_fenceable = false;
                } else if (vma->ggtt_view.pages) {
@@ -4639,17 +4638,14 @@ struct i915_vma *i915_gem_obj_to_ggtt_view(struct drm_i915_gem_object *obj,
 
 void i915_gem_vma_destroy(struct i915_vma *vma)
 {
-       struct i915_address_space *vm = NULL;
        WARN_ON(vma->node.allocated);
 
        /* Keep the vma as a placeholder in the execbuffer reservation lists */
        if (!list_empty(&vma->exec_list))
                return;
 
-       vm = vma->vm;
-
-       if (!i915_is_ggtt(vm))
-               i915_ppgtt_put(i915_vm_to_ppgtt(vm));
+       if (!vma->is_ggtt)
+               i915_ppgtt_put(i915_vm_to_ppgtt(vma->vm));
 
        list_del(&vma->obj_link);
 
@@ -5202,7 +5198,7 @@ u64 i915_gem_obj_offset(struct drm_i915_gem_object *o,
        WARN_ON(vm == &dev_priv->mm.aliasing_ppgtt->base);
 
        list_for_each_entry(vma, &o->vma_list, obj_link) {
-               if (i915_is_ggtt(vma->vm) &&
+               if (vma->is_ggtt &&
                    vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
                        continue;
                if (vma->vm == vm)
@@ -5235,7 +5231,7 @@ bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
        struct i915_vma *vma;
 
        list_for_each_entry(vma, &o->vma_list, obj_link) {
-               if (i915_is_ggtt(vma->vm) &&
+               if (vma->is_ggtt &&
                    vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
                        continue;
                if (vma->vm == vm && drm_mm_node_allocated(&vma->node))
@@ -5282,7 +5278,7 @@ unsigned long i915_gem_obj_size(struct drm_i915_gem_object *o,
        BUG_ON(list_empty(&o->vma_list));
 
        list_for_each_entry(vma, &o->vma_list, obj_link) {
-               if (i915_is_ggtt(vma->vm) &&
+               if (vma->is_ggtt &&
                    vma->ggtt_view.type != I915_GGTT_VIEW_NORMAL)
                        continue;
                if (vma->vm == vm)
index 8fd00d2794478cd08e46986ffa03ae88a4e351e5..1328bc5021b4cf7287021c81a4252f2cf60cdc2a 100644 (file)
@@ -668,7 +668,7 @@ need_reloc_mappable(struct i915_vma *vma)
        if (entry->relocation_count == 0)
                return false;
 
-       if (!i915_is_ggtt(vma->vm))
+       if (!vma->is_ggtt)
                return false;
 
        /* See also use_cpu_reloc() */
@@ -687,8 +687,7 @@ eb_vma_misplaced(struct i915_vma *vma)
        struct drm_i915_gem_exec_object2 *entry = vma->exec_entry;
        struct drm_i915_gem_object *obj = vma->obj;
 
-       WARN_ON(entry->flags & __EXEC_OBJECT_NEEDS_MAP &&
-              !i915_is_ggtt(vma->vm));
+       WARN_ON(entry->flags & __EXEC_OBJECT_NEEDS_MAP && !vma->is_ggtt);
 
        if (entry->alignment &&
            vma->node.start & (entry->alignment - 1))
index 68d3af6854d1b18e13cf7c4427f7d9acaf9c82c4..49e4f26b79d83fc0ee84527c8b80ed31557a4370 100644 (file)
@@ -3198,6 +3198,7 @@ int i915_gem_gtt_init(struct drm_device *dev)
        }
 
        gtt->base.dev = dev;
+       gtt->base.is_ggtt = true;
 
        ret = gtt->gtt_probe(dev, &gtt->base.total, &gtt->stolen_size,
                             &gtt->mappable_base, &gtt->mappable_end);
@@ -3319,13 +3320,14 @@ __i915_gem_vma_create(struct drm_i915_gem_object *obj,
        INIT_LIST_HEAD(&vma->exec_list);
        vma->vm = vm;
        vma->obj = obj;
+       vma->is_ggtt = i915_is_ggtt(vm);
 
        if (i915_is_ggtt(vm))
                vma->ggtt_view = *ggtt_view;
+       else
+               i915_ppgtt_get(i915_vm_to_ppgtt(vm));
 
        list_add_tail(&vma->obj_link, &obj->vma_list);
-       if (!i915_is_ggtt(vm))
-               i915_ppgtt_get(i915_vm_to_ppgtt(vm));
 
        return vma;
 }
@@ -3598,13 +3600,9 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
                return 0;
 
        if (vma->bound == 0 && vma->vm->allocate_va_range) {
-               trace_i915_va_alloc(vma->vm,
-                                   vma->node.start,
-                                   vma->node.size,
-                                   VM_TO_TRACE_NAME(vma->vm));
-
                /* XXX: i915_vma_pin() will fix this +- hack */
                vma->pin_count++;
+               trace_i915_va_alloc(vma);
                ret = vma->vm->allocate_va_range(vma->vm,
                                                 vma->node.start,
                                                 vma->node.size);
index 31eb0b261fbf1c7b0e0bd137b0b4e76472674002..8774f1ba46e79387a05e224664c074cc7808fef8 100644 (file)
@@ -183,6 +183,7 @@ struct i915_vma {
 #define GLOBAL_BIND    (1<<0)
 #define LOCAL_BIND     (1<<1)
        unsigned int bound : 4;
+       bool is_ggtt : 1;
 
        /**
         * Support different GGTT views into the same object.
@@ -275,6 +276,8 @@ struct i915_address_space {
        u64 start;              /* Start offset always 0 for dri2 */
        u64 total;              /* size addr space maps (ex. 2GB for ggtt) */
 
+       bool is_ggtt;
+
        struct i915_page_scratch *scratch_page;
        struct i915_page_table *scratch_pt;
        struct i915_page_directory *scratch_pd;
@@ -330,6 +333,8 @@ struct i915_address_space {
                        u32 flags);
 };
 
+#define i915_is_ggtt(V) ((V)->is_ggtt)
+
 /* The Graphics Translation Table is the way in which GEN hardware translates a
  * Graphics Virtual Address into a Physical Address. In addition to the normal
  * collateral associated with any va->pa translations GEN hardware also has a
index 52b2d409945d27c81b148fda8c8a5b350a59fb0d..fa09e558113761cac4fafd75e53c5a509bf342a5 100644 (file)
@@ -175,35 +175,24 @@ TRACE_EVENT(i915_vma_unbind,
                      __entry->obj, __entry->offset, __entry->size, __entry->vm)
 );
 
-#define VM_TO_TRACE_NAME(vm) \
-       (i915_is_ggtt(vm) ? "G" : \
-                     "P")
-
-DECLARE_EVENT_CLASS(i915_va,
-       TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
-       TP_ARGS(vm, start, length, name),
+TRACE_EVENT(i915_va_alloc,
+       TP_PROTO(struct i915_vma *vma),
+       TP_ARGS(vma),
 
        TP_STRUCT__entry(
                __field(struct i915_address_space *, vm)
                __field(u64, start)
                __field(u64, end)
-               __string(name, name)
        ),
 
        TP_fast_assign(
-               __entry->vm = vm;
-               __entry->start = start;
-               __entry->end = start + length - 1;
-               __assign_str(name, name);
+               __entry->vm = vma->vm;
+               __entry->start = vma->node.start;
+               __entry->end = vma->node.start + vma->node.size - 1;
        ),
 
-       TP_printk("vm=%p (%s), 0x%llx-0x%llx",
-                 __entry->vm, __get_str(name),  __entry->start, __entry->end)
-);
-
-DEFINE_EVENT(i915_va, i915_va_alloc,
-            TP_PROTO(struct i915_address_space *vm, u64 start, u64 length, const char *name),
-            TP_ARGS(vm, start, length, name)
+       TP_printk("vm=%p (%c), 0x%llx-0x%llx",
+                 __entry->vm, i915_is_ggtt(__entry->vm) ? 'G' : 'P',  __entry->start, __entry->end)
 );
 
 DECLARE_EVENT_CLASS(i915_px_entry,