[PATCH 1/2] drm/amdgpu: drop volatile from ring buffer

Khatri, Sunil sunil.khatri at amd.com
Tue Oct 8 18:38:26 UTC 2024


Reviewed-by: Sunil Khatri <sunil.khatri at amd.com>

On 10/8/2024 11:41 PM, Christian König wrote:
> Volatile only prevents the compiler from re-ordering reads and writes.
> Since we always only modify the ring buffer from one CPU thread and have
> an explicit barrier before signaling the HW this should have no effect at
> all and just prevents compiler optimisations.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c | 10 +++-------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h | 11 ++++-------
>   2 files changed, 7 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> index 910293664902..a6e28fe3f8d6 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
> @@ -109,21 +109,17 @@ int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned int ndw)
>   void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count)
>   {
>   	uint32_t occupied, chunk1, chunk2;
> -	uint32_t *dst;
>   
>   	occupied = ring->wptr & ring->buf_mask;
> -	dst = &ring->ring[occupied];
>   	chunk1 = ring->buf_mask + 1 - occupied;
>   	chunk1 = (chunk1 >= count) ? count : chunk1;
>   	chunk2 = count - chunk1;
>   
>   	if (chunk1)
> -		memset32(dst, ring->funcs->nop, chunk1);
> +		memset32(&ring->ring[occupied], ring->funcs->nop, chunk1);
>   
> -	if (chunk2) {
> -		dst = ring->ring;
> -		memset32(dst, ring->funcs->nop, chunk2);
> -	}
> +	if (chunk2)
> +		memset32(ring->ring, ring->funcs->nop, chunk2);
>   
>   	ring->wptr += count;
>   	ring->wptr &= ring->ptr_mask;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> index 574336d6714a..36fc9578c53c 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
> @@ -246,7 +246,7 @@ struct amdgpu_ring {
>   	struct drm_gpu_scheduler	sched;
>   
>   	struct amdgpu_bo	*ring_obj;
> -	volatile uint32_t	*ring;
> +	uint32_t		*ring;
>   	unsigned		rptr_offs;
>   	u64			rptr_gpu_addr;
>   	volatile u32		*rptr_cpu_addr;
> @@ -288,7 +288,7 @@ struct amdgpu_ring {
>   	u64			cond_exe_gpu_addr;
>   	volatile u32		*cond_exe_cpu_addr;
>   	unsigned int		set_q_mode_offs;
> -	volatile u32		*set_q_mode_ptr;
> +	u32			*set_q_mode_ptr;
>   	u64			set_q_mode_token;
>   	unsigned		vm_hub;
>   	unsigned		vm_inv_eng;
> @@ -386,10 +386,8 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
>   					      void *src, int count_dw)
>   {
>   	unsigned occupied, chunk1, chunk2;
> -	void *dst;
>   
>   	occupied = ring->wptr & ring->buf_mask;
> -	dst = (void *)&ring->ring[occupied];
>   	chunk1 = ring->buf_mask + 1 - occupied;
>   	chunk1 = (chunk1 >= count_dw) ? count_dw : chunk1;
>   	chunk2 = count_dw - chunk1;
> @@ -397,12 +395,11 @@ static inline void amdgpu_ring_write_multiple(struct amdgpu_ring *ring,
>   	chunk2 <<= 2;
>   
>   	if (chunk1)
> -		memcpy(dst, src, chunk1);
> +		memcpy(&ring->ring[occupied], src, chunk1);
>   
>   	if (chunk2) {
>   		src += chunk1;
> -		dst = (void *)ring->ring;
> -		memcpy(dst, src, chunk2);
> +		memcpy(ring->ring, src, chunk2);
>   	}
>   
>   	ring->wptr += count_dw;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/amd-gfx/attachments/20241009/8f6c3e4d/attachment-0001.htm>


More information about the amd-gfx mailing list