* [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex [not found] <20200519214547.352050-1-a.darwish@linutronix.de> @ 2020-05-19 21:45 ` Ahmed S. Darwish 2020-05-20 10:48 ` Christian König [not found] ` <20200608005729.1874024-1-a.darwish@linutronix.de> 1 sibling, 1 reply; 6+ messages in thread From: Ahmed S. Darwish @ 2020-05-19 21:45 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar, Will Deacon Cc: David (ChunMing) Zhou, amd-gfx, Paul E. McKenney, David Airlie, Sebastian A. Siewior, LKML, Steven Rostedt, Christian König, dri-devel, Daniel Vetter, Ahmed S. Darwish, Alex Deucher, Felix Kuehling, Thomas Gleixner, Sumit Semwal, linux-media A sequence counter write side critical section must be protected by some form of locking to serialize writers. If the serialization primitive is not disabling preemption implicitly, preemption has to be explicitly disabled before entering the sequence counter write side critical section. The dma-buf reservation subsystem uses plain sequence counters to manage updates to reservations. Writer serialization is accomplished through a wound/wait mutex. Acquiring a wound/wait mutex does not disable preemption, so this needs to be done manually before and after the write side critical section. Use the newly-added seqcount_ww_mutex_t instead: - It associates the ww_mutex with the sequence count, which enables lockdep to validate that the write side critical section is properly serialized. - It removes the need to explicitly add preempt_disable/enable() around the write side critical section because the write_begin/end() functions for this new data type automatically do this. If lockdep is disabled this ww_mutex lock association is compiled out and has neither storage size nor runtime overhead. Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de> --- drivers/dma-buf/dma-resv.c | 8 +------- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 -- include/linux/dma-resv.h | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c index 590ce7ad60a0..3aba2b2bfc48 100644 --- a/drivers/dma-buf/dma-resv.c +++ b/drivers/dma-buf/dma-resv.c @@ -128,7 +128,7 @@ subsys_initcall(dma_resv_lockdep); void dma_resv_init(struct dma_resv *obj) { ww_mutex_init(&obj->lock, &reservation_ww_class); - seqcount_init(&obj->seq); + seqcount_ww_mutex_init(&obj->seq, &obj->lock); RCU_INIT_POINTER(obj->fence, NULL); RCU_INIT_POINTER(obj->fence_excl, NULL); @@ -259,7 +259,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) fobj = dma_resv_get_list(obj); count = fobj->shared_count; - preempt_disable(); write_seqcount_begin(&obj->seq); for (i = 0; i < count; ++i) { @@ -281,7 +280,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) smp_store_mb(fobj->shared_count, count); write_seqcount_end(&obj->seq); - preempt_enable(); dma_fence_put(old); } EXPORT_SYMBOL(dma_resv_add_shared_fence); @@ -308,14 +306,12 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence) if (fence) dma_fence_get(fence); - preempt_disable(); write_seqcount_begin(&obj->seq); /* write_seqcount_begin provides the necessary memory barrier */ RCU_INIT_POINTER(obj->fence_excl, fence); if (old) old->shared_count = 0; write_seqcount_end(&obj->seq); - preempt_enable(); /* inplace update, no shared fences */ while (i--) @@ -393,13 +389,11 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src) src_list = dma_resv_get_list(dst); old = dma_resv_get_excl(dst); - preempt_disable(); write_seqcount_begin(&dst->seq); /* write_seqcount_begin provides the necessary memory barrier */ RCU_INIT_POINTER(dst->fence_excl, new); RCU_INIT_POINTER(dst->fence, dst_list); write_seqcount_end(&dst->seq); - preempt_enable(); dma_resv_list_free(src_list); dma_fence_put(old); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 9dff792c9290..87fd32aae8f9 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -258,11 +258,9 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, new->shared_count = k; /* Install the new fence list, seqcount provides the barriers */ - preempt_disable(); write_seqcount_begin(&resv->seq); RCU_INIT_POINTER(resv->fence, new); write_seqcount_end(&resv->seq); - preempt_enable(); /* Drop the references to the removed fences or move them to ef_list */ for (i = j, k = 0; i < old->shared_count; ++i) { diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h index a6538ae7d93f..d44a77e8a7e3 100644 --- a/include/linux/dma-resv.h +++ b/include/linux/dma-resv.h @@ -69,7 +69,7 @@ struct dma_resv_list { */ struct dma_resv { struct ww_mutex lock; - seqcount_t seq; + seqcount_ww_mutex_t seq; struct dma_fence __rcu *fence_excl; struct dma_resv_list __rcu *fence; -- 2.20.1 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex 2020-05-19 21:45 ` [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex Ahmed S. Darwish @ 2020-05-20 10:48 ` Christian König 2020-05-21 0:09 ` Ahmed S. Darwish 0 siblings, 1 reply; 6+ messages in thread From: Christian König @ 2020-05-20 10:48 UTC (permalink / raw) To: Ahmed S. Darwish, Peter Zijlstra, Ingo Molnar, Will Deacon Cc: David (ChunMing) Zhou, dri-devel, Paul E. McKenney, David Airlie, Sebastian A. Siewior, LKML, amd-gfx, Sumit Semwal, Steven Rostedt, Daniel Vetter, Alex Deucher, Felix Kuehling, Thomas Gleixner, Christian König, linux-media Am 19.05.20 um 23:45 schrieb Ahmed S. Darwish: > A sequence counter write side critical section must be protected by some > form of locking to serialize writers. If the serialization primitive is > not disabling preemption implicitly, preemption has to be explicitly > disabled before entering the sequence counter write side critical > section. > > The dma-buf reservation subsystem uses plain sequence counters to manage > updates to reservations. Writer serialization is accomplished through a > wound/wait mutex. > > Acquiring a wound/wait mutex does not disable preemption, so this needs > to be done manually before and after the write side critical section. > > Use the newly-added seqcount_ww_mutex_t instead: > > - It associates the ww_mutex with the sequence count, which enables > lockdep to validate that the write side critical section is properly > serialized. > > - It removes the need to explicitly add preempt_disable/enable() > around the write side critical section because the write_begin/end() > functions for this new data type automatically do this. > > If lockdep is disabled this ww_mutex lock association is compiled out > and has neither storage size nor runtime overhead. Mhm, is the dma_resv object the only user of this new seqcount_ww_mutex variant ? If yes we are trying to get rid of this sequence counter for quite some time, so I would rather invest the additional time to finish this. Regards, Christian. > > Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de> > --- > drivers/dma-buf/dma-resv.c | 8 +------- > drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 -- > include/linux/dma-resv.h | 2 +- > 3 files changed, 2 insertions(+), 10 deletions(-) > > diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c > index 590ce7ad60a0..3aba2b2bfc48 100644 > --- a/drivers/dma-buf/dma-resv.c > +++ b/drivers/dma-buf/dma-resv.c > @@ -128,7 +128,7 @@ subsys_initcall(dma_resv_lockdep); > void dma_resv_init(struct dma_resv *obj) > { > ww_mutex_init(&obj->lock, &reservation_ww_class); > - seqcount_init(&obj->seq); > + seqcount_ww_mutex_init(&obj->seq, &obj->lock); > > RCU_INIT_POINTER(obj->fence, NULL); > RCU_INIT_POINTER(obj->fence_excl, NULL); > @@ -259,7 +259,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) > fobj = dma_resv_get_list(obj); > count = fobj->shared_count; > > - preempt_disable(); > write_seqcount_begin(&obj->seq); > > for (i = 0; i < count; ++i) { > @@ -281,7 +280,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) > smp_store_mb(fobj->shared_count, count); > > write_seqcount_end(&obj->seq); > - preempt_enable(); > dma_fence_put(old); > } > EXPORT_SYMBOL(dma_resv_add_shared_fence); > @@ -308,14 +306,12 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence) > if (fence) > dma_fence_get(fence); > > - preempt_disable(); > write_seqcount_begin(&obj->seq); > /* write_seqcount_begin provides the necessary memory barrier */ > RCU_INIT_POINTER(obj->fence_excl, fence); > if (old) > old->shared_count = 0; > write_seqcount_end(&obj->seq); > - preempt_enable(); > > /* inplace update, no shared fences */ > while (i--) > @@ -393,13 +389,11 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src) > src_list = dma_resv_get_list(dst); > old = dma_resv_get_excl(dst); > > - preempt_disable(); > write_seqcount_begin(&dst->seq); > /* write_seqcount_begin provides the necessary memory barrier */ > RCU_INIT_POINTER(dst->fence_excl, new); > RCU_INIT_POINTER(dst->fence, dst_list); > write_seqcount_end(&dst->seq); > - preempt_enable(); > > dma_resv_list_free(src_list); > dma_fence_put(old); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index 9dff792c9290..87fd32aae8f9 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -258,11 +258,9 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, > new->shared_count = k; > > /* Install the new fence list, seqcount provides the barriers */ > - preempt_disable(); > write_seqcount_begin(&resv->seq); > RCU_INIT_POINTER(resv->fence, new); > write_seqcount_end(&resv->seq); > - preempt_enable(); > > /* Drop the references to the removed fences or move them to ef_list */ > for (i = j, k = 0; i < old->shared_count; ++i) { > diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h > index a6538ae7d93f..d44a77e8a7e3 100644 > --- a/include/linux/dma-resv.h > +++ b/include/linux/dma-resv.h > @@ -69,7 +69,7 @@ struct dma_resv_list { > */ > struct dma_resv { > struct ww_mutex lock; > - seqcount_t seq; > + seqcount_ww_mutex_t seq; > > struct dma_fence __rcu *fence_excl; > struct dma_resv_list __rcu *fence; _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex 2020-05-20 10:48 ` Christian König @ 2020-05-21 0:09 ` Ahmed S. Darwish 2020-05-21 13:20 ` Christian König 0 siblings, 1 reply; 6+ messages in thread From: Ahmed S. Darwish @ 2020-05-21 0:09 UTC (permalink / raw) To: Christian König Cc: David (ChunMing) Zhou, dri-devel, Paul E. McKenney, Peter Zijlstra, Sebastian A. Siewior, LKML, amd-gfx, Sumit Semwal, David Airlie, Ingo Molnar, Steven Rostedt, Daniel Vetter, Alex Deucher, Felix Kuehling, Thomas Gleixner, Will Deacon, Christian König, linux-media On Wed, May 20, 2020, Christian König wrote: > Am 19.05.20 um 23:45 schrieb Ahmed S. Darwish: > > A sequence counter write side critical section must be protected by some > > form of locking to serialize writers. If the serialization primitive is > > not disabling preemption implicitly, preemption has to be explicitly > > disabled before entering the sequence counter write side critical > > section. > > > > The dma-buf reservation subsystem uses plain sequence counters to manage > > updates to reservations. Writer serialization is accomplished through a > > wound/wait mutex. > > > > Acquiring a wound/wait mutex does not disable preemption, so this needs > > to be done manually before and after the write side critical section. > > > > Use the newly-added seqcount_ww_mutex_t instead: > > > > - It associates the ww_mutex with the sequence count, which enables > > lockdep to validate that the write side critical section is properly > > serialized. > > > > - It removes the need to explicitly add preempt_disable/enable() > > around the write side critical section because the write_begin/end() > > functions for this new data type automatically do this. > > > > If lockdep is disabled this ww_mutex lock association is compiled out > > and has neither storage size nor runtime overhead. > > Mhm, is the dma_resv object the only user of this new seqcount_ww_mutex > variant ? > > If yes we are trying to get rid of this sequence counter for quite some > time, so I would rather invest the additional time to finish this. > In this patch series, each extra "seqcount with associated lock" data type costs us, exactly: - 1 typedef definition, seqcount_ww_mutex_t - 1 static initializer, SEQCNT_WW_MUTEX_ZERO() - 1 runtime initializer, seqcount_ww_mutex_init() Definitions for the typedef and the 2 initializers above are template-code one liners. The logic which automatically disables preemption upon entering a seqcount_ww_mutex_t write side critical section is also already shared with seqcount_mutex_t and any future, preemptible, associated lock. So, yes, dma-resv is the only user of seqcount_ww_mutex. But even in that case, given the one liner template code nature of seqcount_ww_mutex_t logic, it does not make sense to block the dma_resv and amdgpu change until at some point in the future the sequence counter is completely removed. **If and when** the sequence counter gets removed, please just remove the seqcount_ww_mutex_t data type with it. It will be extremely simple. > Regards, > Christian. > Thanks, -- Ahmed S. Darwish Linutronix GmbH _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex 2020-05-21 0:09 ` Ahmed S. Darwish @ 2020-05-21 13:20 ` Christian König 0 siblings, 0 replies; 6+ messages in thread From: Christian König @ 2020-05-21 13:20 UTC (permalink / raw) To: Ahmed S. Darwish, Christian König Cc: David (ChunMing) Zhou, dri-devel, Paul E. McKenney, Peter Zijlstra, Sebastian A. Siewior, LKML, amd-gfx, Sumit Semwal, David Airlie, Ingo Molnar, Steven Rostedt, Daniel Vetter, Alex Deucher, Thomas Gleixner, Will Deacon, Felix Kuehling, linux-media Am 21.05.20 um 02:09 schrieb Ahmed S. Darwish: > On Wed, May 20, 2020, Christian König wrote: >> Am 19.05.20 um 23:45 schrieb Ahmed S. Darwish: >>> A sequence counter write side critical section must be protected by some >>> form of locking to serialize writers. If the serialization primitive is >>> not disabling preemption implicitly, preemption has to be explicitly >>> disabled before entering the sequence counter write side critical >>> section. >>> >>> The dma-buf reservation subsystem uses plain sequence counters to manage >>> updates to reservations. Writer serialization is accomplished through a >>> wound/wait mutex. >>> >>> Acquiring a wound/wait mutex does not disable preemption, so this needs >>> to be done manually before and after the write side critical section. >>> >>> Use the newly-added seqcount_ww_mutex_t instead: >>> >>> - It associates the ww_mutex with the sequence count, which enables >>> lockdep to validate that the write side critical section is properly >>> serialized. >>> >>> - It removes the need to explicitly add preempt_disable/enable() >>> around the write side critical section because the write_begin/end() >>> functions for this new data type automatically do this. >>> >>> If lockdep is disabled this ww_mutex lock association is compiled out >>> and has neither storage size nor runtime overhead. >> Mhm, is the dma_resv object the only user of this new seqcount_ww_mutex >> variant ? >> >> If yes we are trying to get rid of this sequence counter for quite some >> time, so I would rather invest the additional time to finish this. >> > In this patch series, each extra "seqcount with associated lock" data > type costs us, exactly: > > - 1 typedef definition, seqcount_ww_mutex_t > - 1 static initializer, SEQCNT_WW_MUTEX_ZERO() > - 1 runtime initializer, seqcount_ww_mutex_init() > > Definitions for the typedef and the 2 initializers above are > template-code one liners. In this case I'm perfectly fine with this. > > The logic which automatically disables preemption upon entering a > seqcount_ww_mutex_t write side critical section is also already shared > with seqcount_mutex_t and any future, preemptible, associated lock. > > So, yes, dma-resv is the only user of seqcount_ww_mutex. > > But even in that case, given the one liner template code nature of > seqcount_ww_mutex_t logic, it does not make sense to block the dma_resv > and amdgpu change until at some point in the future the sequence counter > is completely removed. > > **If and when** the sequence counter gets removed, please just remove > the seqcount_ww_mutex_t data type with it. It will be extremely simple. Completely agree, just wanted to prevent that we now add a lot of code which gets removed again ~3 month from now. Regards, Christian. > >> Regards, >> Christian. >> > Thanks, > > -- > Ahmed S. Darwish > Linutronix GmbH _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
[parent not found: <20200608005729.1874024-1-a.darwish@linutronix.de>]
* [PATCH v2 06/18] dma-buf: Use sequence counter with associated wound/wait mutex [not found] ` <20200608005729.1874024-1-a.darwish@linutronix.de> @ 2020-06-08 0:57 ` Ahmed S. Darwish 2020-06-08 14:32 ` Daniel Vetter 0 siblings, 1 reply; 6+ messages in thread From: Ahmed S. Darwish @ 2020-06-08 0:57 UTC (permalink / raw) To: Peter Zijlstra, Ingo Molnar, Will Deacon Cc: David (ChunMing) Zhou, amd-gfx, Paul E. McKenney, David Airlie, Sebastian A. Siewior, LKML, Steven Rostedt, Christian König, dri-devel, Daniel Vetter, Ahmed S. Darwish, Alex Deucher, Felix Kuehling, Thomas Gleixner, Sumit Semwal A sequence counter write side critical section must be protected by some form of locking to serialize writers. If the serialization primitive is not disabling preemption implicitly, preemption has to be explicitly disabled before entering the sequence counter write side critical section. The dma-buf reservation subsystem uses plain sequence counters to manage updates to reservations. Writer serialization is accomplished through a wound/wait mutex. Acquiring a wound/wait mutex does not disable preemption, so this needs to be done manually before and after the write side critical section. Use the newly-added seqcount_ww_mutex_t instead: - It associates the ww_mutex with the sequence count, which enables lockdep to validate that the write side critical section is properly serialized. - It removes the need to explicitly add preempt_disable/enable() around the write side critical section because the write_begin/end() functions for this new data type automatically do this. If lockdep is disabled this ww_mutex lock association is compiled out and has neither storage size nor runtime overhead. Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de> --- drivers/dma-buf/dma-resv.c | 8 +------- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 -- include/linux/dma-resv.h | 2 +- 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c index 590ce7ad60a0..3aba2b2bfc48 100644 --- a/drivers/dma-buf/dma-resv.c +++ b/drivers/dma-buf/dma-resv.c @@ -128,7 +128,7 @@ subsys_initcall(dma_resv_lockdep); void dma_resv_init(struct dma_resv *obj) { ww_mutex_init(&obj->lock, &reservation_ww_class); - seqcount_init(&obj->seq); + seqcount_ww_mutex_init(&obj->seq, &obj->lock); RCU_INIT_POINTER(obj->fence, NULL); RCU_INIT_POINTER(obj->fence_excl, NULL); @@ -259,7 +259,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) fobj = dma_resv_get_list(obj); count = fobj->shared_count; - preempt_disable(); write_seqcount_begin(&obj->seq); for (i = 0; i < count; ++i) { @@ -281,7 +280,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) smp_store_mb(fobj->shared_count, count); write_seqcount_end(&obj->seq); - preempt_enable(); dma_fence_put(old); } EXPORT_SYMBOL(dma_resv_add_shared_fence); @@ -308,14 +306,12 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence) if (fence) dma_fence_get(fence); - preempt_disable(); write_seqcount_begin(&obj->seq); /* write_seqcount_begin provides the necessary memory barrier */ RCU_INIT_POINTER(obj->fence_excl, fence); if (old) old->shared_count = 0; write_seqcount_end(&obj->seq); - preempt_enable(); /* inplace update, no shared fences */ while (i--) @@ -393,13 +389,11 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src) src_list = dma_resv_get_list(dst); old = dma_resv_get_excl(dst); - preempt_disable(); write_seqcount_begin(&dst->seq); /* write_seqcount_begin provides the necessary memory barrier */ RCU_INIT_POINTER(dst->fence_excl, new); RCU_INIT_POINTER(dst->fence, dst_list); write_seqcount_end(&dst->seq); - preempt_enable(); dma_resv_list_free(src_list); dma_fence_put(old); diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 6a5b91d23fd9..c71c0bb6ce26 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -258,11 +258,9 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, new->shared_count = k; /* Install the new fence list, seqcount provides the barriers */ - preempt_disable(); write_seqcount_begin(&resv->seq); RCU_INIT_POINTER(resv->fence, new); write_seqcount_end(&resv->seq); - preempt_enable(); /* Drop the references to the removed fences or move them to ef_list */ for (i = j, k = 0; i < old->shared_count; ++i) { diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h index a6538ae7d93f..d44a77e8a7e3 100644 --- a/include/linux/dma-resv.h +++ b/include/linux/dma-resv.h @@ -69,7 +69,7 @@ struct dma_resv_list { */ struct dma_resv { struct ww_mutex lock; - seqcount_t seq; + seqcount_ww_mutex_t seq; struct dma_fence __rcu *fence_excl; struct dma_resv_list __rcu *fence; -- 2.20.1 _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 06/18] dma-buf: Use sequence counter with associated wound/wait mutex 2020-06-08 0:57 ` [PATCH v2 06/18] " Ahmed S. Darwish @ 2020-06-08 14:32 ` Daniel Vetter 0 siblings, 0 replies; 6+ messages in thread From: Daniel Vetter @ 2020-06-08 14:32 UTC (permalink / raw) To: Ahmed S. Darwish Cc: David (ChunMing) Zhou, amd-gfx, Paul E. McKenney, Peter Zijlstra, Sebastian A. Siewior, LKML, Steven Rostedt, Christian König, David Airlie, Ingo Molnar, dri-devel, Daniel Vetter, Alex Deucher, Felix Kuehling, Thomas Gleixner, Will Deacon, Sumit Semwal On Mon, Jun 08, 2020 at 02:57:17AM +0200, Ahmed S. Darwish wrote: > A sequence counter write side critical section must be protected by some > form of locking to serialize writers. If the serialization primitive is > not disabling preemption implicitly, preemption has to be explicitly > disabled before entering the sequence counter write side critical > section. > > The dma-buf reservation subsystem uses plain sequence counters to manage > updates to reservations. Writer serialization is accomplished through a > wound/wait mutex. > > Acquiring a wound/wait mutex does not disable preemption, so this needs > to be done manually before and after the write side critical section. > > Use the newly-added seqcount_ww_mutex_t instead: > > - It associates the ww_mutex with the sequence count, which enables > lockdep to validate that the write side critical section is properly > serialized. > > - It removes the need to explicitly add preempt_disable/enable() > around the write side critical section because the write_begin/end() > functions for this new data type automatically do this. > > If lockdep is disabled this ww_mutex lock association is compiled out > and has neither storage size nor runtime overhead. > > Signed-off-by: Ahmed S. Darwish <a.darwish@linutronix.de> I'm not seeing the patch that adds the seqcount ww_mutex glue and not quite motivated enough to grab it from lore, so someone else needs to check the details. Just Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> for merging through whatever tree/branch makes sense from me. -Daniel > --- > drivers/dma-buf/dma-resv.c | 8 +------- > drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 2 -- > include/linux/dma-resv.h | 2 +- > 3 files changed, 2 insertions(+), 10 deletions(-) > > diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c > index 590ce7ad60a0..3aba2b2bfc48 100644 > --- a/drivers/dma-buf/dma-resv.c > +++ b/drivers/dma-buf/dma-resv.c > @@ -128,7 +128,7 @@ subsys_initcall(dma_resv_lockdep); > void dma_resv_init(struct dma_resv *obj) > { > ww_mutex_init(&obj->lock, &reservation_ww_class); > - seqcount_init(&obj->seq); > + seqcount_ww_mutex_init(&obj->seq, &obj->lock); > > RCU_INIT_POINTER(obj->fence, NULL); > RCU_INIT_POINTER(obj->fence_excl, NULL); > @@ -259,7 +259,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) > fobj = dma_resv_get_list(obj); > count = fobj->shared_count; > > - preempt_disable(); > write_seqcount_begin(&obj->seq); > > for (i = 0; i < count; ++i) { > @@ -281,7 +280,6 @@ void dma_resv_add_shared_fence(struct dma_resv *obj, struct dma_fence *fence) > smp_store_mb(fobj->shared_count, count); > > write_seqcount_end(&obj->seq); > - preempt_enable(); > dma_fence_put(old); > } > EXPORT_SYMBOL(dma_resv_add_shared_fence); > @@ -308,14 +306,12 @@ void dma_resv_add_excl_fence(struct dma_resv *obj, struct dma_fence *fence) > if (fence) > dma_fence_get(fence); > > - preempt_disable(); > write_seqcount_begin(&obj->seq); > /* write_seqcount_begin provides the necessary memory barrier */ > RCU_INIT_POINTER(obj->fence_excl, fence); > if (old) > old->shared_count = 0; > write_seqcount_end(&obj->seq); > - preempt_enable(); > > /* inplace update, no shared fences */ > while (i--) > @@ -393,13 +389,11 @@ int dma_resv_copy_fences(struct dma_resv *dst, struct dma_resv *src) > src_list = dma_resv_get_list(dst); > old = dma_resv_get_excl(dst); > > - preempt_disable(); > write_seqcount_begin(&dst->seq); > /* write_seqcount_begin provides the necessary memory barrier */ > RCU_INIT_POINTER(dst->fence_excl, new); > RCU_INIT_POINTER(dst->fence, dst_list); > write_seqcount_end(&dst->seq); > - preempt_enable(); > > dma_resv_list_free(src_list); > dma_fence_put(old); > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index 6a5b91d23fd9..c71c0bb6ce26 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -258,11 +258,9 @@ static int amdgpu_amdkfd_remove_eviction_fence(struct amdgpu_bo *bo, > new->shared_count = k; > > /* Install the new fence list, seqcount provides the barriers */ > - preempt_disable(); > write_seqcount_begin(&resv->seq); > RCU_INIT_POINTER(resv->fence, new); > write_seqcount_end(&resv->seq); > - preempt_enable(); > > /* Drop the references to the removed fences or move them to ef_list */ > for (i = j, k = 0; i < old->shared_count; ++i) { > diff --git a/include/linux/dma-resv.h b/include/linux/dma-resv.h > index a6538ae7d93f..d44a77e8a7e3 100644 > --- a/include/linux/dma-resv.h > +++ b/include/linux/dma-resv.h > @@ -69,7 +69,7 @@ struct dma_resv_list { > */ > struct dma_resv { > struct ww_mutex lock; > - seqcount_t seq; > + seqcount_ww_mutex_t seq; > > struct dma_fence __rcu *fence_excl; > struct dma_resv_list __rcu *fence; > -- > 2.20.1 > -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ amd-gfx mailing list amd-gfx@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/amd-gfx ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2020-06-08 14:32 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20200519214547.352050-1-a.darwish@linutronix.de>
2020-05-19 21:45 ` [PATCH v1 13/25] dma-buf: Use sequence counter with associated wound/wait mutex Ahmed S. Darwish
2020-05-20 10:48 ` Christian König
2020-05-21 0:09 ` Ahmed S. Darwish
2020-05-21 13:20 ` Christian König
[not found] ` <20200608005729.1874024-1-a.darwish@linutronix.de>
2020-06-08 0:57 ` [PATCH v2 06/18] " Ahmed S. Darwish
2020-06-08 14:32 ` Daniel Vetter
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox