Commit 8b06b884 authored by Dan Williams's avatar Dan Williams

tools/testing/nvdimm: fix nfit_test shutdown crash

Keep the nfit_test instances alive until after nfit_test_teardown(), as
we may be doing resource lookups until the final un-registrations have
completed. This fixes crashes of the form.

 BUG: unable to handle kernel NULL pointer dereference at 0000000000000038
 IP: __release_resource+0x12/0x90
 Call Trace:
  remove_resource+0x23/0x40
  __wrap_remove_resource+0x29/0x30 [nfit_test_iomap]
  acpi_nfit_remove_resource+0xe/0x10 [nfit]
  devm_action_release+0xf/0x20
  release_nodes+0x16d/0x2b0
  devres_release_all+0x3c/0x60
  device_release+0x21/0x90
  kobject_release+0x6a/0x170
  kobject_put+0x2f/0x60
  put_device+0x17/0x20
  platform_device_unregister+0x20/0x30
  nfit_test_exit+0x36/0x960 [nfit_test]
Reported-by: default avatarLinda Knippers <linda.knippers@hpe.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 9ccaed4b
...@@ -1958,6 +1958,7 @@ static __init int nfit_test_init(void) ...@@ -1958,6 +1958,7 @@ static __init int nfit_test_init(void)
put_device(&pdev->dev); put_device(&pdev->dev);
goto err_register; goto err_register;
} }
get_device(&pdev->dev);
rc = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); rc = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
if (rc) if (rc)
...@@ -1976,6 +1977,10 @@ static __init int nfit_test_init(void) ...@@ -1976,6 +1977,10 @@ static __init int nfit_test_init(void)
if (instances[i]) if (instances[i])
platform_device_unregister(&instances[i]->pdev); platform_device_unregister(&instances[i]->pdev);
nfit_test_teardown(); nfit_test_teardown();
for (i = 0; i < NUM_NFITS; i++)
if (instances[i])
put_device(&instances[i]->pdev.dev);
return rc; return rc;
} }
...@@ -1983,10 +1988,13 @@ static __exit void nfit_test_exit(void) ...@@ -1983,10 +1988,13 @@ static __exit void nfit_test_exit(void)
{ {
int i; int i;
platform_driver_unregister(&nfit_test_driver);
for (i = 0; i < NUM_NFITS; i++) for (i = 0; i < NUM_NFITS; i++)
platform_device_unregister(&instances[i]->pdev); platform_device_unregister(&instances[i]->pdev);
platform_driver_unregister(&nfit_test_driver);
nfit_test_teardown(); nfit_test_teardown();
for (i = 0; i < NUM_NFITS; i++)
put_device(&instances[i]->pdev.dev);
class_destroy(nfit_test_dimm); class_destroy(nfit_test_dimm);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment