Can no longer shutdown after drm/radeon: Implement radeon_pci_shutdown

Deucher, Alexander Alexander.Deucher at amd.com
Wed Dec 11 19:27:31 PST 2013


> -----Original Message-----
> From: Markus Trippelsdorf [mailto:markus at trippelsdorf.de]
> Sent: Wednesday, December 11, 2013 9:58 PM
> To: Deucher, Alexander
> Cc: Peter Chubb; airlied at linux.ie; dri-devel at lists.freedesktop.org
> Subject: Re: Can no longer shutdown after drm/radeon: Implement
> radeon_pci_shutdown
> 
> On 2013.12.11 at 23:46 +0000, Deucher, Alexander wrote:
> > > -----Original Message-----
> > > From: Peter Chubb [mailto:peter.chubb at nicta.com.au]
> > > Sent: Wednesday, December 11, 2013 5:11 PM
> > > To: Markus Trippelsdorf
> > > Cc: Peter Chubb; Deucher, Alexander; airlied at linux.ie; dri-
> > > devel at lists.freedesktop.org
> > > Subject: Re: Can no longer shutdown after drm/radeon: Implement
> > > radeon_pci_shutdown
> > >
> > > >>>>> "Markus" == Markus Trippelsdorf <markus at trippelsdorf.de>
> writes:
> > >
> > > Markus> On 2013.12.11 at 11:37 +1100, Peter Chubb wrote:
> > >
> > > Markus> It would be interesting to know where exactly it hangs.  Could
> > > Markus> you comment out the *_fini(rdev) calls in
> > > Markus> radeon_driver_unload_kms
> > > (drivers/gpu/drm/radeon/radeon_kms.c)
> > > Markus> one after the other to find out which one is responsible?
> > >
> > > It's radeon_device_fini() that is the problem.
> >
> > I think the problem is that the drm subsystem tears down the device
> > via drm_driver.unload in drm_dev_unregister(), but now that we have a
> > pci_driver.shutdown callback (which is needed for kexec) that gets
> > called too so the driver gets torn down twice.
> 
> If that is the case the following patch should fix the issue.
> Can you give it a try, Peter?

That may work, but I think it's just papering over a race which may still bite someone else depending on the timing.

Alex

> 
> diff --git a/drivers/gpu/drm/radeon/radeon_kms.c
> b/drivers/gpu/drm/radeon/radeon_kms.c
> index 55d0b474bd37..539e5f1ff5e3 100644
> --- a/drivers/gpu/drm/radeon/radeon_kms.c
> +++ b/drivers/gpu/drm/radeon/radeon_kms.c
> @@ -59,7 +59,8 @@ int radeon_driver_unload_kms(struct drm_device
> *dev)
>  	radeon_acpi_fini(rdev);
> 
>  	radeon_modeset_fini(rdev);
> -	radeon_device_fini(rdev);
> +	if (!rdev->shutdown)
> +		radeon_device_fini(rdev);
> 
>  done_free:
>  	kfree(rdev);
> --
> Markus




More information about the dri-devel mailing list