05 Jun, 2019

1 commit

  • Based on 1 normalized pattern(s):

    this program is free software you can redistribute it and or modify
    it under the terms of version 2 of the gnu general public license as
    published by the free software foundation this program is
    distributed in the hope that it will be useful but without any
    warranty without even the implied warranty of merchantability or
    fitness for a particular purpose see the gnu general public license
    for more details

    extracted by the scancode license scanner the SPDX license identifier

    GPL-2.0-only

    has been chosen to replace the boilerplate/reference in 64 file(s).

    Signed-off-by: Thomas Gleixner
    Reviewed-by: Alexios Zavras
    Reviewed-by: Allison Randal
    Cc: linux-spdx@vger.kernel.org
    Link: https://lkml.kernel.org/r/20190529141901.894819585@linutronix.de
    Signed-off-by: Greg Kroah-Hartman

    Thomas Gleixner
     

01 May, 2019

1 commit

  • Users have reported intermittent occurrences of DIMM initialization
    failures due to duplicate allocations of address capacity detected in
    the labels, or errors of the form below, both have the same root cause.

    nd namespace1.4: failed to track label: 0
    WARNING: CPU: 17 PID: 1381 at drivers/nvdimm/label.c:863

    RIP: 0010:__pmem_label_update+0x56c/0x590 [libnvdimm]
    Call Trace:
    ? nd_pmem_namespace_label_update+0xd6/0x160 [libnvdimm]
    nd_pmem_namespace_label_update+0xd6/0x160 [libnvdimm]
    uuid_store+0x17e/0x190 [libnvdimm]
    kernfs_fop_write+0xf0/0x1a0
    vfs_write+0xb7/0x1b0
    ksys_write+0x57/0xd0
    do_syscall_64+0x60/0x210

    Unfortunately those reports were typically with a busy parallel
    namespace creation / destruction loop making it difficult to see the
    components of the bug. However, Jane provided a simple reproducer using
    the work-in-progress sub-section implementation.

    When ndctl is reconfiguring a namespace it may take an existing defunct
    / disabled namespace and reconfigure it with a new uuid and other
    parameters. Critically namespace_update_uuid() takes existing address
    resources and renames them for the new namespace to use / reconfigure as
    it sees fit. The bug is that this rename only happens in the resource
    tracking tree. Existing labels with the old uuid are not reaped leading
    to a scenario where multiple active labels reference the same span of
    address range.

    Teach namespace_update_uuid() to flag any references to the old uuid for
    reaping at the next label update attempt.

    Cc:
    Fixes: bf9bccc14c05 ("libnvdimm: pmem label sets and namespace instantiation")
    Link: https://github.com/pmem/ndctl/issues/91
    Reported-by: Jane Chu
    Reported-by: Jeff Moyer
    Reported-by: Erwin Tsaur
    Cc: Johannes Thumshirn
    Signed-off-by: Dan Williams

    Dan Williams
     

23 Mar, 2019

1 commit


12 Mar, 2019

1 commit


05 Mar, 2019

1 commit


13 Feb, 2019

1 commit

  • For recovery, where non-dax access is needed to a given physical address
    range, and testing, allow the 'force_raw' attribute to override the
    default establishment of a dev_pagemap.

    Otherwise without this capability it is possible to end up with a
    namespace that can not be activated due to corrupted info-block, and one
    that can not be repaired due to a section collision.

    Cc:
    Fixes: 004f1afbe199 ("libnvdimm, pmem: direct map legacy pmem by default")
    Signed-off-by: Dan Williams

    Dan Williams
     

03 Feb, 2019

1 commit

  • As Dexuan reports the NVDIMM_FAMILY_HYPERV platform is incompatible with
    the existing Linux namespace implementation because it uses
    NSLABEL_FLAG_LOCAL for x1-width PMEM interleave sets. Quirk it as an
    platform / DIMM that does not provide BLK-aperture access. Allow the
    libnvdimm core to assume no potential for aliasing. In case other
    implementations make the same mistake, provide a "noblk" module
    parameter to force-enable the quirk.

    Link: https://lkml.kernel.org/r/PU1P153MB0169977604493B82B662A01CBF920@PU1P153MB0169.APCP153.PROD.OUTLOOK.COM
    Reported-by: Dexuan Cui
    Tested-by: Dexuan Cui
    Signed-off-by: Dan Williams

    Dan Williams
     

11 Dec, 2018

1 commit


02 Oct, 2018

1 commit


26 Jul, 2018

