Message ID | 84mwk86x5a.wl%peter.chubb@nicta.com.au (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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?
>>>>> "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
> -----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
>>>>> "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
--- 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.