mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 13:55:32 +00:00
drm/i915: Complete both freed-object passes before draining the workqueue
The workqueue code complains viciously if we try to queue more work onto the queue while attampting to drain it. As we asynchronously free objects and defer their enqueuing with RCU, it is quite tricky to quiesce the system before attempting to drain the workqueue. Yet drain we must to ensure that the worker is idle before unloading the module. Give the freed object drain 3 whole passes with multiple rcu_barrier() to give the defer freeing of several levels each protected by RCU and needing a grace period before its parent can be freed, ultimately resulting in a GEM object being freed after another RCU period. A consequence is that it will make module unload even slower. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110550 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190501135753.8711-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
45b9c968c5
commit
dc76e5764a
1 changed files with 3 additions and 3 deletions
|
@ -2824,15 +2824,15 @@ static inline void i915_gem_drain_workqueue(struct drm_i915_private *i915)
|
|||
* grace period so that we catch work queued via RCU from the first
|
||||
* pass. As neither drain_workqueue() nor flush_workqueue() report
|
||||
* a result, we make an assumption that we only don't require more
|
||||
* than 2 passes to catch all recursive RCU delayed work.
|
||||
* than 3 passes to catch all _recursive_ RCU delayed work.
|
||||
*
|
||||
*/
|
||||
int pass = 2;
|
||||
int pass = 3;
|
||||
do {
|
||||
rcu_barrier();
|
||||
i915_gem_drain_freed_objects(i915);
|
||||
drain_workqueue(i915->wq);
|
||||
} while (--pass);
|
||||
drain_workqueue(i915->wq);
|
||||
}
|
||||
|
||||
struct i915_vma * __must_check
|
||||
|
|
Loading…
Reference in a new issue