Message ID | 20210723172142.3273510-7-jason@jlekstrand.net (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Migrate memory to SMEM when imported cross-device (v8) | expand |
On Fri, 23 Jul 2021 at 18:22, Jason Ekstrand <jason@jlekstrand.net> wrote: > > Without TTM, we have no such hook so we exit early but this is fine > because we use TTM on all LMEM platforms and, on integrated platforms, > there is no real migration. If we do have the hook, it's better to just > let TTM handle the migration because it knows where things are actually > placed. > > This fixes a bug where i915_gem_object_migrate fails to migrate newly > created LMEM objects. In that scenario, the object has obj->mm.region > set to LMEM but TTM has it in SMEM because that's where all new objects > are placed there prior to getting actual pages. When we invoke > i915_gem_object_migrate, it exits early because, from the point of view > of the GEM object, it's already in LMEM and no migration is needed. > Then, when we try to pin the pages, __i915_ttm_get_pages is called > which, unaware of our failed attempt at a migration, places the object > in SMEM. This only happens on newly created objects because they have > this weird state where TTM thinks they're in SMEM, GEM thinks they're in > LMEM, and the reality is that they don't exist at all. > > It's better if GEM just always calls into TTM and let's TTM handle > things. That way the lies stay better contained. Once the migration is > complete, the object will have pages, obj->mm.region will be correct, > and we're done lying. > > Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> Thanks for fixing this, Reviewed-by: Matthew Auld <matthew.auld@intel.com> > --- > drivers/gpu/drm/i915/gem/i915_gem_object.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c > index d09bd9bdb38ac..9d3497e1235a0 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c > @@ -607,12 +607,15 @@ int i915_gem_object_migrate(struct drm_i915_gem_object *obj, > mr = i915->mm.regions[id]; > GEM_BUG_ON(!mr); > > - if (obj->mm.region == mr) > - return 0; > - > if (!i915_gem_object_can_migrate(obj, id)) > return -EINVAL; > > + if (!obj->ops->migrate) { > + if (GEM_WARN_ON(obj->mm.region != mr)) > + return -EINVAL; > + return 0; > + } > + > return obj->ops->migrate(obj, mr); > } > > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c index d09bd9bdb38ac..9d3497e1235a0 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c @@ -607,12 +607,15 @@ int i915_gem_object_migrate(struct drm_i915_gem_object *obj, mr = i915->mm.regions[id]; GEM_BUG_ON(!mr); - if (obj->mm.region == mr) - return 0; - if (!i915_gem_object_can_migrate(obj, id)) return -EINVAL; + if (!obj->ops->migrate) { + if (GEM_WARN_ON(obj->mm.region != mr)) + return -EINVAL; + return 0; + } + return obj->ops->migrate(obj, mr); }
Without TTM, we have no such hook so we exit early but this is fine because we use TTM on all LMEM platforms and, on integrated platforms, there is no real migration. If we do have the hook, it's better to just let TTM handle the migration because it knows where things are actually placed. This fixes a bug where i915_gem_object_migrate fails to migrate newly created LMEM objects. In that scenario, the object has obj->mm.region set to LMEM but TTM has it in SMEM because that's where all new objects are placed there prior to getting actual pages. When we invoke i915_gem_object_migrate, it exits early because, from the point of view of the GEM object, it's already in LMEM and no migration is needed. Then, when we try to pin the pages, __i915_ttm_get_pages is called which, unaware of our failed attempt at a migration, places the object in SMEM. This only happens on newly created objects because they have this weird state where TTM thinks they're in SMEM, GEM thinks they're in LMEM, and the reality is that they don't exist at all. It's better if GEM just always calls into TTM and let's TTM handle things. That way the lies stay better contained. Once the migration is complete, the object will have pages, obj->mm.region will be correct, and we're done lying. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net> --- drivers/gpu/drm/i915/gem/i915_gem_object.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)