drm/i915: Promote i915->mm.obj_lock to be irqsafe
The intent is to be able to update the mm.lists from inside an irqsoff
section (e.g. from a softirq rcu workqueue), ergo we need to make the
i915->mm.obj_lock irqsafe.
v2: can_discard_pages() ensures we are shrinkable
v3: Beware shadowing of 'flags'
Fixes: 3b4fa9640c
("drm/i915: Track the purgeable objects on a separate eviction list")
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110869
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Matthew Auld <matthew.william.auld@gmail.com>
Reviewed-by: Matthew Auld <matthew.william.auld@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190610145430.17717-1-chris@chris-wilson.co.uk
This commit is contained in:
@@ -269,6 +269,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
|
||||
struct drm_i915_gem_object *obj;
|
||||
u64 total_obj_size, total_gtt_size;
|
||||
unsigned long total, count, n;
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
|
||||
total = READ_ONCE(dev_priv->mm.shrink_count);
|
||||
@@ -282,7 +283,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
|
||||
|
||||
total_obj_size = total_gtt_size = count = 0;
|
||||
|
||||
spin_lock(&dev_priv->mm.obj_lock);
|
||||
spin_lock_irqsave(&dev_priv->mm.obj_lock, flags);
|
||||
list_for_each_entry(obj, &dev_priv->mm.bound_list, mm.link) {
|
||||
if (count == total)
|
||||
break;
|
||||
@@ -305,7 +306,7 @@ static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
|
||||
objects[count++] = obj;
|
||||
total_obj_size += obj->base.size;
|
||||
}
|
||||
spin_unlock(&dev_priv->mm.obj_lock);
|
||||
spin_unlock_irqrestore(&dev_priv->mm.obj_lock, flags);
|
||||
|
||||
sort(objects, count, sizeof(*objects), obj_rank_by_stolen, NULL);
|
||||
|
||||
@@ -457,6 +458,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
|
||||
u64 size, mapped_size, purgeable_size, dpy_size, huge_size;
|
||||
struct drm_i915_gem_object *obj;
|
||||
unsigned int page_sizes = 0;
|
||||
unsigned long flags;
|
||||
char buf[80];
|
||||
int ret;
|
||||
|
||||
@@ -469,7 +471,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
|
||||
purgeable_size = purgeable_count = 0;
|
||||
huge_size = huge_count = 0;
|
||||
|
||||
spin_lock(&dev_priv->mm.obj_lock);
|
||||
spin_lock_irqsave(&dev_priv->mm.obj_lock, flags);
|
||||
list_for_each_entry(obj, &dev_priv->mm.unbound_list, mm.link) {
|
||||
size += obj->base.size;
|
||||
++count;
|
||||
@@ -518,7 +520,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
|
||||
page_sizes |= obj->mm.page_sizes.sg;
|
||||
}
|
||||
}
|
||||
spin_unlock(&dev_priv->mm.obj_lock);
|
||||
spin_unlock_irqrestore(&dev_priv->mm.obj_lock, flags);
|
||||
|
||||
seq_printf(m, "%u bound objects, %llu bytes\n",
|
||||
count, size);
|
||||
|
Reference in New Issue
Block a user