[PATCH xf86-video-amdgpu] amdgpu_probe: Do not close server managed drm fds
Michel Dänzer
michel at daenzer.net
Wed Oct 19 02:42:32 UTC 2016
[ Moving to the amd-gfx mailing list, where xf86-video-amdgpu (and -ati)
patches are reviewed ]
On 18/10/16 11:48 PM, Hans de Goede wrote:
> This fixes the xserver only seeing AMD/ATI devices supported by the amdgpu
> driver, as by the time xf86-video-ati gets a chance to probe them, the
> fd has been closed.
That basically makes sense, but I have one question: Why does amdgpu get
probed in the first place in that case? I was under the impression that
this should only happen for GPUs bound to the amdgpu kernel driver, due
to Section "OutputClass" in /usr/share/X11/xorg.conf.d/10-amdgpu.conf .
> diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c
> index 213d245..5d17fe5 100644
> --- a/src/amdgpu_probe.c
> +++ b/src/amdgpu_probe.c
> @@ -142,6 +142,15 @@ static int amdgpu_kernel_open_fd(ScrnInfoPtr pScrn, char *busid,
> return fd;
> }
>
> +static void amdgpu_kernel_close_fd(AMDGPUEntPtr pAMDGPUEnt)
> +{
> +#ifdef XF86_PDEV_SERVER_FD
> + if (!(pAMDGPUEnt->platform_dev &&
> + pAMDGPUEnt->platform_dev->flags & XF86_PDEV_SERVER_FD))
> +#endif
> + drmClose(pAMDGPUEnt->fd);
> +}
AMDGPUFreeRec could also be refactored to call this function.
> @@ -164,7 +173,7 @@ static Bool amdgpu_open_drm_master(ScrnInfoPtr pScrn, AMDGPUEntPtr pAMDGPUEnt,
> if (err != 0) {
> xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
> "[drm] failed to set drm interface version.\n");
> - drmClose(pAMDGPUEnt->fd);
> + amdgpu_kernel_close_fd(pAMDGPUEnt);
> return FALSE;
> }
> @@ -252,7 +261,7 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
> return TRUE;
>
> error_amdgpu:
> - drmClose(pAMDGPUEnt->fd);
> + amdgpu_kernel_close_fd(pAMDGPUEnt);
> error_fd:
> free(pPriv->ptr);
> error:
These two hunks aren't really necessary, right? These only get called
from amdgpu_pci_probe, in which case pAMDGPUEnt->platform_dev remains NULL.
> @@ -347,6 +356,7 @@ amdgpu_platform_probe(DriverPtr pDriver,
>
> pPriv->ptr = xnfcalloc(sizeof(AMDGPUEntRec), 1);
> pAMDGPUEnt = pPriv->ptr;
> + pAMDGPUEnt->platform_dev = dev;
> pAMDGPUEnt->fd = amdgpu_kernel_open_fd(pScrn, busid, dev);
> if (pAMDGPUEnt->fd < 0)
> goto error_fd;
> @@ -365,7 +375,6 @@ amdgpu_platform_probe(DriverPtr pDriver,
> pAMDGPUEnt = pPriv->ptr;
> pAMDGPUEnt->fd_ref++;
> }
> - pAMDGPUEnt->platform_dev = dev;
>
> xf86SetEntityInstanceForScreen(pScrn, pEnt->index,
> xf86GetNumEntityInstances(pEnt->
These two hunks aren't really necessary either, are they?
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
More information about the xorg-devel
mailing list