“eafbbc11a0bb1f347f7917552d46c2944b5f3bb2”上不存在“paddle/fluid/operators/conv_op.cu.cc”
  1. 24 7月, 2015 9 次提交
    • L
      ACPICA: Executer: Add interpreter tracing mode for method tracing facility · ab6c5733
      Lv Zheng 提交于
      ACPICA commit 07fffd02607685b655ed92ee15c160e6a810b60b
      
      The acpi_debug_trace() is the mechanism known as ACPI method tracing that is
      used by Linux as ACPICA debugging message reducer. This facility can be
      controlled through Linux ACPI subsystem - /sys/module/acpi/parameters.
      This facility requires CONFIG_ACPI_DEBUG to be enabled to see ACPICA trace
      logs in the kernel dmesg output.
      
      This patch enhances acpi_debug_trace() to make it not only a message reducer,
      but a real tracer to trace AML interpreter execution. Note that in addition
      to the AML tracer enabling, this patch also updates the facility with the
      following enhancements:
      1. Allow a full path to be specified by the acpi_debug_trace() API.
      2. Allow any method rather than just the entrance of acpi_evaluate_object()
         to be traced.
      3. All interpreter ACPI_LV_TRACE_POINT messages are collected for
         ACPI_EXECUTER layer.
      
      The Makefile of drivers/acpi/acpica is also updated to include exdebug.o
      and the duplicated stubs are removed after that.
      
      Note that since this patch has enhanced the method tracing facility, Linux
      need also be updated after applying this patch. Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/07fffd02Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      ab6c5733
    • L
      ACPICA: Dispatcher: Add trace support for interpreter · a616dc2f
      Lv Zheng 提交于
      ACPICA commit 71299ec8b49054daace0df50268e8e055654ca37
      
      This patch adds trace point at the following point:
       1. Begin/end of a control method execution;
       2. Begin/end of an opcode execution.
      
      The trace point feature can be enabled by defining ACPI_DEBUG_OUTPUT
      and specifying a debug level that includes ACPI_LV_TRACDE_POINT and the
      debug layers that include ACPI_PARSER and ACPI_DISPACTCHER.
      
      In order to make aml_op_name of union acpi_parse_object usable for tracer, it is
      enabled for ACPI_DEBUG_OUTPUT in this patch. Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/71299ec8Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      a616dc2f
    • L
      ACPICA: Dispatcher: Move stack traversal code to dispatcher · 0bac4295
      Lv Zheng 提交于
      ACPICA commit c8275e243b58fd4adfc0362bd704af41ed14bc75
      
      This patch moves parts of acpi_dm_dump_method_info() to the dispatcher
      component.
      
      This patch also makes the new function dependent on ACPI_DEBUG_OUTPUT
      compile-stage definition so that it can be used by the trace facility.
      
      acpi_dm_dump_method_info() traverses method stack when an exception is
      encountered. Such traversal is needed to support method tracing for the
      exceptions. When an exception is encountered, the end indications of the
      aborted methods should be logged in order not to break the user space
      analysis tool. Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/c8275e24Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      0bac4295
    • L
      ACPICA: Namespace: Add function to directly return normalized full path · d1e7ffe5
      Lv Zheng 提交于
      ACPICA commit 6e0229bb156d71675f2e07dc7960adb7ec0a60ea
      
      This patch adds functions to return normalized full path instead of
      "external path". The external path contains trailing "_" for each
      name segment while the normalized full path doesn't contain the
      trailing "_".
      
      Currently this function is used by the method tracing users to specify a
      none trailing "_" attached name path. Lv Zheng.
      
      Note that we need to validate and switch all Linux kernel acpi_get_name()
      users to use the new name type before removing the old name type from
      ACPICA.
      
      Link: https://github.com/acpica/acpica/commit/6e0229bbSigned-off-by: NLv Zheng <lv.zheng@intel.com>
      Reviewed-by: NRuiyi Zhang <ruiyi_zhang@hotmail.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      d1e7ffe5
    • L
      ACPICA: Executer: Add back pointing reference of method operand · 07b9c912
      Lv Zheng 提交于
      ACPICA commit 9dcd124e914e87495fbd1786d9484b962e0823e0
      
      This patch adds back pointing reference of the namespace node for a method
      operand. The namespace node then can be used in
      acpi_ds_terminate_control_method() to obtain method full path to be used by
      tracing facilities. Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/9dcd124eSigned-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      07b9c912
    • L
      ACPICA: Dispatcher: Cleanup union acpi_operand_object's AML address assignments · 62eb935b
      Lv Zheng 提交于
      ACPICA commit afb52611dbe7403551f93504d3798534f5c343f4
      
      This patch cleans up the code of assigning the AML address to the
      union acpi_operand_object.
      
      The idea behind this cleanup is:
      The AML address of the union acpi_operand_object should always be determined at
      the point where the object is encountered. It should be started from the
      first byte of the object. For example, the opcode of the object, the name
      string of the user_term object, or the first byte of the packaged object
      (where a pkg_length is prefixed). So it's not cleaner to have it assigned
      here and there in the entire ACPICA source tree.
      
      There are some special cases for the internal opcodes, before cleaning up
      the internal opcodes, we should also determine the rules for the AML
      addresses of the internal opcodes:
      1. INT_NAMEPATH_OP: the address of the first byte for the name_string.
      2. INT_METHODCALL_OP: the address of the first byte for the name_string.
      3. INT_BYTELIST_OP: the address of the first byte for the byte_data list.
      4. INT_EVAL_SUBTREE_OP: the address of the first byte for the
                              Region/Package/Buffer/bank_field/Field arguments.
      5. INT_NAMEDFIELD_OP: the address to the name_seg.
      6. INT_RESERVEDFIELD_OP: the address to the 0x00 prefix.
      7. INT_ACCESSFIELD_OP: the address to the 0x01 prefix.
      8. INT_CONNECTION_OP: the address to the 0x02 prefix.
      9: INT_EXTACCESSFIELD_OP: the address to the 0x03 prefix.
      10.INT_RETURN_VALUE_OP: the address of the replaced operand.
      11.computational_data: the address to the
                            Byte/Word/Dword/Qword/string_prefix.
      
      Before cleaning up the internal root scope of the aml_walk, turning it into
      the term_list, we need to remember the aml_start address as the "Aml"
      attribute for the union acpi_operand_object created by acpi_ps_create_scope_op().
      
      Finally, we can delete some redundant AML address assignment in psloop.c.
      
      Link: https://github.com/acpica/acpica/commit/afb52611Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      62eb935b
    • L
      ACPICA: Parser: Cleanup aml_offset in union acpi_operand_object · 950a429c
      Lv Zheng 提交于
      ACPICA commit 61b360074fde2bb8282722579410f5d1fb12f84d
      
      This patch converts aml_offset in union acpi_operand_object to AML address.
      
      AML offset is actually only used by the debugger, using AML address is more
      direct and efficient during the parsing stage so that we don't need to
      calculate the offset during the parsing stage and will not have
      difficulities in converting it into other offset attributes.
      
      Sometimes, aml_offset is not an indication of the offset from the table
      header but the offset from the entry of a list of terms, which requires
      additional efforts to convert it into an offset from the table header. By
      using AML address directly, there is no such difficulty.
      Thus this patch also deletes a logic in disassembler that is trying to
      convert the aml_offset from
        "offset from the start address of Method/Package/Buffer"
      into the
        "offset from the start address of the ACPI table"
      (Sample code deletion can be seen in acpi_dm_deferred_parse(), but the
      function is not in the Linux kernel). Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/61b36007Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      950a429c
    • L
      ACPICA: Parser: Cleanup aml_offset in struct acpi_walk_state · 83482f75
      Lv Zheng 提交于
      ACPICA commit d254405814495058276c0c2f9d96794d15a6c91c
      
      This patch converts aml_offset in struct acpi_walk_state to AML address.
      
      AML offset is actually only used by the debugger, using AML address is more
      direct and efficient during the parsing stage so that we don't need to
      calculate it during the parsing stage.
      
      On the other hand, we can see several issues in the current parser logic
      around the aml_offset:
      1. union acpi_operand_object.Common.aml_offset is redundantly assigned in
         acpi_ps_parse_loop().
      2. aml_offset is not an indication of the offset from the table header but
         the offset from the entry of a list of objects. Sometimes, it indicates
         an entry for a Method/Package/Buffer, which makes it difficult to be
         reversely calculated to a table header offset.
      3. When being used with method tracers (for example, Linux function trace),
         it's better to have AML address logged instead of the AML offset because
         the address is the only attribute that can uniquely identify the opcode.
      This patch is required to solve the above issues. Lv Zheng.
      
      Link: https://github.com/acpica/acpica/commit/d2544058Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NBob Moore <robert.moore@intel.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      83482f75
    • L
      ACPICA: Parser: Reduce parser/namespace divergences for tracer support · eb87a052
      Lv Zheng 提交于
      This patch reduces divergences in parser/namespace components so that the
      follow-up linuxized ACPICA upstream commits can be directly merged.
      Including the fix to an indent issue reported and fixed by Zhouyi Zhou.
      Signed-off-by: NLv Zheng <lv.zheng@intel.com>
      Signed-off-by: NZhouyi Zhou <yizhouzhou@ict.ac.cn>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      eb87a052
  2. 11 7月, 2015 2 次提交
  3. 10 7月, 2015 1 次提交
    • J
      ACPI / PCI: Fix regressions caused by resource_size_t overflow with 32-bit kernel · 1fb01ca9
      Jiang Liu 提交于
      Zoltan Boszormenyi reported this regression:
        "There's a Realtek RTL8111/8168/8411 (PCI ID 10ec:8168, Subsystem ID
         1565:230e) network chip on the mainboard. After the r8169 driver loaded
         the IRQs in the machine went berserk. Keyboard keypressed arrived with
         considerable latency and duplicated, so no real work was possible.
         The machine responded to the power button but didn't actually power
         down. It just stuck at the powering down message. I had to press the
         power button for 4 seconds to power it down.
      
         The computer is a POS machine with a big battery inside. Because of this,
         either ACPI or the Realtek chip kept the bad state and after rebooting,
         the network chip didn't even show up in lspci. Not even the PXE ROM
         announced itself during boot. I had to disconnect the battery to beat
         some sense back to the computer.
      
         The regression happens with 4.0.5, 4.1.0-rc8 and 4.1.0-final. 3.18.16 was
         good."
      
      The regression is caused by commit 593669c2 (x86/PCI/ACPI: Use common
      ACPI resource interfaces to simplify implementation). Since commit
      593669c2, x86 PCI ACPI host bridge driver validates ACPI resources by
      first converting an ACPI resource to a 'struct resource' structure and
      then applying checks against the converted resource structure. The 'start'
      and 'end' fields in 'struct resource' are defined to be type of
      resource_size_t, which may be 32 bits or 64 bits depending on
      CONFIG_PHYS_ADDR_T_64BIT.
      
      This may cause incorrect resource validation results with 32-bit kernels
      because 64-bit ACPI resource descriptors may get truncated when converting
      to 32-bit 'start' and 'end' fields in 'struct resource'. It eventually
      affects PCI resource allocation subsystem and makes some PCI devices and
      the system behave abnormally due to incorrect resource assignment.
      
      So enhance the ACPI resource parsing interfaces to ignore ACPI resource
      descriptors with address/offset above 4G when running in 32-bit mode.
      
      With the fix applied, the behavior of the machine was restored to how
      3.18.16 worked, i.e. the memory range that is over 4GB is ignored again,
      and lspci -vvxxx shows that everything is at the same memory window as
      they were with 3.18.16.
      Reported-and-tested-by: NBoszormenyi Zoltan <zboszor@pr.hu>
      Fixes: 593669c2 (x86/PCI/ACPI: Use common ACPI resource interfaces to simplify implementation)
      Signed-off-by: NJiang Liu <jiang.liu@linux.intel.com>
      Cc: 4.0+ <stable@vger.kernel.org> # 4.0+
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      1fb01ca9
  4. 07 7月, 2015 3 次提交
    • S
      ACPI / scan: Add support for ACPI _CLS device matching · 26095a01
      Suthikulpanit, Suravee 提交于
      Device drivers typically use ACPI _HIDs/_CIDs listed in struct device_driver
      acpi_match_table to match devices. However, for generic drivers, we do not
      want to list _HID for all supported devices. Also, certain classes of devices
      do not have _CID (e.g. SATA, USB). Instead, we can leverage ACPI _CLS,
      which specifies PCI-defined class code (i.e. base-class, subclass and
      programming interface). This patch adds support for matching ACPI devices using
      the _CLS method.
      
      To support loadable module, current design uses _HID or _CID to match device's
      modalias. With the new way of matching with _CLS this would requires modification
      to the current ACPI modalias key to include _CLS. This patch appends PCI-defined
      class-code to the existing ACPI modalias as following.
      
          acpi:<HID>:<CID1>:<CID2>:..:<CIDn>:<bbsspp>:
      E.g:
          # cat /sys/devices/platform/AMDI0600:00/modalias
          acpi:AMDI0600:010601:
      
      where bb is th base-class code, ss is te sub-class code, and pp is the
      programming interface code
      
      Since there would not be _HID/_CID in the ACPI matching table of the driver,
      this patch adds a field to acpi_device_id to specify the matching _CLS.
      
          static const struct acpi_device_id ahci_acpi_match[] = {
              { ACPI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff) },
              {},
          };
      
      In this case, the corresponded entry in modules.alias file would be:
      
          alias acpi*:010601:* ahci_platform
      Acked-by: NMika Westerberg <mika.westerberg@linux.intel.com>
      Reviewed-by: NHanjun Guo <hanjun.guo@linaro.org>
      Signed-off-by: NSuravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      26095a01
    • R
      ACPI / LPSS: Fix up acpi_lpss_create_device() · d3e13ff3
      Rafael J. Wysocki 提交于
      Fix a return value (which should be a negative error code) and a
      memory leak (the list allocated by acpi_dev_get_resources() needs
      to be freed on ioremap() errors too) in acpi_lpss_create_device()
      introduced by commit 4483d59e 'ACPI / LPSS: check the result
      of ioremap()'.
      
      Fixes: 4483d59e 'ACPI / LPSS: check the result of ioremap()'
      Reported-by: NDan Carpenter <dan.carpenter@oracle.com>
      Cc: 4.0+ <stable@vger.kernel.org> # 4.0+
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      d3e13ff3
    • R
      ACPI / PNP: Reserve ACPI resources at the fs_initcall_sync stage · 0294112e
      Rafael J. Wysocki 提交于
      This effectively reverts the following three commits:
      
       7bc10388 ACPI / resources: free memory on error in add_region_before()
       0f1b414d ACPI / PNP: Avoid conflicting resource reservations
       b9a5e5e1 ACPI / init: Fix the ordering of acpi_reserve_resources()
      
      (commit b9a5e5e1 introduced regressions some of which, but not
      all, were addressed by commit 0f1b414d and commit 7bc10388
      was a fixup on top of the latter) and causes ACPI fixed hardware
      resources to be reserved at the fs_initcall_sync stage of system
      initialization.
      
      The story is as follows.  First, a boot regression was reported due
      to an apparent resource reservation ordering change after a commit
      that shouldn't lead to such changes.  Investigation led to the
      conclusion that the problem happened because acpi_reserve_resources()
      was executed at the device_initcall() stage of system initialization
      which wasn't strictly ordered with respect to driver initialization
      (and with respect to the initialization of the pcieport driver in
      particular), so a random change causing the device initcalls to be
      run in a different order might break things.
      
      The response to that was to attempt to run acpi_reserve_resources()
      as soon as we knew that ACPI would be in use (commit b9a5e5e1).
      However, that turned out to be too early, because it caused resource
      reservations made by the PNP system driver to fail on at least one
      system and that failure was addressed by commit 0f1b414d.
      
      That fix still turned out to be insufficient, though, because
      calling acpi_reserve_resources() before the fs_initcall stage of
      system initialization caused a boot regression to happen on the
      eCAFE EC-800-H20G/S netbook.  That meant that we only could call
      acpi_reserve_resources() at the fs_initcall initialization stage
      or later, but then we might just as well call it after the PNP
      initalization in which case commit 0f1b414d wouldn't be
      necessary any more.
      
      For this reason, the changes made by commit 0f1b414d are reverted
      (along with a memory leak fixup on top of that commit), the changes
      made by commit b9a5e5e1 that went too far are reverted too and
      acpi_reserve_resources() is changed into fs_initcall_sync, which
      will cause it to be executed after the PNP subsystem initialization
      (which is an fs_initcall) and before device initcalls (including
      the pcieport driver initialization) which should avoid the initial
      issue.
      
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=100581
      Link: http://marc.info/?t=143092384600002&r=1&w=2
      Link: https://bugzilla.kernel.org/show_bug.cgi?id=99831
      Link: http://marc.info/?t=143389402600001&r=1&w=2
      Fixes: b9a5e5e1 "ACPI / init: Fix the ordering of acpi_reserve_resources()"
      Reported-by: NRoland Dreier <roland@purestorage.com>
      Cc: All applicable <stable@vger.kernel.org>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      0294112e
  5. 03 7月, 2015 2 次提交
  6. 02 7月, 2015 13 次提交
  7. 01 7月, 2015 1 次提交
  8. 26 6月, 2015 7 次提交
    • T
      libnvdimm: Add sysfs numa_node to NVDIMM devices · 74ae66c3
      Toshi Kani 提交于
      Add support of sysfs 'numa_node' to I/O-related NVDIMM devices
      under /sys/bus/nd/devices, regionN, namespaceN.0, and bttN.x.
      
      An example of numa_node values on a 2-socket system with a single
      NVDIMM range on each socket is shown below.
        /sys/bus/nd/devices
        |-- btt0.0/numa_node:0
        |-- btt1.0/numa_node:1
        |-- btt1.1/numa_node:1
        |-- namespace0.0/numa_node:0
        |-- namespace1.0/numa_node:1
        |-- region0/numa_node:0
        |-- region1/numa_node:1
      
      These numa_node files are then linked under the block class of
      their device names.
        /sys/class/block/pmem0/device/numa_node:0
        /sys/class/block/pmem1s/device/numa_node:1
      
      This enables numactl(8) to accept 'block:' and 'file:' paths of
      pmem and btt devices as shown in the examples below.
        numactl --preferred block:pmem0 --show
        numactl --preferred file:/dev/pmem1s --show
      Signed-off-by: NToshi Kani <toshi.kani@hp.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      74ae66c3
    • T
      libnvdimm: Set numa_node to NVDIMM devices · 41d7a6d6
      Toshi Kani 提交于
      ACPI NFIT table has System Physical Address Range Structure entries that
      describe a proximity ID of each range when ACPI_NFIT_PROXIMITY_VALID is
      set in the flags.
      
      Change acpi_nfit_register_region() to map a proximity ID to its node ID,
      and set it to a new numa_node field of nd_region_desc, which is then
      conveyed to the nd_region device.
      
      The device core arranges for btt and namespace devices to inherit their
      node from their parent region.
      Signed-off-by: NToshi Kani <toshi.kani@hp.com>
      [djbw: move set_dev_node() from region.c to bus.c]
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      41d7a6d6
    • T
      acpi: Add acpi_map_pxm_to_online_node() · 99759869
      Toshi Kani 提交于
      The kernel initializes CPU & memory's NUMA topology from ACPI
      SRAT table.  Some other ACPI tables, such as NFIT and DMAR, also
      contain proximity IDs for their device's NUMA topology.  This
      information can be used to improve performance of these devices.
      
      This patch introduces acpi_map_pxm_to_online_node(), which is
      similar to acpi_map_pxm_to_node(), but always returns an online
      node.  When the mapped node from a given proximity ID is offline,
      it looks up the node distance table and returns the nearest
      online node.
      
      ACPI device drivers, which are called after the NUMA initialization
      has completed in the kernel, can call this interface to obtain their
      device NUMA topology from ACPI tables.  Such drivers do not have to
      deal with offline nodes.  A node may be offline when a device
      proximity ID is unique, SRAT memory entry does not exist, or NUMA is
      disabled, ex. "numa=off" on x86.
      
      This patch also moves the pxm range check from acpi_get_node() to
      acpi_map_pxm_to_node().
      Signed-off-by: NToshi Kani <toshi.kani@hp.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com&gt;>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      99759869
    • D
      libnvdimm, nfit: handle unarmed dimms, mark namespaces read-only · 58138820
      Dan Williams 提交于
      Upon detection of an unarmed dimm in a region, arrange for descendant
      BTT, PMEM, or BLK instances to be read-only.  A dimm is primarily marked
      "unarmed" via flags passed by platform firmware (NFIT).
      
      The flags in the NFIT memory device sub-structure indicate the state of
      the data on the nvdimm relative to its energy source or last "flush to
      persistence".  For the most part there is nothing the driver can do but
      advertise the state of these flags in sysfs and emit a message if
      firmware indicates that the contents of the device may be corrupted.
      However, for the case of ACPI_NFIT_MEM_ARMED, the driver can arrange for
      the block devices incorporating that nvdimm to be marked read-only.
      This is a safe default as the data is still available and new writes are
      held off until the administrator either forces read-write mode, or the
      energy source becomes armed.
      
      A 'read_only' attribute is added to REGION devices to allow for
      overriding the default read-only policy of all descendant block devices.
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      58138820
    • D
      tools/testing/nvdimm: libnvdimm unit test infrastructure · 6bc75619
      Dan Williams 提交于
      'libnvdimm' is the first driver sub-system in the kernel to implement
      mocking for unit test coverage.  The nfit_test module gets built as an
      external module and arranges for external module replacements of nfit,
      libnvdimm, nd_pmem, and nd_blk.  These replacements use the linker
      --wrap option to redirect calls to ioremap() + request_mem_region() to
      custom defined unit test resources.  The end result is a fully
      functional nvdimm_bus, as far as userspace is concerned, but with the
      capability to perform otherwise destructive tests on emulated resources.
      
      Q: Why not use QEMU for this emulation?
      QEMU is not suitable for unit testing.  QEMU's role is to faithfully
      emulate the platform.  A unit test's role is to unfaithfully implement
      the platform with the goal of triggering bugs in the corners of the
      sub-system implementation.  As bugs are discovered in platforms, or the
      sub-system itself, the unit tests are extended to backstop a fix with a
      reproducer unit test.
      
      Another problem with QEMU is that it would require coordination of 3
      software projects instead of 2 (kernel + libndctl [1]) to maintain and
      execute the tests.  The chances for bit rot and the difficulty of
      getting the tests running goes up non-linearly the more components
      involved.
      
      
      Q: Why submit this to the kernel tree instead of external modules in
         libndctl?
      Simple, to alleviate the same risk that out-of-tree external modules
      face.  Updates to drivers/nvdimm/ can be immediately evaluated to see if
      they have any impact on tools/testing/nvdimm/.
      
      
      Q: What are the negative implications of merging this?
      It is a unique maintenance burden because the purpose of mocking an
      interface to enable a unit test is to purposefully short circuit the
      semantics of a routine to enable testing.  For example
      __wrap_ioremap_cache() fakes the pmem driver into "ioremap()'ing" a test
      resource buffer allocated by dma_alloc_coherent().  The future
      maintenance burden hits when someone changes the semantics of
      ioremap_cache() and wonders what the implications are for the unit test.
      
      [1]: https://github.com/pmem/ndctl
      
      Cc: <linux-acpi@vger.kernel.org>
      Cc: Lv Zheng <lv.zheng@intel.com>
      Cc: Robert Moore <robert.moore@intel.com>
      Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      6bc75619
    • R
      libnvdimm, nfit, nd_blk: driver for BLK-mode access persistent memory · 047fc8a1
      Ross Zwisler 提交于
      The libnvdimm implementation handles allocating dimm address space (DPA)
      between PMEM and BLK mode interfaces.  After DPA has been allocated from
      a BLK-region to a BLK-namespace the nd_blk driver attaches to handle I/O
      as a struct bio based block device. Unlike PMEM, BLK is required to
      handle platform specific details like mmio register formats and memory
      controller interleave.  For this reason the libnvdimm generic nd_blk
      driver calls back into the bus provider to carry out the I/O.
      
      This initial implementation handles the BLK interface defined by the
      ACPI 6 NFIT [1] and the NVDIMM DSM Interface Example [2] composed from
      DCR (dimm control region), BDW (block data window), IDT (interleave
      descriptor) NFIT structures and the hardware register format.
      [1]: http://www.uefi.org/sites/default/files/resources/ACPI_6.0.pdf
      [2]: http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf
      
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Boaz Harrosh <boaz@plexistor.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Jens Axboe <axboe@fb.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Christoph Hellwig <hch@lst.de>
      Signed-off-by: NRoss Zwisler <ross.zwisler@linux.intel.com>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      047fc8a1
    • V
      nd_btt: atomic sector updates · 5212e11f
      Vishal Verma 提交于
      BTT stands for Block Translation Table, and is a way to provide power
      fail sector atomicity semantics for block devices that have the ability
      to perform byte granularity IO. It relies on the capability of libnvdimm
      namespace devices to do byte aligned IO.
      
      The BTT works as a stacked blocked device, and reserves a chunk of space
      from the backing device for its accounting metadata. It is a bio-based
      driver because all IO is done synchronously, and there is no queuing or
      asynchronous completions at either the device or the driver level.
      
      The BTT uses 'lanes' to index into various 'on-disk' data structures,
      and lanes also act as a synchronization mechanism in case there are more
      CPUs than available lanes. We did a comparison between two lane lock
      strategies - first where we kept an atomic counter around that tracked
      which was the last lane that was used, and 'our' lane was determined by
      atomically incrementing that. That way, for the nr_cpus > nr_lanes case,
      theoretically, no CPU would be blocked waiting for a lane. The other
      strategy was to use the cpu number we're scheduled on to and hash it to
      a lane number. Theoretically, this could block an IO that could've
      otherwise run using a different, free lane. But some fio workloads
      showed that the direct cpu -> lane hash performed faster than tracking
      'last lane' - my reasoning is the cache thrash caused by moving the
      atomic variable made that approach slower than simply waiting out the
      in-progress IO. This supports the conclusion that the driver can be a
      very simple bio-based one that does synchronous IOs instead of queuing.
      
      Cc: Andy Lutomirski <luto@amacapital.net>
      Cc: Boaz Harrosh <boaz@plexistor.com>
      Cc: H. Peter Anvin <hpa@zytor.com>
      Cc: Jens Axboe <axboe@fb.com>
      Cc: Ingo Molnar <mingo@kernel.org>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Neil Brown <neilb@suse.de>
      Cc: Jeff Moyer <jmoyer@redhat.com>
      Cc: Dave Chinner <david@fromorbit.com>
      Cc: Greg KH <gregkh@linuxfoundation.org>
      [jmoyer: fix nmi watchdog timeout in btt_map_init]
      [jmoyer: move btt initialization to module load path]
      [jmoyer: fix memory leak in the btt initialization path]
      [jmoyer: Don't overwrite corrupted arenas]
      Signed-off-by: NVishal Verma <vishal.l.verma@linux.intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      5212e11f
  9. 25 6月, 2015 2 次提交
    • D
      libnvdimm, nfit: add interleave-set state-tracking infrastructure · eaf96153
      Dan Williams 提交于
      On platforms that have firmware support for reading/writing per-dimm
      label space, a portion of the dimm may be accessible via an interleave
      set PMEM mapping in addition to the dimm's BLK (block-data-window
      aperture(s)) interface.  A label, stored in a "configuration data
      region" on the dimm, disambiguates which dimm addresses are accessed
      through which exclusive interface.
      
      Add infrastructure that allows the kernel to block modifications to a
      label in the set while any member dimm is active.  Note that this is
      meant only for enforcing "no modifications of active labels" via the
      coarse ioctl command.  Adding/deleting namespaces from an active
      interleave set is always possible via sysfs.
      
      Another aspect of tracking interleave sets is tracking their integrity
      when DIMMs in a set are physically re-ordered.  For this purpose we
      generate an "interleave-set cookie" that can be recorded in a label and
      validated against the current configuration.  It is the bus provider
      implementation's responsibility to calculate the interleave set cookie
      and attach it to a given region.
      
      Cc: Neil Brown <neilb@suse.de>
      Cc: <linux-acpi@vger.kernel.org>
      Cc: Greg KH <gregkh@linuxfoundation.org>
      Cc: Robert Moore <robert.moore@intel.com>
      Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
      Acked-by: NChristoph Hellwig <hch@lst.de>
      Acked-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      eaf96153
    • D
      libnvdimm: support for legacy (non-aliasing) nvdimms · 3d88002e
      Dan Williams 提交于
      The libnvdimm region driver is an intermediary driver that translates
      non-volatile "region"s into "namespace" sub-devices that are surfaced by
      persistent memory block-device drivers (PMEM and BLK).
      
      ACPI 6 introduces the concept that a given nvdimm may simultaneously
      offer multiple access modes to its media through direct PMEM load/store
      access, or windowed BLK mode.  Existing nvdimms mostly implement a PMEM
      interface, some offer a BLK-like mode, but never both as ACPI 6 defines.
      If an nvdimm is single interfaced, then there is no need for dimm
      metadata labels.  For these devices we can take the region boundaries
      directly to create a child namespace device (nd_namespace_io).
      Acked-by: NChristoph Hellwig <hch@lst.de>
      Tested-by: NToshi Kani <toshi.kani@hp.com>
      Signed-off-by: NDan Williams <dan.j.williams@intel.com>
      3d88002e