13 Jan, 2019

2 commits

  • commit a95c90f1e2c253b280385ecf3d4ebfe476926b28 upstream.

    The last step before devm_memremap_pages() returns success is to allocate
    a release action, devm_memremap_pages_release(), to tear the entire setup
    down. However, the result from devm_add_action() is not checked.

    Checking the error from devm_add_action() is not enough. The api
    currently relies on the fact that the percpu_ref it is using is killed by
    the time the devm_memremap_pages_release() is run. Rather than continue
    this awkward situation, offload the responsibility of killing the
    percpu_ref to devm_memremap_pages_release() directly. This allows
    devm_memremap_pages() to do the right thing relative to init failures and
    shutdown.

    Without this change we could fail to register the teardown of
    devm_memremap_pages(). The likelihood of hitting this failure is tiny as
    small memory allocations almost always succeed. However, the impact of
    the failure is large given any future reconfiguration, or disable/enable,
    of an nvdimm namespace will fail forever as subsequent calls to
    devm_memremap_pages() will fail to setup the pgmap_radix since there will
    be stale entries for the physical address range.

    An argument could be made to require that the ->kill() operation be set in
    the @pgmap arg rather than passed in separately. However, it helps code
    readability, tracking the lifetime of a given instance, to be able to grep
    the kill routine directly at the devm_memremap_pages() call site.

    Link: http://lkml.kernel.org/r/154275558526.76910.7535251937849268605.stgit@dwillia2-desk3.amr.corp.intel.com
    Signed-off-by: Dan Williams
    Fixes: e8d513483300 ("memremap: change devm_memremap_pages interface...")
    Reviewed-by: "Jérôme Glisse"
    Reported-by: Logan Gunthorpe
    Reviewed-by: Logan Gunthorpe
    Reviewed-by: Christoph Hellwig
    Cc: Balbir Singh
    Cc: Michal Hocko
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Dan Williams
     
  • commit 808153e1187fa77ac7d7dad261ff476888dcf398 upstream.

    devm_memremap_pages() is a facility that can create struct page entries
    for any arbitrary range and give drivers the ability to subvert core
    aspects of page management.

    Specifically the facility is tightly integrated with the kernel's memory
    hotplug functionality. It injects an altmap argument deep into the
    architecture specific vmemmap implementation to allow allocating from
    specific reserved pages, and it has Linux specific assumptions about page
    structure reference counting relative to get_user_pages() and
    get_user_pages_fast(). It was an oversight and a mistake that this was
    not marked EXPORT_SYMBOL_GPL from the outset.

    Again, devm_memremap_pagex() exposes and relies upon core kernel internal
    assumptions and will continue to evolve along with 'struct page', memory
    hotplug, and support for new memory types / topologies. Only an in-kernel
    GPL-only driver is expected to keep up with this ongoing evolution. This
    interface, and functionality derived from this interface, is not suitable
    for kernel-external drivers.

    Link: http://lkml.kernel.org/r/154275557457.76910.16923571232582744134.stgit@dwillia2-desk3.amr.corp.intel.com
    Signed-off-by: Dan Williams
    Reviewed-by: Christoph Hellwig
    Acked-by: Michal Hocko
    Cc: "Jérôme Glisse"
    Cc: Balbir Singh
    Cc: Logan Gunthorpe
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds
    Signed-off-by: Greg Kroah-Hartman

    Dan Williams
     

21 Dec, 2018

1 commit

  • [ Upstream commit e3f5df762d4a6ef6326c3c09bc9f89ea8a2eab2c ]

    In preparation for libnvdimm growing new restrictions to detect section
    conflicts between persistent memory regions, enable nfit_test to
    allocate aligned resources. Use a gen_pool to allocate nfit_test's fake
    resources in a separate address space from the virtual translation of
    the same.

    Reviewed-by: Vishal Verma
    Tested-by: Vishal Verma
    Signed-off-by: Dan Williams
    Signed-off-by: Sasha Levin

    Dan Williams
     

01 Dec, 2018

