lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH v5 0/6] Add hardware prefetch control driver for A64FX and x86
    Date
    This patch series add sysfs interface to control CPU's hardware
    prefetch behavior for performance tuning from userspace for the
    processor A64FX and x86 (on supported CPU).

    Changes from v4:
    - remove core driver
    - fix to use attribute_group instead of attribute (patch 1, 4)
    - fix to store a pointer of CPU number in driver_data when the
    initialization of sysfs (patch 1, 4)
    - move #if in .c file to .h file (patch 3)
    - fix drivers to be loaded automatically (patch 1, 4)
    - for x86, it is tied to the discovery of a specific CPU model
    - for A64FX, it is tied to the discovery of a specific ACPI device
    - add Kconfig description (patch 2, 5)
    https://lore.kernel.org/lkml/20220518063032.2377351-1-tarumizu.kohei@fujitsu.com/

    [Background]
    ============
    A64FX and some Intel processors have implementation-dependent register
    for controlling CPU's hardware prefetch behavior. A64FX has
    IMP_PF_STREAM_DETECT_CTRL_EL0[1], and Intel processors have MSR 0x1a4
    (MSR_MISC_FEATURE_CONTROL)[2]. These registers cannot be accessed from
    userspace.

    [1]https://github.com/fujitsu/A64FX/tree/master/doc/
    A64FX_Specification_HPC_Extension_v1_EN.pdf

    [2]https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
    Volume 4

    The advantage of using these is improved performance. As an example of
    performance improvements, the results of running the Stream benchmark
    on the A64FX are described in section [Merit].

    For MSR 0x1a4, it is also possible to change the value from userspace
    via the MSR driver. However, using MSR driver is not recommended, so
    it needs a proper kernel interface[3].

    [3]https://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git/about/

    For these reasons, we provide a new proper kernel interface to control
    both IMP_PF_STREAM_DETECT_CTRL_EL0 and MSR 0x1a4.

    [Overall design]
    ================
    This driver creates "prefetch_control" directory and some attributes
    in every CPU's cache/indexX directory, if CPU supports hardware
    prefetch control behavior.

    Detailed description of this sysfs interface is in
    Documentation/ABI/testing/sysfs-devices-system-cpu (patch6).

    This driver needs cache sysfs directory and cache level/type
    information. In ARM processor, these information can be obtained
    from registers even without ACPI PPTT.
    We add processing to create a cache/index directory using only the
    information from the register if the machine does not support ACPI
    PPTT and CONFIG_ALLOW_INCOMPLETE_CACHE_SYSFS is true in patch3.
    This action caused a problem and is described in [Known problem].

    [Examples]
    ==========
    This section provides an example of using this sysfs interface at the
    x86's model of INTEL_FAM6_BROADWELL_X.

    This model has the following register specifications:

    [0] L2 Hardware Prefetcher Disable (R/W)
    [1] L2 Adjacent Cache Line Prefetcher Disable (R/W)
    [2] DCU Hardware Prefetcher Disable (R/W)
    [3] DCU IP Prefetcher Disable (R/W)
    [63:4] Reserved

    In this case, index0 (L1d cache) corresponds to bit[2,3] and index2
    (L2 cache) corresponds to bit [0,1]. A list of attribute files of
    index0 and index2 in CPU1 at BROADWELL_X is following:

    ```
    # ls /sys/devices/system/cpu/cpu1/cache/index0/prefetch_control/

    hardware_prefetcher_enable
    ip_prefetcher_enable

    # ls /sys/devices/system/cpu/cpu1/cache/index2/prefetch_control/

    adjacent_cache_line_prefetcher_enable
    hardware_prefetcher_enable
    ```

    If user would like to disable the setting of "L2 Adjacent Cache Line
    Prefetcher Disable (R/W)" in CPU1, do the following:

    ```
    # echo 0 >
    # /sys/devices/system/cpu/cpu1/cache/index2/prefetch_control/adjacent_cache_line_prefetcher_enable
    ```

    In another example, a list of index0 at A64FX is following:

    ```
    # ls /sys/devices/system/cpu/cpu1/cache/index0/prefetch_control/

    stream_detect_prefetcher_dist
    stream_detect_prefetcher_enable
    stream_detect_prefetcher_strength
    stream_detect_prefetcher_strength_available
    ```

    [Patch organizations]
    =====================
    This patch series add hardware prefetch control driver for A64FX
    and x86.

    - patch1: Add hardware prefetch control driver for A64FX

    Adds module init/exit code to create sysfs attributes for A64FX with
    "stream_detect_prefetcher_enable", "stream_detect_prefetcher_strong"
    and "stream_detect_prefetcher_dist".

    - patch2: Add Kconfig/Makefile to build driver for A64FX

    - patch3: Create cache sysfs directory without ACPI PPTT for hardware
    prefetch control

    Hardware Prefetch control driver needs cache sysfs directory and cache
    level/type information. In ARM processor, these information can be
    obtained from register(CLIDR_EL1) even without PPTT. Therefore, we
    set the cpu_map_populated to true to create cache sysfs directory, if
    the machine doesn't have PPTT.

    - patch4: Add hardware prefetch control driver for x86

    Adds module init/exit code to create sysfs attributes for x86 with
    "hardware_prefetcher_enable", "ip_prefetcher_enable" and
    "adjacent_cache_line_prefetcher_enable".

    - patch5: Add Kconfig/Makefile to build driver for x86

    - patch6: Add documentation for the new sysfs interface

    [Known problem]
    ===============
    - `lscpu` command terminates with -ENOENT because cache/index directory
    is exists but shared_cpu_map file does not exist. This is due to
    patch5, which creates a cache/index directory containing only level
    and type without ACPI PPTT.

    [Merit]
    =======
    For reference, here is the result of STREAM Triad when tuning with
    the "s file in L1 and L2 cache on A64FX.

    | dist combination | Pattern A | Pattern B |
    |-------------------|-------------|-------------|
    | L1:256, L2:1024 | 234505.2144 | 114600.0801 |
    | L1:1536, L2:1024 | 279172.8742 | 118979.4542 |
    | L1:256, L2:10240 | 247716.7757 | 127364.1533 |
    | L1:1536, L2:10240 | 283675.6625 | 125950.6847 |

    In pattern A, we set the size of the array to 174720, which is about
    half the size of the L1d cache. In pattern B, we set the size of the
    array to 10485120, which is about twice the size of the L2 cache.

    In pattern A, a change of dist at L1 has a larger effect. On the other
    hand, in pattern B, the change of dist at L2 has a larger effect.
    As described above, the optimal dist combination depends on the
    characteristics of the application. Therefore, such a sysfs interface
    is useful for performance tuning.

    Best regards,
    Kohei Tarumizu

    Kohei Tarumizu (6):
    soc: fujitsu: Add hardware prefetch control driver for A64FX
    soc: fujitsu: Add Kconfig/Makefile to build hardware prefetch control
    driver
    arm64: Create cache sysfs directory without ACPI PPTT for hardware
    prefetch control
    x86: Add hardware prefetch control driver for x86
    x86: Add Kconfig/Makefile to build hardware prefetch control driver
    docs: ABI: Add sysfs documentation interface of hardware prefetch
    control driver

    .../ABI/testing/sysfs-devices-system-cpu | 98 ++++
    MAINTAINERS | 6 +
    arch/arm64/kernel/cacheinfo.c | 27 +
    arch/x86/Kconfig | 17 +
    arch/x86/kernel/cpu/Makefile | 2 +
    arch/x86/kernel/cpu/x86-pfctl.c | 363 +++++++++++++
    drivers/acpi/pptt.c | 18 +
    drivers/soc/Kconfig | 1 +
    drivers/soc/Makefile | 1 +
    drivers/soc/fujitsu/Kconfig | 26 +
    drivers/soc/fujitsu/Makefile | 2 +
    drivers/soc/fujitsu/a64fx-pfctl.c | 484 ++++++++++++++++++
    include/linux/acpi.h | 5 +
    include/linux/cacheinfo.h | 10 +
    14 files changed, 1060 insertions(+)
    create mode 100644 arch/x86/kernel/cpu/x86-pfctl.c
    create mode 100644 drivers/soc/fujitsu/Kconfig
    create mode 100644 drivers/soc/fujitsu/Makefile
    create mode 100644 drivers/soc/fujitsu/a64fx-pfctl.c

    --
    2.27.0

    \
     
     \ /
      Last update: 2022-06-07 14:08    [W:2.445 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site