1 commit

  • This patch will find the max contiguous area to determine the largest
    pmem namespace size that can be created. If the requested size exceeds
    the largest available, ENOSPC error will be returned.

    This fixes the allocation underrun error and wrong error return code
    that have otherwise been observed as the following kernel warning:

    WARNING: CPU: PID: at drivers/nvdimm/namespace_devs.c:913 size_store

    Fixes: a1f3e4d6a0c3 ("libnvdimm, region: update nd_region_available_dpa() for multi-pmem support")
    Cc:
    Signed-off-by: Keith Busch
    Reviewed-by: Vishal Verma
    Signed-off-by: Dave Jiang

    Keith Busch
     

15 Jul, 2018

1 commit


07 Apr, 2018

1 commit

  • The following NULL dereference results from incorrectly assuming that
    ndd is valid in this print:

    struct nvdimm_drvdata *ndd = to_ndd(&nd_region->mapping[i]);

    /*
    * Give up if we don't find an instance of a uuid at each
    * position (from 0 to nd_region->ndr_mappings - 1), or if we
    * find a dimm with two instances of the same uuid.
    */
    dev_err(&nd_region->dev, "%s missing label for %pUb\n",
    dev_name(ndd->dev), nd_label->uuid);

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000000
    IP: nd_region_register_namespaces+0xd67/0x13c0 [libnvdimm]
    PGD 0 P4D 0
    Oops: 0000 [#1] SMP PTI
    CPU: 43 PID: 673 Comm: kworker/u609:10 Not tainted 4.16.0-rc4+ #1
    [..]
    RIP: 0010:nd_region_register_namespaces+0xd67/0x13c0 [libnvdimm]
    [..]
    Call Trace:
    ? devres_add+0x2f/0x40
    ? devm_kmalloc+0x52/0x60
    ? nd_region_activate+0x9c/0x320 [libnvdimm]
    nd_region_probe+0x94/0x260 [libnvdimm]
    ? kernfs_add_one+0xe4/0x130
    nvdimm_bus_probe+0x63/0x100 [libnvdimm]

    Switch to using the nvdimm device directly.

    Fixes: 0e3b0d123c8f ("libnvdimm, namespace: allow multiple pmem...")
    Cc:
    Reported-by: Dave Jiang
    Signed-off-by: Dan Williams

    Dan Williams
     

07 Mar, 2018

1 commit

  • Dynamic debug can be instructed to add the function name to the debug
    output using the +f switch, so there is no need for the libnvdimm
    modules to do it again. If a user decides to add the +f switch for
    libnvdimm's dynamic debug this results in double prints of the function
    name.

    Reported-by: Johannes Thumshirn
    Reported-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Dan Williams
     

03 Feb, 2018

1 commit

  • Pointer nd_mapping is being initialized to a value that is never read,
    instead it is being updated to a new value in all the cases where it
    is being read afterwards, hence the initialization is redundant and
    can be removed.

    Cleans up clang warning:
    drivers/nvdimm/namespace_devs.c:2411:21: warning: Value stored to
    'nd_mapping' during its initialization is never rea

    Signed-off-by: Colin Ian King
    Reviewed-by: Ross Zwisler
    Signed-off-by: Ross Zwisler

    Colin Ian King
     

08 Oct, 2017

1 commit

  • The functions create_namespace_pmem and create_namespace_blk are local
    to the source and do not need to be in global scope, so make them static.

    Cleans up sparse warnings:
    symbol 'create_namespace_pmem' was not declared. Should it be static?
    symbol 'create_namespace_blk' was not declared. Should it be static?

    Signed-off-by: Colin Ian King
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Dan Williams

    Colin Ian King
     

29 Sep, 2017

1 commit

  • For the same reason that /proc/iomem returns 0's for non-root readers
    and acpi tables are root-only, make the 'resource' attribute for
    namespace devices only readable by root. Otherwise we disclose physical
    address information.

    Fixes: bf9bccc14c05 ("libnvdimm: pmem label sets and namespace instantiation")
    Cc:
    Reported-by: Dave Hansen
    Signed-off-by: Dan Williams

    Dan Williams
     

19 Sep, 2017

1 commit

  • Maurice reports:

    BUG: unable to handle kernel NULL pointer dereference at 0000000000000028
    IP: holder_class_store+0x253/0x2b0 [libnvdimm]

    ...while trying to reconfigure an NVDIMM-N namespace into 'sector' /
    'btt' mode. The crash points to this line:

    (gdb) li *(holder_class_store+0x253)
    0x7773 is in holder_class_store (drivers/nvdimm/namespace_devs.c:1420).
    1415 for (i = 0; i < nd_region->ndr_mappings; i++) {
    1416 struct nd_mapping *nd_mapping = &nd_region->mapping[i];
    1417 struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
    1418 struct nd_namespace_index *nsindex;
    1419
    1420 nsindex = to_namespace_index(ndd, ndd->ns_current);

    ...where we are failing because ndd is NULL due to NVDIMM-N dimms not
    supporting labels.

    Long story short, default to the BTTv1 format in the label-less /
    NVDIMM-N case.

    Fixes: 14e494542636 ("libnvdimm, btt: BTT updates for UEFI 2.7 format")
    Cc:
    Cc: Vishal Verma
    Reported-by: Maurice A. Saldivar
    Tested-by: Maurice A. Saldivar
    Signed-off-by: Dan Williams

    Dan Williams
     

12 Aug, 2017

1 commit


04 Jul, 2017

1 commit


30 Jun, 2017

1 commit

  • The UEFI 2.7 specification defines an updated BTT metadata format,
    bumping the revision to 2.0. Add support for the new format, while
    retaining compatibility for the old 1.1 format.

    Cc: Toshi Kani
    Cc: Linda Knippers
    Cc: Dan Williams
    Signed-off-by: Vishal Verma
    Signed-off-by: Dan Williams

    Vishal Verma
     

28 Jun, 2017

2 commits

  • Allow volatile nfit ranges to participate in all the same infrastructure
    provided for persistent memory regions. A resulting resulting namespace
    device will still be called "pmem", but the parent region type will be
    "nd_volatile". This is in preparation for disabling the dax ->flush()
    operation in the pmem driver when it is hosted on a volatile range.

    Cc: Jan Kara
    Cc: Jeff Moyer
    Cc: Christoph Hellwig
    Cc: Matthew Wilcox
    Cc: Ross Zwisler
    Signed-off-by: Dan Williams

    Dan Williams
     
  • Now that all callers of the pmem api have been converted to dax helpers that
    call back to the pmem driver, we can remove include/linux/pmem.h and
    asm/pmem.h.

    Cc:
    Cc: Jeff Moyer
    Cc: Ingo Molnar
    Cc: Christoph Hellwig
    Cc: Toshi Kani
    Cc: Oliver O'Halloran
    Cc: Ross Zwisler
    Reviewed-by: Jan Kara
    Signed-off-by: Dan Williams

    Dan Williams
     

16 Jun, 2017

5 commits

  • Starting with v1.2 labels, 'address abstractions' can be hinted via an
    address abstraction id that implies an info-block format. The standard
    address abstraction in the specification is the v2 format of the
    Block-Translation-Table (BTT). Support for that is saved for a later
    patch, for now we add support for the Linux supported address
    abstractions BTT (v1), PFN, and DAX.

    The new 'holder_class' attribute for namespace devices is added for
    tooling to specify the 'abstraction_guid' to store in the namespace label.
    For v1.1 labels this field is undefined and any setting of
    'holder_class' away from the default 'none' value will only have effect
    until the driver is unloaded. Setting 'holder_class' requires that
    whatever device tries to claim the namespace must be of the specified
    class.

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

    Dan Williams
     
  • Starting with the v1.2 definition of namespace labels, the isetcookie
    field is populated and validated for blk-aperture namespaces. This adds
    some safety against inadvertent copying of namespace labels from one
    DIMM-device to another.

    Signed-off-by: Dan Williams

    Dan Williams
     
  • The type_guid refers to the "Address Range Type GUID" for the region
    backing a namespace as defined the ACPI NFIT (NVDIMM Firmware Interface
    Table). This 'type' identifier specifies an access mechanism for the
    given namespace. This capability replaces the confusing usage of the
    'NSLABEL_FLAG_LOCAL' flag to indicate a block-aperture-mode namespace.

    Signed-off-by: Dan Williams

    Dan Williams
     
  • Previously we only honored the lba size for blk-aperture mode
    namespaces. For pmem namespaces the lba size was just assumed to be 512.
    With the new v1.2 label definition and compatibility with other
    operating environments, the ->lbasize property is now respected for pmem
    namespaces.

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

    Dan Williams
     
  • The interleave-set-cookie algorithm is extended to incorporate all the
    same components that are used to generate an nvdimm unique-id. For
    backwards compatibility we still maintain the old v1.1 definition.

    Reported-by: Nicholas Moulin
    Reported-by: Kaushik Kanetkar
    Signed-off-by: Dan Williams

    Dan Williams
     

05 May, 2017

2 commits

  • Per the latest version of the "NVDIMM DSM Interface Example" [1], the
    label data retrieval routine can report a "locked" status. In this case
    all regions associated with that DIMM are disabled until the label area
    is unlocked. Provide generic libnvdimm enabling for NVDIMMs with label
    data area locking capabilities.

    [1]: http://pmem.io/documents/

    Signed-off-by: Dan Williams

    Dan Williams
     
  • This is a preparation patch for handling locked nvdimm label regions, a
    new concept as introduced by the latest DSM document on pmem.io [1]. A
    future patch will leverage nvdimm_set_locked() at DIMM probe time to
    flag regions that can not be enabled. There should be no functional
    difference resulting from this change.

    [1]: http://pmem.io/documents/NVDIMM_DSM_Interface_Example-V1.3.pdf

    Signed-off-by: Dan Williams

    Dan Williams
     

01 Mar, 2017

1 commit

  • The interleave-set cookie is a sum that sanity checks the composition of
    an interleave set has not changed from when the namespace was initially
    created. The checksum is calculated by sorting the DIMMs by their
    location in the interleave-set. The comparison for the sort must be
    64-bit wide, not byte-by-byte as performed by memcmp() in the broken
    case.

    Fix the implementation to accept correct cookie values in addition to
    the Linux "memcmp" order cookies, but only allow correct cookies to be
    generated going forward. It does mean that namespaces created by
    third-party-tooling, or created by newer kernels with this fix, will not
    validate on older kernels. However, there are a couple mitigating
    conditions:

    1/ platforms with namespace-label capable NVDIMMs are not widely
    available.

    2/ interleave-sets with a single-dimm are by definition not affected
    (nothing to sort). This covers the QEMU-KVM NVDIMM emulation case.

    The cookie stored in the namespace label will be fixed by any write the
    namespace label, the most straightforward way to achieve this is to
    write to the "alt_name" attribute of a namespace in sysfs.

    Cc:
    Fixes: eaf961536e16 ("libnvdimm, nfit: add interleave-set state-tracking infrastructure")
    Reported-by: Nicholas Moulin
    Tested-by: Nicholas Moulin
    Signed-off-by: Dan Williams

    Dan Williams
     

01 Feb, 2017

2 commits

  • Given that the naming of pmem devices changes from the pmemX form to the
    pmemX.Y form when namespace id is greater than 0, arrange for namespaces
    with id-0 to be exempt from deletion. Otherwise a simple reconfiguration
    of an existing namespace to a new mode results in a name change of the
    resulting block device:

    # ndctl list --namespace=namespace1.0
    {
    "dev":"namespace1.0",
    "mode":"raw",
    "size":2147483648,
    "uuid":"3dadf3dc-89b9-4b24-b20e-abc8a4707ce3",
    "blockdev":"pmem1"
    }

    # ndctl create-namespace --reconfig=namespace1.0 --mode=memory --force
    {
    "dev":"namespace1.1",
    "mode":"memory",
    "size":2111832064,
    "uuid":"7b4a6341-7318-4219-a02c-fb57c0bbf613",
    "blockdev":"pmem1.1"
    }

    This change does require tooling changes to explicitly look for
    namespaceX.0 if the seed has already advanced to another namespace.

    Cc:
    Fixes: 98a29c39dc68 ("libnvdimm, namespace: allow creation of multiple pmem-namespaces per region")
    Reviewed-by: Johannes Thumshirn
    Signed-off-by: Dan Williams

    Dan Williams
     
  • Declare device_type structure as const as it is only stored in the
    type field of a device structure. This field is of type const, so add
    const to declaration of device_type structure.

    File size before:
    text data bss dec hex filename
    19278 3199 16 22493 57dd nvdimm/namespace_devs.o

    File size after:
    text data bss dec hex filename
    19929 3160 16 23105 5a41 nvdimm/namespace_devs.o

    Signed-off-by: Bhumika Goyal
    Signed-off-by: Dan Williams

    Bhumika Goyal
     

14 Jan, 2017

1 commit

  • Commit 98a29c39dc68 ("libnvdimm, namespace: allow creation of multiple
    pmem-namespaces per region") added support for establishing additional
    pmem namespace beyond the seed device, similar to blk namespaces.
    However, it neglected to delete the namespace when the size is set to
    zero.

    Fixes: 98a29c39dc68 ("libnvdimm, namespace: allow creation of multiple pmem-namespaces per region")
    Cc:
    Signed-off-by: Dan Williams

    Dan Williams
     

18 Dec, 2016

1 commit


16 Dec, 2016

1 commit


05 Dec, 2016

1 commit


29 Nov, 2016

1 commit

  • In create_namespace_blk(), the local variable "name" is defined as an
    array of NSLABEL_NAME_LEN pointers:

    char *name[NSLABEL_NAME_LEN];

    This variable is then used in calls to memcpy() and kmemdup() as if it
    were char[NSLABEL_NAME_LEN]. Remove the star in the variable definition
    to makes it look right.

    Signed-off-by: Nicolas Iooss
    Reviewed-by: Ross Zwisler
    Signed-off-by: Dan Williams

    Nicolas Iooss
     

20 Oct, 2016

1 commit


08 Oct, 2016

2 commits