diff mbox

Can no longer shutdown after drm/radeon: Implement radeon_pci_shutdown

Message ID 84mwk86x5a.wl%peter.chubb@nicta.com.au (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Chubb Dec. 11, 2013, 12:37 a.m. UTC
On my HP Elitebook 8740w qith a Mobility Radeon HD 5870
commit 846ae41ae99d314bf2a02784152208a6ddf7eddc
breaks shutdown.  The machine hangs when trying to shutdown, kexec or
hibernate, before seeing the usual `machine halted' (or whatever) message.

If I comment out thus:

index 9f5ff28..40bff3c 100644

--
Dr Peter Chubb				        peter.chubb AT nicta.com.au
http://www.ssrg.nicta.com.au          Software Systems Research Group/NICTA

Comments

Markus Trippelsdorf Dec. 11, 2013, 7:26 a.m. UTC | #1
On 2013.12.11 at 11:37 +1100, Peter Chubb wrote:
> On my HP Elitebook 8740w qith a Mobility Radeon HD 5870
> commit 846ae41ae99d314bf2a02784152208a6ddf7eddc
> breaks shutdown.  The machine hangs when trying to shutdown, kexec or
> hibernate, before seeing the usual `machine halted' (or whatever) message.
> 
> If I comment out thus:
> 
> index 9f5ff28..40bff3c 100644
> --- a/drivers/gpu/drm/radeon/radeon_drv.c
> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
> @@ -514,7 +514,7 @@ radeon_pci_shutdown(struct pci_dev *pdev)
>  {
>  	struct drm_device *dev = pci_get_drvdata(pdev);
>  
> -	radeon_driver_unload_kms(dev);
> +	/*radeon_driver_unload_kms(dev);*/
>  }
>  
> then everything works again.  Thsi is obviously not the proper fix.

It would be interesting to know where exactly it hangs.
Could you comment out the *_fini(rdev) calls in radeon_driver_unload_kms
(drivers/gpu/drm/radeon/radeon_kms.c) one after the other to find out
which one is responsible?
Peter Chubb Dec. 11, 2013, 10:11 p.m. UTC | #2
>>>>> "Markus" == Markus Trippelsdorf <markus@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.
--
Dr Peter Chubb				        peter.chubb AT nicta.com.au
http://www.ssrg.nicta.com.au          Software Systems Research Group/NICTA
Alex Deucher Dec. 11, 2013, 11:46 p.m. UTC | #3
> -----Original Message-----
> From: Peter Chubb [mailto:peter.chubb@nicta.com.au]
> Sent: Wednesday, December 11, 2013 5:11 PM
> To: Markus Trippelsdorf
> Cc: Peter Chubb; Deucher, Alexander; airlied@linux.ie; dri-
> devel@lists.freedesktop.org
> Subject: Re: Can no longer shutdown after drm/radeon: Implement
> radeon_pci_shutdown
> 
> >>>>> "Markus" == Markus Trippelsdorf <markus@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.  What exactly happens when you say it's broken?

Alex
Peter Chubb Dec. 12, 2013, 12:04 a.m. UTC | #4
>>>>> "Deucher," == Deucher, Alexander <Alexander.Deucher@amd.com> writes:

>> 
>> >>>>> "Markus" == Markus Trippelsdorf <markus@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.

Deucher,> I think the problem is that the drm subsystem tears down the
Deucher,> device via drm_driver.unload in drm_dev_unregister(), but
Deucher,> now that we have a pci_driver.shutdown callback (which is
Deucher,> needed for kexec) that gets called too so the driver gets
Deucher,> torn down twice.  What exactly happens when you say it's
Deucher,> broken?

The machine hangs, with blank screen, getting hotter and hotter with
the fan screaming.  Magic sysrq does nothing.  Power button sometimes
works and sometimes does nothing.  The only sure way out is to take the
battery out of the laptop.

--
Dr Peter Chubb				        peter.chubb AT nicta.com.au
http://www.ssrg.nicta.com.au          Software Systems Research Group/NICTA
diff mbox

Patch

--- a/drivers/gpu/drm/radeon/radeon_drv.c
+++ b/drivers/gpu/drm/radeon/radeon_drv.c
@@ -514,7 +514,7 @@  radeon_pci_shutdown(struct pci_dev *pdev)
 {
 	struct drm_device *dev = pci_get_drvdata(pdev);
 
-	radeon_driver_unload_kms(dev);
+	/*radeon_driver_unload_kms(dev);*/
 }
 
then everything works again.  Thsi is obviously not the proper fix.