Quoting Sultan Alsawaf (2020-03-30 04:30:57) > +static void engine_retire(struct work_struct *work) > +{ > + struct intel_engine_cs *engine = > + container_of(work, typeof(*engine), retire_work); > + struct intel_timeline *tl = xchg(&engine->retire, NULL); > + > + do { > + struct intel_timeline *next = xchg(&tl->retire, NULL); > + > + /* > + * Our goal here is to retire _idle_ timelines as soon as > + * possible (as they are idle, we do not expect userspace > + * to be cleaning up anytime soon). > + * > + * If the timeline is currently locked, either it is being > + * retired elsewhere or about to be! > + */ iirc the backport requires the retirement to be wrapped in struct_mutex mutex_lock(&engine->i915->drm.struct_mutex); > + if (mutex_trylock(&tl->mutex)) { > + retire_requests(tl); > + mutex_unlock(&tl->mutex); > + } mutex_unlock(&engine->i915->drm.struct_mutex); Now the question is whether that was for 5.3 or 5.4. I think 5.3 is where the changes were more severe and where we switch to the 4.19 approach. > + intel_timeline_put(tl); > + > + GEM_BUG_ON(!next); > + tl = ptr_mask_bits(next, 1); > + } while (tl); > +}