[5.12 regression] ttm->pages NULL dereference with radeon driver
Christian König
ckoenig.leichtzumerken at gmail.com
Fri May 7 15:11:53 UTC 2021
Hi Takashi,
Am 07.05.21 um 17:08 schrieb Takashi Iwai:
> Hi,
>
> we've received a regression report showing NULL dereference Oops with
> radeon driver on 5.12 kernel:
> https://bugzilla.opensuse.org/show_bug.cgi?id=1185516
>
> It turned out that the recent TTM cleanup / refactoring via commit
> 0575ff3d33cd ("drm/radeon: stop using pages with
> drm_prime_sg_to_page_addr_arrays v2") is the culprit. On 5.12 kernel,
> ttm->pages is no longer allocated / set up, while the radeon driver
> still has a few places assuming the valid ttm->pages, and for the
> reporter (running the modesettig driver), radeon_gart_bind() hits the
> problem.
>
> A hackish patch below was confirmed to work, at least, but obviously
> we need a proper fix.
>
> Could you take a look at it?
If that's all then that looks trivial to me.
Going to provide a patch on Monday.
Thanks for the notice,
Christian.
>
>
> thanks,
>
> Takashi
>
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -253,7 +253,7 @@ void radeon_gart_unbind(struct radeon_de
> t = offset / RADEON_GPU_PAGE_SIZE;
> p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
> for (i = 0; i < pages; i++, p++) {
> - if (rdev->gart.pages[p]) {
> + if (1 /*rdev->gart.pages[p]*/) {
> rdev->gart.pages[p] = NULL;
> for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
> rdev->gart.pages_entry[t] = rdev->dummy_page.entry;
> @@ -301,7 +301,7 @@ int radeon_gart_bind(struct radeon_devic
> p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
>
> for (i = 0; i < pages; i++, p++) {
> - rdev->gart.pages[p] = pagelist[i];
> + /* rdev->gart.pages[p] = pagelist[i]; */
> page_base = dma_addr[i];
> for (j = 0; j < (PAGE_SIZE / RADEON_GPU_PAGE_SIZE); j++, t++) {
> page_entry = radeon_gart_get_page_entry(page_base, flags);
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -360,6 +360,8 @@ static int radeon_ttm_tt_pin_userptr(str
>
> if (current->mm != gtt->usermm)
> return -EPERM;
> + if (!ttm->pages)
> + return -EPERM;
>
> if (gtt->userflags & RADEON_GEM_USERPTR_ANONONLY) {
> /* check that we only pin down anonymous memory
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list