]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
drm/i915: Make ptr_unpack_bits() more function-like
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 17 May 2017 12:09:58 +0000 (13:09 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 17 May 2017 12:38:03 +0000 (13:38 +0100)
ptr_unpack_bits() is a function-like macro, as such it is meant to be
replaceable by a function. In this case, we should be passing in the
out-param as a pointer.

Bizarrely this does affect code generation:

function                                     old     new   delta
i915_gem_object_pin_map                      409     389     -20

An improvement(?) in this case, but one can't help wonder what
strict-aliasing optimisations we are preventing.

The generated code looks identical in using ptr_unpack_bits (no extra
motions to stack, the pointer and bits appear to be kept in registers),
the difference appears to be code ordering and with a reorder it is able
to use smaller forward jumps.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170517121007.27224-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_utils.h

index f9c6b9b5002c9e42594a849f27e63c8f9427db7b..5d68bece2ac317346688030139fe54db10b30b82 100644 (file)
@@ -2612,7 +2612,7 @@ void *i915_gem_object_pin_map(struct drm_i915_gem_object *obj,
        }
        GEM_BUG_ON(!obj->mm.pages);
 
-       ptr = ptr_unpack_bits(obj->mm.mapping, has_type);
+       ptr = ptr_unpack_bits(obj->mm.mapping, &has_type);
        if (ptr && has_type != type) {
                if (pinned) {
                        ret = -EBUSY;
index f9d6607ef52f87225a94aa32b0086518f43204c4..18630d8f4be8283d044a1afaebb3a4e03a4136e6 100644 (file)
@@ -77,7 +77,7 @@
 
 #define ptr_unpack_bits(ptr, bits) ({                                  \
        unsigned long __v = (unsigned long)(ptr);                       \
-       (bits) = __v & ~PAGE_MASK;                                      \
+       *(bits) = __v & ~PAGE_MASK;                                     \
        (typeof(ptr))(__v & PAGE_MASK);                                 \
 })