Message ID | 20210602170716.280491-5-thomas.hellstrom@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915: Move system memory to TTM for discrete | expand |
On Wed, 2 Jun 2021 at 18:08, Thomas Hellström <thomas.hellstrom@linux.intel.com> wrote: > > For discrete, use TTM for both cached and WC system memory. That means > we currently rely on the TTM memory accounting / shrinker. For cached > system memory we should consider remaining shmem-backed, which can be > implemented from our ttm_tt_populate calback. We can then also reuse our > own very elaborate shrinker for that memory. > > Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> > --- > drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 22 ++++++++++++++++++++++ > drivers/gpu/drm/i915/i915_drv.h | 3 --- > drivers/gpu/drm/i915/intel_memory_region.c | 7 ++++++- > drivers/gpu/drm/i915/intel_memory_region.h | 8 ++++++++ > 4 files changed, 36 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > index 8e1c01168c6d..42e89bf43708 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c > @@ -755,3 +755,25 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, > /* i915 wants -ENXIO when out of memory region space. */ > return (ret == -ENOSPC) ? -ENXIO : ret; > } > + > +static const struct intel_memory_region_ops ttm_system_region_ops = { > + .init_object = __i915_gem_ttm_object_init, > +}; > + > +struct intel_memory_region * > +i915_gem_ttm_system_setup(struct drm_i915_private *i915, > + u16 type, u16 instance) > +{ > + struct intel_memory_region *mr; > + > + mr = intel_memory_region_create(i915, 0, > + totalram_pages() << PAGE_SHIFT, > + PAGE_SIZE, 0, > + type, instance, > + &ttm_system_region_ops); > + if (IS_ERR_OR_NULL(mr)) region_create can't return NULL. > + return mr; > + > + intel_memory_region_set_name(mr, "system-ttm"); > + return mr; > +} > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index 524aaeb0e842..c6cc16ccce36 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -1768,9 +1768,6 @@ void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv); > void i915_gem_init_early(struct drm_i915_private *dev_priv); > void i915_gem_cleanup_early(struct drm_i915_private *dev_priv); > > -struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, > - u16 type, u16 instance); > - > static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) > { > /* > diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c > index bd27e897d4d0..a42bb36c2aea 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.c > +++ b/drivers/gpu/drm/i915/intel_memory_region.c > @@ -220,7 +220,12 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915) > instance = intel_region_map[i].instance; > switch (type) { > case INTEL_MEMORY_SYSTEM: > - mem = i915_gem_shmem_setup(i915, type, instance); > + if (IS_DGFX(i915)) > + mem = i915_gem_ttm_system_setup(i915, type, > + instance); > + else > + mem = i915_gem_shmem_setup(i915, type, > + instance); > break; > case INTEL_MEMORY_STOLEN_LOCAL: > mem = i915_gem_stolen_lmem_setup(i915, type, instance); > diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h > index 7b5fa97c0b59..4d084424b55c 100644 > --- a/drivers/gpu/drm/i915/intel_memory_region.h > +++ b/drivers/gpu/drm/i915/intel_memory_region.h > @@ -142,4 +142,12 @@ void intel_memory_region_unreserve(struct intel_memory_region *mem); > int intel_memory_region_reserve(struct intel_memory_region *mem, > resource_size_t offset, > resource_size_t size); > + > +struct intel_memory_region * > +i915_gem_ttm_system_setup(struct drm_i915_private *i915, > + u16 type, u16 instance); > +struct intel_memory_region * > +i915_gem_shmem_setup(struct drm_i915_private *i915, > + u16 type, u16 instance); > + > #endif > -- > 2.31.1 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/intel-gfx
On 6/3/21 11:48 AM, Matthew Auld wrote: > On Wed, 2 Jun 2021 at 18:08, Thomas Hellström > <thomas.hellstrom@linux.intel.com> wrote: >> For discrete, use TTM for both cached and WC system memory. That means >> we currently rely on the TTM memory accounting / shrinker. For cached >> system memory we should consider remaining shmem-backed, which can be >> implemented from our ttm_tt_populate calback. We can then also reuse our >> own very elaborate shrinker for that memory. >> >> Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> >> --- >> drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 22 ++++++++++++++++++++++ >> drivers/gpu/drm/i915/i915_drv.h | 3 --- >> drivers/gpu/drm/i915/intel_memory_region.c | 7 ++++++- >> drivers/gpu/drm/i915/intel_memory_region.h | 8 ++++++++ >> 4 files changed, 36 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >> index 8e1c01168c6d..42e89bf43708 100644 >> --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >> +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c >> @@ -755,3 +755,25 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, >> /* i915 wants -ENXIO when out of memory region space. */ >> return (ret == -ENOSPC) ? -ENXIO : ret; >> } >> + >> +static const struct intel_memory_region_ops ttm_system_region_ops = { >> + .init_object = __i915_gem_ttm_object_init, >> +}; >> + >> +struct intel_memory_region * >> +i915_gem_ttm_system_setup(struct drm_i915_private *i915, >> + u16 type, u16 instance) >> +{ >> + struct intel_memory_region *mr; >> + >> + mr = intel_memory_region_create(i915, 0, >> + totalram_pages() << PAGE_SHIFT, >> + PAGE_SIZE, 0, >> + type, instance, >> + &ttm_system_region_ops); >> + if (IS_ERR_OR_NULL(mr)) > region_create can't return NULL. OK, will fix.
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c index 8e1c01168c6d..42e89bf43708 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_ttm.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_ttm.c @@ -755,3 +755,25 @@ int __i915_gem_ttm_object_init(struct intel_memory_region *mem, /* i915 wants -ENXIO when out of memory region space. */ return (ret == -ENOSPC) ? -ENXIO : ret; } + +static const struct intel_memory_region_ops ttm_system_region_ops = { + .init_object = __i915_gem_ttm_object_init, +}; + +struct intel_memory_region * +i915_gem_ttm_system_setup(struct drm_i915_private *i915, + u16 type, u16 instance) +{ + struct intel_memory_region *mr; + + mr = intel_memory_region_create(i915, 0, + totalram_pages() << PAGE_SHIFT, + PAGE_SIZE, 0, + type, instance, + &ttm_system_region_ops); + if (IS_ERR_OR_NULL(mr)) + return mr; + + intel_memory_region_set_name(mr, "system-ttm"); + return mr; +} diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 524aaeb0e842..c6cc16ccce36 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1768,9 +1768,6 @@ void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv); void i915_gem_init_early(struct drm_i915_private *dev_priv); void i915_gem_cleanup_early(struct drm_i915_private *dev_priv); -struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915, - u16 type, u16 instance); - static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) { /* diff --git a/drivers/gpu/drm/i915/intel_memory_region.c b/drivers/gpu/drm/i915/intel_memory_region.c index bd27e897d4d0..a42bb36c2aea 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.c +++ b/drivers/gpu/drm/i915/intel_memory_region.c @@ -220,7 +220,12 @@ int intel_memory_regions_hw_probe(struct drm_i915_private *i915) instance = intel_region_map[i].instance; switch (type) { case INTEL_MEMORY_SYSTEM: - mem = i915_gem_shmem_setup(i915, type, instance); + if (IS_DGFX(i915)) + mem = i915_gem_ttm_system_setup(i915, type, + instance); + else + mem = i915_gem_shmem_setup(i915, type, + instance); break; case INTEL_MEMORY_STOLEN_LOCAL: mem = i915_gem_stolen_lmem_setup(i915, type, instance); diff --git a/drivers/gpu/drm/i915/intel_memory_region.h b/drivers/gpu/drm/i915/intel_memory_region.h index 7b5fa97c0b59..4d084424b55c 100644 --- a/drivers/gpu/drm/i915/intel_memory_region.h +++ b/drivers/gpu/drm/i915/intel_memory_region.h @@ -142,4 +142,12 @@ void intel_memory_region_unreserve(struct intel_memory_region *mem); int intel_memory_region_reserve(struct intel_memory_region *mem, resource_size_t offset, resource_size_t size); + +struct intel_memory_region * +i915_gem_ttm_system_setup(struct drm_i915_private *i915, + u16 type, u16 instance); +struct intel_memory_region * +i915_gem_shmem_setup(struct drm_i915_private *i915, + u16 type, u16 instance); + #endif
For discrete, use TTM for both cached and WC system memory. That means we currently rely on the TTM memory accounting / shrinker. For cached system memory we should consider remaining shmem-backed, which can be implemented from our ttm_tt_populate calback. We can then also reuse our own very elaborate shrinker for that memory. Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com> --- drivers/gpu/drm/i915/gem/i915_gem_ttm.c | 22 ++++++++++++++++++++++ drivers/gpu/drm/i915/i915_drv.h | 3 --- drivers/gpu/drm/i915/intel_memory_region.c | 7 ++++++- drivers/gpu/drm/i915/intel_memory_region.h | 8 ++++++++ 4 files changed, 36 insertions(+), 4 deletions(-)