lkml.org 
[lkml]   [2023]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH v7 0/8] Implement copy offload support
    Date
    The patch series covers the points discussed in November 2021 virtual
    call [LSF/MM/BFP TOPIC] Storage: Copy Offload [0].
    We have covered the initial agreed requirements in this patchset and
    further additional features suggested by community.
    Patchset borrows Mikulas's token based approach for 2 bdev
    implementation.

    This is on top of our previous patchset v6[1].

    Overall series supports:
    ========================
    1. Driver
    - NVMe Copy command (single NS, TP 4065), including support
    in nvme-target (for block and file backend).

    2. Block layer
    - Block-generic copy (REQ_COPY flag), with interface
    accommodating two block-devs
    - Emulation, for in-kernel user when offload is natively
    absent
    - dm-linear support (for cases not requiring split)

    3. User-interface
    - copy_file_range

    Testing
    =======
    Copy offload can be tested on:
    a. QEMU: NVME simple copy (TP 4065). By setting nvme-ns
    parameters mssrl,mcl, msrc. For more info [2].
    b. Fabrics loopback.
    c. blktests[3] (tests block/032,033, nvme/046,047,048,049)

    Emuation can be tested on any device.

    fio[4].

    Infra and plumbing:
    ===================
    We populate copy_file_range callback in def_blk_fops.
    For devices that support copy-offload, use blkdev_copy_offload to
    achieve in-device copy.
    However for cases, where device doesn't support offload,
    fallback to generic_copy_file_range.
    For in-kernel users (like fabrics), we use blkdev_issue_copy
    which implements its own emulation, as fd is not available.
    Modify checks in generic_copy_file_range to support block-device.

    Performance:
    ============
    The major benefit of this copy-offload/emulation framework is
    observed in fabrics setup, for copy workloads across the network.
    The host will send offload command over the network and actual copy
    can be achieved using emulation on the target.
    This results in better performance and network utilisation,
    as compared to read and write travelling across the network.
    With async-design of copy-offload/emulation we are able to see the
    following improvements as compared to userspace read + write on a
    NVMeOF TCP setup:

    Setup1: Network Speed: 1000Mb/s
    Host PC: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
    Target PC: AMD Ryzen 9 5900X 12-Core Processor
    block size 8k:
    710% improvement in IO BW (108 MiB/s to 876 MiB/s).
    Network utilisation drops from 97% to 15%.
    block-size 1M:
    2532% improvement in IO BW (101 MiB/s to 2659 MiB/s).
    Network utilisation drops from 89% to 0.62%.

    Setup2: Network Speed: 100Gb/s
    Server: Intel(R) Xeon(R) Gold 6240 CPU @ 2.60GHz, 72 cores
    (host and target have the same configuration)
    block-size 8k:
    17.5% improvement in IO BW (794 MiB/s to 933 MiB/s).
    Network utilisation drops from 6.75% to 0.16%.

    Blktests[3]
    ======================
    tests/block/032,033: Runs copy offload and emulation on block device.
    tests/nvme/046,047,048,049 Create a loop backed fabrics device and
    run copy offload and emulation.

    Future Work
    ===========
    - nullblk: copy-offload emulation.
    - loopback device copy offload support
    - upstream fio to use copy offload

    These are to be taken up after we reach consensus on the
    plumbing of current elements that are part of this series.


    Additional links:
    =================
    [0] https://lore.kernel.org/linux-nvme/CA+1E3rJ7BZ7LjQXXTdX+-0Edz=zT14mmPGMiVCzUgB33C60tbQ@mail.gmail.com/
    [1] https://lore.kernel.org/lkml/20230112115908.23662-1-nj.shetty@samsung.com/T/
    [2] https://qemu-project.gitlab.io/qemu/system/devices/nvme.html#simple-copy
    [3] https://github.com/nitesh-shetty/blktests/tree/feat/copy_offload/v7
    [4] https://github.com/vincentkfu/fio/tree/copyoffload-cfr-3.33-v7

    Changes since v6:
    =================
    - copy_file_range instead of ioctl for direct block device
    - Remove support for multi range (vectored) copy
    - Remove ioctl interface for copy.
    - Remove offload support in dm kcopyd.

    Changes since v5:
    =================
    - Addition of blktests (Chaitanya Kulkarni)
    - Minor fix for fabrics file backed path
    - Remove buggy zonefs copy file range implementation.

    Changes since v4:
    =================
    - make the offload and emulation design asynchronous (Hannes
    Reinecke)
    - fabrics loopback support
    - sysfs naming improvements (Damien Le Moal)
    - use kfree() instead of kvfree() in cio_await_completion
    (Damien Le Moal)
    - use ranges instead of rlist to represent range_entry (Damien
    Le Moal)
    - change argument ordering in blk_copy_offload suggested (Damien
    Le Moal)
    - removed multiple copy limit and merged into only one limit
    (Damien Le Moal)
    - wrap overly long lines (Damien Le Moal)
    - other naming improvements and cleanups (Damien Le Moal)
    - correctly format the code example in description (Damien Le
    Moal)
    - mark blk_copy_offload as static (kernel test robot)

    Changes since v3:
    =================
    - added copy_file_range support for zonefs
    - added documentation about new sysfs entries
    - incorporated review comments on v3
    - minor fixes

    Changes since v2:
    =================
    - fixed possible race condition reported by Damien Le Moal
    - new sysfs controls as suggested by Damien Le Moal
    - fixed possible memory leak reported by Dan Carpenter, lkp
    - minor fixes

    Nitesh Shetty (8):
    block: Introduce queue limits for copy-offload support
    block: Add copy offload support infrastructure
    block: add emulation for copy
    fs, block: copy_file_range for def_blk_ops for direct block device.
    nvme: add copy offload support
    nvmet: add copy command support for bdev and file ns
    dm: Add support for copy offload.
    dm: Enable copy offload for dm-linear target

    Documentation/ABI/stable/sysfs-block | 36 +++
    block/blk-lib.c | 426 +++++++++++++++++++++++++++
    block/blk-map.c | 4 +-
    block/blk-settings.c | 24 ++
    block/blk-sysfs.c | 64 ++++
    block/blk.h | 2 +
    block/fops.c | 18 ++
    drivers/md/dm-linear.c | 1 +
    drivers/md/dm-table.c | 42 +++
    drivers/md/dm.c | 7 +
    drivers/nvme/host/constants.c | 1 +
    drivers/nvme/host/core.c | 106 ++++++-
    drivers/nvme/host/fc.c | 5 +
    drivers/nvme/host/nvme.h | 7 +
    drivers/nvme/host/pci.c | 27 +-
    drivers/nvme/host/rdma.c | 7 +
    drivers/nvme/host/tcp.c | 16 +
    drivers/nvme/host/trace.c | 19 ++
    drivers/nvme/target/admin-cmd.c | 9 +-
    drivers/nvme/target/io-cmd-bdev.c | 58 ++++
    drivers/nvme/target/io-cmd-file.c | 52 ++++
    drivers/nvme/target/loop.c | 6 +
    drivers/nvme/target/nvmet.h | 1 +
    fs/read_write.c | 11 +-
    include/linux/blk_types.h | 25 ++
    include/linux/blkdev.h | 21 ++
    include/linux/device-mapper.h | 5 +
    include/linux/nvme.h | 43 ++-
    include/uapi/linux/fs.h | 3 +
    29 files changed, 1032 insertions(+), 14 deletions(-)


    base-commit: 3ac88fa4605ec98e545fb3ad0154f575fda2de5f
    --
    2.35.1.500.gb896f729e2

    \
     
     \ /
      Last update: 2023-03-27 00:28    [W:4.327 / U:0.204 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site