lkml.org 
[lkml]   [2018]   [Mar]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 042/190] tools/testing/nvdimm: fix nfit_test shutdown crash
    Date
    From: Dan Williams <dan.j.williams@intel.com>

    [ Upstream commit 8b06b884cd98f7ec8b5028680b99fabfb7b3e192 ]

    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: Linda Knippers <linda.knippers@hpe.com>
    Signed-off-by: Dan Williams <dan.j.williams@intel.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    tools/testing/nvdimm/test/nfit.c | 10 +++++++++-
    1 file changed, 9 insertions(+), 1 deletion(-)

    diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
    index 71620fa95953..d025eafc09c2 100644
    --- a/tools/testing/nvdimm/test/nfit.c
    +++ b/tools/testing/nvdimm/test/nfit.c
    @@ -1908,6 +1908,7 @@ static __init int nfit_test_init(void)
    put_device(&pdev->dev);
    goto err_register;
    }
    + get_device(&pdev->dev);

    rc = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
    if (rc)
    @@ -1926,6 +1927,10 @@ static __init int nfit_test_init(void)
    if (instances[i])
    platform_device_unregister(&instances[i]->pdev);
    nfit_test_teardown();
    + for (i = 0; i < NUM_NFITS; i++)
    + if (instances[i])
    + put_device(&instances[i]->pdev.dev);
    +
    return rc;
    }

    @@ -1933,10 +1938,13 @@ static __exit void nfit_test_exit(void)
    {
    int i;

    - platform_driver_unregister(&nfit_test_driver);
    for (i = 0; i < NUM_NFITS; i++)
    platform_device_unregister(&instances[i]->pdev);
    + platform_driver_unregister(&nfit_test_driver);
    nfit_test_teardown();
    +
    + for (i = 0; i < NUM_NFITS; i++)
    + put_device(&instances[i]->pdev.dev);
    class_destroy(nfit_test_dimm);
    }

    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-08 07:22    [W:3.156 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site