Message ID | 20211114111218.623138-2-thomas.hellstrom@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/i915/ttm: Async migration | expand |
On 14/11/2021 11:12, Thomas Hellström wrote: > From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > > We want to get rid of i915_vma tracking to simplify the code and > lifetimes. Add a way to set/put the moving fence, in preparation for > removing the tracking. > > Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> > --- > drivers/gpu/drm/i915/gem/i915_gem_object.c | 37 ++++++++++++++++++++++ > drivers/gpu/drm/i915/gem/i915_gem_object.h | 9 ++++++ > 2 files changed, 46 insertions(+) > > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c > index 591ee3cb7275..ec4313836597 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c > @@ -33,6 +33,7 @@ > #include "i915_gem_object.h" > #include "i915_memcpy.h" > #include "i915_trace.h" > +#include "i915_gem_ttm.h" > > static struct kmem_cache *slab_objects; > > @@ -726,6 +727,42 @@ static const struct drm_gem_object_funcs i915_gem_object_funcs = { > .export = i915_gem_prime_export, > }; > > +struct dma_fence * > +i915_gem_object_get_moving_fence(struct drm_i915_gem_object *obj) > +{ > + return dma_fence_get(i915_gem_to_ttm(obj)->moving); > +} > + > +void i915_gem_object_set_moving_fence(struct drm_i915_gem_object *obj, > + struct dma_fence *fence) > +{ > + dma_fence_put(i915_gem_to_ttm(obj)->moving); > + > + i915_gem_to_ttm(obj)->moving = dma_fence_get(fence); > +} Are these also assert_object_held()? Should we maybe squash this patch with the first user? > + > +int i915_gem_object_wait_moving_fence(struct drm_i915_gem_object *obj, > + bool intr) > +{ > + struct dma_fence *fence = i915_gem_to_ttm(obj)->moving; > + int ret; > + > + assert_object_held(obj); > + if (!fence) > + return 0; > + > + ret = dma_fence_wait(fence, intr); > + if (ret) > + return ret; > + > + if (fence->error) > + return fence->error; > + > + i915_gem_to_ttm(obj)->moving = NULL; > + dma_fence_put(fence); > + return 0; > +} > + > #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) > #include "selftests/huge_gem_object.c" > #include "selftests/huge_pages.c" > diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h > index 133963b46135..36bf3e2e602f 100644 > --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h > +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h > @@ -517,6 +517,15 @@ i915_gem_object_finish_access(struct drm_i915_gem_object *obj) > i915_gem_object_unpin_pages(obj); > } > > +struct dma_fence * > +i915_gem_object_get_moving_fence(struct drm_i915_gem_object *obj); > + > +void i915_gem_object_set_moving_fence(struct drm_i915_gem_object *obj, > + struct dma_fence *fence); > + > +int i915_gem_object_wait_moving_fence(struct drm_i915_gem_object *obj, > + bool intr); > + > void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj, > unsigned int cache_level); > bool i915_gem_object_can_bypass_llc(struct drm_i915_gem_object *obj); >
On 11/15/21 13:39, Matthew Auld wrote: > On 14/11/2021 11:12, Thomas Hellström wrote: >> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> >> >> We want to get rid of i915_vma tracking to simplify the code and >> lifetimes. Add a way to set/put the moving fence, in preparation for >> removing the tracking. >> >> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> >> --- >> drivers/gpu/drm/i915/gem/i915_gem_object.c | 37 ++++++++++++++++++++++ >> drivers/gpu/drm/i915/gem/i915_gem_object.h | 9 ++++++ >> 2 files changed, 46 insertions(+) >> >> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c >> b/drivers/gpu/drm/i915/gem/i915_gem_object.c >> index 591ee3cb7275..ec4313836597 100644 >> --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c >> +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c >> @@ -33,6 +33,7 @@ >> #include "i915_gem_object.h" >> #include "i915_memcpy.h" >> #include "i915_trace.h" >> +#include "i915_gem_ttm.h" >> static struct kmem_cache *slab_objects; >> @@ -726,6 +727,42 @@ static const struct drm_gem_object_funcs >> i915_gem_object_funcs = { >> .export = i915_gem_prime_export, >> }; >> +struct dma_fence * >> +i915_gem_object_get_moving_fence(struct drm_i915_gem_object *obj) >> +{ >> + return dma_fence_get(i915_gem_to_ttm(obj)->moving); >> +} >> + >> +void i915_gem_object_set_moving_fence(struct drm_i915_gem_object *obj, >> + struct dma_fence *fence) >> +{ >> + dma_fence_put(i915_gem_to_ttm(obj)->moving); >> + >> + i915_gem_to_ttm(obj)->moving = dma_fence_get(fence); >> +} > > Are these also assert_object_held()? Should we maybe squash this patch > with the first user? Yes these are also assert_object_held(). We could probably squash these, yes.
diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.c b/drivers/gpu/drm/i915/gem/i915_gem_object.c index 591ee3cb7275..ec4313836597 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.c @@ -33,6 +33,7 @@ #include "i915_gem_object.h" #include "i915_memcpy.h" #include "i915_trace.h" +#include "i915_gem_ttm.h" static struct kmem_cache *slab_objects; @@ -726,6 +727,42 @@ static const struct drm_gem_object_funcs i915_gem_object_funcs = { .export = i915_gem_prime_export, }; +struct dma_fence * +i915_gem_object_get_moving_fence(struct drm_i915_gem_object *obj) +{ + return dma_fence_get(i915_gem_to_ttm(obj)->moving); +} + +void i915_gem_object_set_moving_fence(struct drm_i915_gem_object *obj, + struct dma_fence *fence) +{ + dma_fence_put(i915_gem_to_ttm(obj)->moving); + + i915_gem_to_ttm(obj)->moving = dma_fence_get(fence); +} + +int i915_gem_object_wait_moving_fence(struct drm_i915_gem_object *obj, + bool intr) +{ + struct dma_fence *fence = i915_gem_to_ttm(obj)->moving; + int ret; + + assert_object_held(obj); + if (!fence) + return 0; + + ret = dma_fence_wait(fence, intr); + if (ret) + return ret; + + if (fence->error) + return fence->error; + + i915_gem_to_ttm(obj)->moving = NULL; + dma_fence_put(fence); + return 0; +} + #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST) #include "selftests/huge_gem_object.c" #include "selftests/huge_pages.c" diff --git a/drivers/gpu/drm/i915/gem/i915_gem_object.h b/drivers/gpu/drm/i915/gem/i915_gem_object.h index 133963b46135..36bf3e2e602f 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_object.h +++ b/drivers/gpu/drm/i915/gem/i915_gem_object.h @@ -517,6 +517,15 @@ i915_gem_object_finish_access(struct drm_i915_gem_object *obj) i915_gem_object_unpin_pages(obj); } +struct dma_fence * +i915_gem_object_get_moving_fence(struct drm_i915_gem_object *obj); + +void i915_gem_object_set_moving_fence(struct drm_i915_gem_object *obj, + struct dma_fence *fence); + +int i915_gem_object_wait_moving_fence(struct drm_i915_gem_object *obj, + bool intr); + void i915_gem_object_set_cache_coherency(struct drm_i915_gem_object *obj, unsigned int cache_level); bool i915_gem_object_can_bypass_llc(struct drm_i915_gem_object *obj);