1 commit

  • [ Upstream commit af31b04b67f4fd7f639fd465a507c154c46fc9fb ]

    KASAN reports following global out of bounds access while
    nfit_test is being loaded. The out of bound access happens
    the following reference to dimm_fail_cmd_flags[dimm]. 'dimm' is
    over than the index value, NUM_DCR (==5).

    static int override_return_code(int dimm, unsigned int func, int rc)
    {
    if ((1 << func) & dimm_fail_cmd_flags[dimm]) {

    dimm_fail_cmd_flags[] definition:
    static unsigned long dimm_fail_cmd_flags[NUM_DCR];

    'dimm' is the return value of get_dimm(), and get_dimm() returns
    the index of handle[] array. The handle[] has 7 index. Let's use
    ARRAY_SIZE(handle) as the array size.

    KASAN report:

    ==================================================================
    BUG: KASAN: global-out-of-bounds in nfit_test_ctl+0x47bb/0x55b0 [nfit_test]
    Read of size 8 at addr ffffffffc10cbbe8 by task kworker/u41:0/8
    ...
    Call Trace:
    dump_stack+0xea/0x1b0
    ? dump_stack_print_info.cold.0+0x1b/0x1b
    ? kmsg_dump_rewind_nolock+0xd9/0xd9
    print_address_description+0x65/0x22e
    ? nfit_test_ctl+0x47bb/0x55b0 [nfit_test]
    kasan_report.cold.6+0x92/0x1a6
    nfit_test_ctl+0x47bb/0x55b0 [nfit_test]
    ...
    The buggy address belongs to the variable:
    dimm_fail_cmd_flags+0x28/0xffffffffffffa440 [nfit_test]
    ==================================================================

    Fixes: 39611e83a28c ("tools/testing/nvdimm: Make DSM failure code injection...")
    Signed-off-by: Masayoshi Mizuma
    Signed-off-by: Dan Williams
    Signed-off-by: Sasha Levin

    Masayoshi Mizuma
     

01 Aug, 2018

1 commit

  • The emulation for smart injection commands for nfit neglected to check
    the smart field validity flags before injecting to that field. This is
    required as a way to distinguish un-injection vs. leave-alone.

    The emulation was also missing support for un-injection entirely. To add
    this support, first, fix the above flags check. Second, use the
    'enable' field in the injection command to determine injection vs
    un-injection. Third, move the smart initialization struct to be a global
    static structure for the nfit_test module. Reference this to get the
    smart 'defaults' when un-injecting a smart field.

    Signed-off-by: Vishal Verma
    Signed-off-by: Dave Jiang

    Vishal Verma
     

31 Jul, 2018

1 commit

  • The mock / test version of pmem_direct_access() needs to check the
    validity of pointers kaddr and pfn for NULL assignment. If anyone
    equals to NULL, it doesn't need to calculate the value.

    If pointer equals to NULL, that is to say callers may have no need for
    kaddr or pfn, so this patch is prepared for allowing them to pass in
    NULL instead of having to pass in a local pointer or variable that
    they then just throw away.

    Suggested-by: Dan Williams
    Signed-off-by: Huaisheng Ye
    Reviewed-by: Ross Zwisler
    Signed-off-by: Dave Jiang

    Huaisheng Ye
     

15 Jul, 2018

2 commits


01 Jul, 2018

1 commit

  • Commit 546eb0317cfa "libnvdimm, pmem: Do not flush power-fail protected CPU caches"
    fixed the write_cache detection to correctly show the lack of a write
    cache based on the platform capabilities described in the ACPI NFIT. The
    nfit_test unit tests expected a write cache to be present, so change the
    nfit test namespaces to only advertise a persistence domain limited to
    the memory controller. This allows the kernel to show a write_cache
    attribute, and the test behaviour remains unchanged.

    Signed-off-by: Vishal Verma
    Reviewed-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Vishal Verma
     

23 May, 2018

1 commit

  • Given the fact that the ACPI "EINJ" (error injection) facility is not
    universally available, implement software infrastructure to validate the
    memcpy_mcsafe() exception handling implementation.

    For each potential read exception point in memcpy_mcsafe(), inject a
    emulated exception point at the address identified by 'mcsafe_inject'
    variable. With this infrastructure implement a test to validate that the
    'bytes remaining' calculation is correct for a range of various source
    buffer alignments.

    This code is compiled out by default. The CONFIG_MCSAFE_DEBUG
    configuration symbol needs to be manually enabled by editing
    Kconfig.debug. I.e. this functionality can not be accidentally enabled
    by a user / distro, it's only for development.

    Cc:
    Cc: Ingo Molnar
    Cc: Borislav Petkov
    Cc: Tony Luck
    Cc: Al Viro
    Cc: Thomas Gleixner
    Cc: Andy Lutomirski
    Cc: Peter Zijlstra
    Cc: Andrew Morton
    Cc: Linus Torvalds
    Reported-by: Tony Luck
    Signed-off-by: Dan Williams

    Dan Williams
     

16 Apr, 2018

4 commits


06 Apr, 2018

2 commits

  • The default value for smart ctrl_temperature was the same as the
    threshold for ctrl_temperature. As a result, any arbitrary smart
    injection to the nfit_test dimm could cause this alarm to trigger
    and cause an acpi notification. Drop the default value to below the
    threshold, so that unrelated injections don't trigger notifications.

    Cc: Dan Williams
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Vishal Verma
     
  • Add support for the smart injection command in the nvdimm unit test
    framework. This allows for directly injecting to smart fields and flags
    that are supported in the injection command. If the injected values are
    past the threshold, then an acpi notification is also triggered.

    Cc: Dan Williams
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Vishal Verma
     

07 Mar, 2018

3 commits

  • When you load nfit_test you currently see the following error in dmesg:

    nfit_test nfit_test.0: found a zero length table '0' parsing nfit

    This happens because when we parse the nfit_test.0 table via
    acpi_nfit_init(), we specify a size of nfit_test->nfit_size. For the first
    pass through nfit_test.0 where (t->setup_hotplug == 0) this is the size of
    the entire buffer we allocated, including space for the hot plug
    structures, not the size that we've actually filled in.

    Fix this by only trying to parse the size of the structures that we've
    filled in.

    Signed-off-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Ross Zwisler
     
  • It turns out that we were overrunning the 'nfit_buf' buffer in
    nfit_test0_setup() in the (t->setup_hotplug == 1) case because we failed to
    correctly account for all of the acpi_nfit_memory_map structures.

    Fix the structure count which will increase the allocation size of
    'nfit_buf' in nfit_test0_alloc(). Also add some WARN_ON()s to
    nfit_test0_setup() and nfit_test1_setup() to catch future issues where the
    size of the buffer doesn't match the amount of data we're writing.

    Signed-off-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Ross Zwisler
     
  • In nfit_test0_setup() and nfit_test1_setup() we keep an 'offset' value
    which we use to calculate where in our 'nfit_buf' we will place our next
    structure. The handling of 'offset' and the calculation of the placement
    of the next structure is a bit inconsistent, though. We don't update
    'offset' after we insert each structure, sometimes causing us to update it
    for multiple structures' sizes at once. When calculating the position of
    the next structure we aren't always able to just use 'offset', but
    sometimes have to add in other structure sizes as well.

    Fix this by updating 'offset' after each structure insertion in a
    consistent way, allowing us to always calculate the position of the next
    structure to be inserted by just using 'nfit_buf + offset'.

    Signed-off-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Ross Zwisler
     

03 Feb, 2018

2 commits


02 Feb, 2018

4 commits

  • The libnvdimm unit tests will fail when they are run against the
    production / in-tree version of libnvdimm.ko or nfit.ko due to
    symbols not being mocked per nfit_test's expectation. For example,
    nfit_test expects acpi_evaluate_dsm() to be replaced by
    __wrap_acpi_evaluate_dsm() to test how acpi_nfit_ctl() responds to
    different stimuli.

    Create a test-only symbol name that nfit_test links against to cause
    module load failures when the wrong module is present.

    For example, with this change, attempts to use the wrong module will
    report:

    nfit_test: Unknown symbol libnvdimm_test (err 0)

    Reported-by: Dave Jiang
    Reported-by: Vishal Verma
    Signed-off-by: Dan Williams

    Dan Williams
     
  • Adding support code to simulate the enabling of LSS status in support of
    the Intel DSM v1.6 Function Index 10: Enable Latch System Shutdown Status.
    This is only for testing of libndctl support for LSS enable. The actual
    functionality requires a reboot and therefore is not simulated. The enable
    value is not recorded in nfit_test since there's no DSM to actually query
    the current status of the LSS enable.

    Signed-off-by: Dave Jiang
    Reviewed-by: Vishal Verma
    Signed-off-by: Dan Williams

    Dave Jiang
     
  • Adding support in nfit_test for DSM v1.6 firmware update sequence. The test
    will simulate the flashing of firmware to the DIMM. A bogus version string
    will be returned as the test has no idea how to parse the firmware binary.
    Any bogus binary can be used to "update" as the actual binary is not copied
    into the kernel.

    Signed-off-by: Dave Jiang
    Reviewed-by: Vishal Verma
    [ vishal: also move smart calls into the nd_cmd_call block ]
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Dave Jiang
     
  • Adding NFIT platform capabilities sub table in nfit_test simulated ACPI
    NFIT table. Only the first NFIT table is added with the capability
    sub-table.

    Signed-off-by: Dave Jiang
    Reviewed-by: Ross Zwisler
    Signed-off-by: Ross Zwisler

    Dave Jiang
     

09 Jan, 2018

1 commit

  • This new interface is similar to how struct device (and many others)
    work. The caller initializes a 'struct dev_pagemap' as required
    and calls 'devm_memremap_pages'. This allows the pagemap structure to
    be embedded in another structure and thus container_of can be used. In
    this way application specific members can be stored in a containing
    struct.

    This will be used by the P2P infrastructure and HMM could probably
    be cleaned up to use it as well (instead of having it's own, similar
    'hmm_devmem_pages_create' function).

    Signed-off-by: Logan Gunthorpe
    Signed-off-by: Christoph Hellwig
    Signed-off-by: Dan Williams

    Christoph Hellwig
     

05 Dec, 2017

2 commits

  • Allow the smart_threshold values to be changed via the 'set smart
    threshold command' and trigger notifications when the thresholds are
    met.

    Signed-off-by: Dan Williams

    Dan Williams
     
  • The kernel's ND_IOCTL_SMART_THRESHOLD command is based on a payload
    definition that has become broken / out-of-sync with recent versions of
    the NVDIMM_FAMILY_INTEL definition. Deprecate the use of the
    ND_IOCTL_SMART_THRESHOLD command in favor of the ND_CMD_CALL approach
    taken by NVDIMM_FAMILY_{HPE,MSFT}, where we can manage the per-vendor
    variance in userspace.

    In a couple years, when the new scheme is widely deployed in userspace
    packages, the ND_IOCTL_SMART_THRESHOLD support can be removed. For now
    we prevent new binaries from compiling against the kernel header
    definitions, but kernel still compatible with old binaries. The
    libndctl.h [1] header is now the authoritative interface definition for
    NVDIMM SMART.

    [1]: https://github.com/pmem/ndctl
    Signed-off-by: Dan Williams

    Dan Williams
     

18 Nov, 2017

1 commit

  • Pull libnvdimm and dax updates from Dan Williams:
    "Save for a few late fixes, all of these commits have shipped in -next
    releases since before the merge window opened, and 0day has given a
    build success notification.

    The ext4 touches came from Jan, and the xfs touches have Darrick's
    reviewed-by. An xfstest for the MAP_SYNC feature has been through
    a few round of reviews and is on track to be merged.

    - Introduce MAP_SYNC and MAP_SHARED_VALIDATE, a mechanism to enable
    'userspace flush' of persistent memory updates via filesystem-dax
    mappings. It arranges for any filesystem metadata updates that may
    be required to satisfy a write fault to also be flushed ("on disk")
    before the kernel returns to userspace from the fault handler.
    Effectively every write-fault that dirties metadata completes an
    fsync() before returning from the fault handler. The new
    MAP_SHARED_VALIDATE mapping type guarantees that the MAP_SYNC flag
    is validated as supported by the filesystem's ->mmap() file
    operation.

    - Add support for the standard ACPI 6.2 label access methods that
    replace the NVDIMM_FAMILY_INTEL (vendor specific) label methods.
    This enables interoperability with environments that only implement
    the standardized methods.

    - Add support for the ACPI 6.2 NVDIMM media error injection methods.

    - Add support for the NVDIMM_FAMILY_INTEL v1.6 DIMM commands for
    latch last shutdown status, firmware update, SMART error injection,
    and SMART alarm threshold control.

    - Cleanup physical address information disclosures to be root-only.

    - Fix revalidation of the DIMM "locked label area" status to support
    dynamic unlock of the label area.

    - Expand unit test infrastructure to mock the ACPI 6.2 Translate SPA
    (system-physical-address) command and error injection commands.

    Acknowledgements that came after the commits were pushed to -next:

    - 957ac8c421ad ("dax: fix PMD faults on zero-length files"):
    Reviewed-by: Ross Zwisler

    - a39e596baa07 ("xfs: support for synchronous DAX faults") and
    7b565c9f965b ("xfs: Implement xfs_filemap_pfn_mkwrite() using __xfs_filemap_fault()")
    Reviewed-by: Darrick J. Wong "

    * tag 'libnvdimm-for-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/nvdimm/nvdimm: (49 commits)
    acpi, nfit: add 'Enable Latch System Shutdown Status' command support
    dax: fix general protection fault in dax_alloc_inode
    dax: fix PMD faults on zero-length files
    dax: stop requiring a live device for dax_flush()
    brd: remove dax support
    dax: quiet bdev_dax_supported()
    fs, dax: unify IOMAP_F_DIRTY read vs write handling policy in the dax core
    tools/testing/nvdimm: unit test clear-error commands
    acpi, nfit: validate commands against the device type
    tools/testing/nvdimm: stricter bounds checking for error injection commands
    xfs: support for synchronous DAX faults
    xfs: Implement xfs_filemap_pfn_mkwrite() using __xfs_filemap_fault()
    ext4: Support for synchronous DAX faults
    ext4: Simplify error handling in ext4_dax_huge_fault()
    dax: Implement dax_finish_sync_fault()
    dax, iomap: Add support for synchronous faults
    mm: Define MAP_SYNC and VM_SYNC flags
    dax: Allow tuning whether dax_insert_mapping_entry() dirties entry
    dax: Allow dax_iomap_fault() to return pfn
    dax: Fix comment describing dax_iomap_fault()
    ...

    Linus Torvalds
     

14 Nov, 2017

1 commit


09 Nov, 2017

1 commit


03 Nov, 2017

3 commits

  • The injected badrange entries can only be cleared from the kernel's
    accounting by writing to the affected blocks, so when such a write sends
    the clear errror DSM to nfit_test, also clear the ranges from
    nfit_test's badrange list. This lets an 'ARS Inject error status' DSM to
    return the correct status, omitting the cleared ranges.

    Cc: Dave Jiang
    Cc: Dan Williams
    Signed-off-by: Vishal Verma
    Reviewed-by: Dave Jiang
    Signed-off-by: Dan Williams

    Vishal Verma
     
  • Add nfit_test emulation for the new ACPI 6.2 error injectino DSMs.
    This will allow unit tests to selectively inject the errors they wish to
    test for.

    Signed-off-by: Dave Jiang
    [vishal: Move injection functions to ND_CMD_CALL]
    [vishal: Add support for the notification option]
    [vishal: move an nfit_test private definition into a local header]
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Dave Jiang
     
  • nfit_test needs to use the poison list manipulation code as well. Make
    it more generic and in the process rename poison to badrange, and move
    all the related helpers to a new file.

    Signed-off-by: Dave Jiang
    [vishal: Add badrange.o to nfit_test's Kbuild]
    [vishal: add a missed include in bus.c for the new badrange functions]
    [vishal: rename all instances of 'be' to 'bre']
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Dave Jiang
     

02 Nov, 2017

1 commit

  • Many source files in the tree are missing licensing information, which
    makes it harder for compliance tools to determine the correct license.

    By default all files without license information are under the default
    license of the kernel, which is GPL version 2.

    Update the files which contain no license information with the 'GPL-2.0'
    SPDX license identifier. The SPDX identifier is a legally binding
    shorthand, which can be used instead of the full boiler plate text.

    This patch is based on work done by Thomas Gleixner and Kate Stewart and
    Philippe Ombredanne.

    How this work was done:

    Patches were generated and checked against linux-4.14-rc6 for a subset of
    the use cases:
    - file had no licensing information it it.
    - file was a */uapi/* one with no licensing information in it,
    - file was a */uapi/* one with existing licensing information,

    Further patches will be generated in subsequent months to fix up cases
    where non-standard license headers were used, and references to license
    had to be inferred by heuristics based on keywords.

    The analysis to determine which SPDX License Identifier to be applied to
    a file was done in a spreadsheet of side by side results from of the
    output of two independent scanners (ScanCode & Windriver) producing SPDX
    tag:value files created by Philippe Ombredanne. Philippe prepared the
    base worksheet, and did an initial spot review of a few 1000 files.

    The 4.13 kernel was the starting point of the analysis with 60,537 files
    assessed. Kate Stewart did a file by file comparison of the scanner
    results in the spreadsheet to determine which SPDX license identifier(s)
    to be applied to the file. She confirmed any determination that was not
    immediately clear with lawyers working with the Linux Foundation.

    Criteria used to select files for SPDX license identifier tagging was:
    - Files considered eligible had to be source code files.
    - Make and config files were included as candidates if they contained >5
    lines of source
    - File already had some variant of a license header in it (even if
    Reviewed-by: Philippe Ombredanne
    Reviewed-by: Thomas Gleixner
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

08 Oct, 2017

1 commit

  • To test ndctl list which use interface of Translate SPA,
    nfit_test needs to emulates it.
    This test module searches region which includes SPA and
    returns 1 dimm handle which is last one.

    Signed-off-by: Yasunori Goto
    Reviewed-by: Vishal Verma
    Signed-off-by: Dan Williams

    Yasunori Goto
     

29 Sep, 2017

1 commit


19 Sep, 2017

1 commit


01 Sep, 2017

1 commit

  • mmio_flush_range() suffers from a lack of clearly-defined semantics,
    and is somewhat ambiguous to port to other architectures where the
    scope of the writeback implied by "flush" and ordering might matter,
    but MMIO would tend to imply non-cacheable anyway. Per the rationale
    in 67a3e8fe9015 ("nd_blk: change aperture mapping from WC to WB"), the
    only existing use is actually to invalidate clean cache lines for
    ARCH_MEMREMAP_PMEM type mappings *without* writeback. Since the recent
    cleanup of the pmem API, that also now happens to be the exact purpose
    of arch_invalidate_pmem(), which would be a far more well-defined tool
    for the job.

    Rather than risk potentially inconsistent implementations of
    mmio_flush_range() for the sake of one callsite, streamline things by
    removing it entirely and instead move the ARCH_MEMREMAP_PMEM related
    definitions up to the libnvdimm level, so they can be shared by NFIT
    as well. This allows NFIT to be enabled for arm64.

    Signed-off-by: Robin Murphy
    Signed-off-by: Dan Williams

    Robin Murphy
     

16 Jun, 2017

1 commit

  • The root cause of panic is the num_pm of nfit_test1 is wrong.
    Though 1 is specified for num_pm at nfit_test_init(), it must be 2,
    because nfit_test1->spa_set[] array has 2 elements.

    Since the array is smaller than expected, the driver breaks other area.
    (it is often the link list of devres).

    As a result, panic occurs like the following example.

    CPU: 4 PID: 2233 Comm: lt-libndctl Tainted: G O 4.12.0-rc1+ #12
    RIP: 0010:__list_del_entry_valid+0x6c/0xa0
    Call Trace:
    release_nodes+0x76/0x260
    devres_release_all+0x3c/0x50
    device_release_driver_internal+0x159/0x200
    device_release_driver+0x12/0x20
    bus_remove_device+0xfd/0x170
    device_del+0x1e8/0x330
    platform_device_del+0x28/0x90
    platform_device_unregister+0x12/0x30
    nfit_test_exit+0x2a/0x93b [nfit_test]

    Cc:
    Signed-off-by: Yasunori Goto
    Signed-off-by: Dan Williams

    Yasunori Goto