drm/i915: Use __ffs() in for_each_priolist for more compact code
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 26 Feb 2019 10:24:04 +0000 (10:24 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 28 Feb 2019 11:18:43 +0000 (11:18 +0000)
Gcc has a slight preference if we use __ffs() to subtract one from the
index once rather than each use:

__execlists_submission_tasklet              2867    2847     -20

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190226102404.29153-11-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/i915_scheduler.h

index 4153c6a607b04342653a550b3824f79a5cf537bc..bb3d496d4c49ef737d204ec905b34ccaf7da3f84 100644 (file)
@@ -95,9 +95,11 @@ struct i915_priolist {
                list_for_each_entry(it, &(plist)->requests[idx], sched.link)
 
 #define priolist_for_each_request_consume(it, n, plist, idx) \
-       for (; (idx = ffs((plist)->used)); (plist)->used &= ~BIT(idx - 1)) \
+       for (; \
+            (plist)->used ? (idx = __ffs((plist)->used)), 1 : 0; \
+            (plist)->used &= ~BIT(idx)) \
                list_for_each_entry_safe(it, n, \
-                                        &(plist)->requests[idx - 1], \
+                                        &(plist)->requests[idx], \
                                         sched.link)
 
 void i915_sched_node_init(struct i915_sched_node *node);