drm/i915: Combine multiple internal plists into the same i915_priolist bucket
As we are about to allow ourselves to slightly bump the user priority into a few different sublevels, packthose internal priority lists into the same i915_priolist to keep the rbtree compact and avoid having to allocate the default user priority even after the internal bumping. The downside to having an requests[] rather than a node per active list, is that we then have to walk over the empty higher priority lists. To compensate, we track the active buckets and use a small bitmap to skip over any inactive ones. v2: Use MASK of internal levels to simplify our usage. v3: Prevent overflow when SHIFT is zero. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181001123204.23982-4-chris@chris-wilson.co.uk
This commit is contained in:
@@ -190,11 +190,22 @@ enum intel_engine_id {
|
||||
};
|
||||
|
||||
struct i915_priolist {
|
||||
struct list_head requests[I915_PRIORITY_COUNT];
|
||||
struct rb_node node;
|
||||
struct list_head requests;
|
||||
unsigned long used;
|
||||
int priority;
|
||||
};
|
||||
|
||||
#define priolist_for_each_request(it, plist, idx) \
|
||||
for (idx = 0; idx < ARRAY_SIZE((plist)->requests); idx++) \
|
||||
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)) \
|
||||
list_for_each_entry_safe(it, n, \
|
||||
&(plist)->requests[idx - 1], \
|
||||
sched.link)
|
||||
|
||||
struct st_preempt_hang {
|
||||
struct completion completion;
|
||||
bool inject_hang;
|
||||
|
Reference in New Issue
Block a user