On Wed, Jan 29, 2025 at 7:12 PM Philip Yang <Philip.Yang@xxxxxxx> wrote: > > To workaround queue full h/w issue on Gfx7/8, when application create > AQL queues, the ring buffer bo allocate size is queue_size/2 and > mapped to GPU twice using 2 attachments with same ring_bo backing > memory. > > For this case, user queue buffer validation should use queue_size/2 to > verify ring_bo allocation and mapping size. > > Fixes: 68e599db7a54 ("drm/amdkfd: Validate user queue buffers") > Suggested-by: Tomáš Trnka <trnka@xxxxxxx> > Signed-off-by: Philip Yang <Philip.Yang@xxxxxxx> Acked-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/amdkfd/kfd_queue.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_queue.c > index ecccd7adbab4..62c635e9d1aa 100644 > --- a/drivers/gpu/drm/amd/amdkfd/kfd_queue.c > +++ b/drivers/gpu/drm/amd/amdkfd/kfd_queue.c > @@ -233,6 +233,7 @@ void kfd_queue_buffer_put(struct amdgpu_bo **bo) > int kfd_queue_acquire_buffers(struct kfd_process_device *pdd, struct queue_properties *properties) > { > struct kfd_topology_device *topo_dev; > + u64 expected_queue_size; > struct amdgpu_vm *vm; > u32 total_cwsr_size; > int err; > @@ -241,6 +242,15 @@ int kfd_queue_acquire_buffers(struct kfd_process_device *pdd, struct queue_prope > if (!topo_dev) > return -EINVAL; > > + /* AQL queues on GFX7 and GFX8 appear twice their actual size */ > + if (properties->type == KFD_QUEUE_TYPE_COMPUTE && > + properties->format == KFD_QUEUE_FORMAT_AQL && > + topo_dev->node_props.gfx_target_version >= 70000 && > + topo_dev->node_props.gfx_target_version < 90000) > + expected_queue_size = properties->queue_size / 2; > + else > + expected_queue_size = properties->queue_size; > + > vm = drm_priv_to_vm(pdd->drm_priv); > err = amdgpu_bo_reserve(vm->root.bo, false); > if (err) > @@ -255,7 +265,7 @@ int kfd_queue_acquire_buffers(struct kfd_process_device *pdd, struct queue_prope > goto out_err_unreserve; > > err = kfd_queue_buffer_get(vm, (void *)properties->queue_address, > - &properties->ring_bo, properties->queue_size); > + &properties->ring_bo, expected_queue_size); > if (err) > goto out_err_unreserve; > > -- > 2.47.1 >