Re: [PATCH v2] drm/amdgpu: reject oversized IBs with per-ring packet limits
Alex Deucher <[email protected]> Mon, 3 Aug 2026 09:59:46 -0400
| Newsgroups | org.freedesktop.lists.amd-gfx |
|---|---|
| Message-ID | <CADnq5_ONAK8PdFjTE85A6kCNTJ96bOiybMek_GgPKBL=yqHqVg@mail.gmail.com> |
On Mon, Aug 3, 2026 at 6:33=E2=80=AFAM Candice Li <[email protected]> wrot= e: > > On GFX rings, amdgpu_cs_p2_ib() passed user-supplied ib_bytes through > to ib->length_dw without a limit, while ring_emit_ib() encodes length > into packet fields. Oversized values can corrupt adjacent control bits > and destabilize command submission. > > Add a per-ring IB packet size limit helper and reject command > submissions exceeding the corresponding dword limit before IB > allocation. Use the documented 20-bit limit for GFX/compute/SDMA/VPE, > and apply the MM fallback limit for other ring types. > > Signed-off-by: Candice Li <[email protected]> Would be good to also enforce the ib length mask in the packet functions as well as a follow up patch series. This patch is: Reviewed-by: Alex Deucher <[email protected]> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 27 +++++++++++++++++++++++++- > 1 file changed, 26 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd= /amdgpu/amdgpu_cs.c > index afc1c631d55aa6..617f53f135f353 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c > @@ -42,6 +42,26 @@ > #include "amdgpu_ras.h" > #include "amdgpu_hmm.h" > > +/* > + * Maximum IB length (dwords) for rings whose emit_ib packet format > + * documents a 20-bit size field. > + */ > +#define AMDGPU_GFX_SDMA_IB_PACKET_SIZE_MAX_DW 0xFFFFF > +#define AMDGPU_MM_IB_PACKET_SIZE_MAX_DW 0x7FFFF0 > + > +static u32 amdgpu_cs_ib_packet_size_max_dw(enum amdgpu_ring_type type) > +{ > + switch (type) { > + case AMDGPU_RING_TYPE_GFX: > + case AMDGPU_RING_TYPE_COMPUTE: > + case AMDGPU_RING_TYPE_SDMA: > + case AMDGPU_RING_TYPE_VPE: > + return AMDGPU_GFX_SDMA_IB_PACKET_SIZE_MAX_DW; > + default: > + return AMDGPU_MM_IB_PACKET_SIZE_MAX_DW; > + } > +} > + > static int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, > struct amdgpu_device *adev, > struct drm_file *filp, > @@ -340,7 +360,6 @@ static int amdgpu_cs_p2_ib(struct amdgpu_cs_parser *p= , > > job =3D p->jobs[r]; > ring =3D amdgpu_job_ring(job); > - ib =3D &job->ibs[job->num_ibs++]; > > /* submissions to kernel queues are disabled */ > if (ring->no_user_submission) > @@ -369,6 +388,12 @@ static int amdgpu_cs_p2_ib(struct amdgpu_cs_parser *= p, > return -EINVAL; > } > > + if (chunk_ib->ib_bytes / 4 > > + amdgpu_cs_ib_packet_size_max_dw(ring->funcs->type)) > + return -EINVAL; > + > + ib =3D &job->ibs[job->num_ibs++]; > + > if (chunk_ib->flags & AMDGPU_IB_FLAG_PREAMBLE) > job->preamble_status |=3D AMDGPU_PREAMBLE_IB_PRESENT; > > -- > 2.50.1 >