From: fengchengwen <fengchengwen@huawei.com>
To: Vamsi Krishna <vattunuru@marvell.com>, <dev@dpdk.org>
Cc: <thomas@monjalon.net>, <bruce.richardson@intel.com>,
<anatoly.burakov@intel.com>, <kevin.laatz@intel.com>,
<jerinj@marvell.com>, <stephen@networkplumber.org>
Subject: Re: [PATCH v4 1/1] lib/dma: introduce inter-process and inter-OS DMA
Date: Fri, 17 Oct 2025 21:13:30 +0800 [thread overview]
Message-ID: <b0ba957e-c147-2a55-283b-281063235bba@huawei.com> (raw)
In-Reply-To: <20251017054210.3105218-1-vattunuru@marvell.com>
[-- Attachment #1: Type: text/plain, Size: 8933 bytes --]
Acked-by: Chengwen Feng <fengchengwen@huawei.com>
On 2025/10/17 13:42, Vamsi Krishna wrote:
> From: Vamsi Attunuru<vattunuru@marvell.com>
>
> Modern DMA hardware supports data transfers between multiple DMA
> devices, facilitating data communication across isolated domains,
> containers, or operating systems. These DMA transfers function as
> standard memory-to-memory operations, but with source or destination
> addresses residing in different process or OS address space. The
> exchange of these addresses between processes is handled through
> private driver mechanism, which are beyond the scope of this
> specification change.
>
> This commit introduces new capability flags to advertise driver support
> for inter-process and inter-OS domain DMA transfers. It adds a mechanism
> to specify source and destination handlers via the vchan configuration.
> Until standardized control-plane APIs are defined for various categories
> of DMA devices, these handler details can be exchanged through private
> driver mechanisms.
>
> Signed-off-by: Vamsi Attunuru<vattunuru@marvell.com>
> ---
> V4 changes:
> * Move comments before defination
> * Validate reserved fields are zero or not.
> * Add more comments to new fields.
> * UT for this feature will be added in another commit.
> V3 changes:
> * Fix v2 review comments
> V2 changes:
> * Seperate out the control-plane APIs
> * Address v0 review comments
> * Add validation checks
> * Rename the enums
>
> lib/dmadev/rte_dmadev.c | 25 +++++++++++++
> lib/dmadev/rte_dmadev.h | 69 +++++++++++++++++++++++++++++++++++
> lib/dmadev/rte_dmadev_trace.h | 3 ++
> 3 files changed, 97 insertions(+)
>
> diff --git a/lib/dmadev/rte_dmadev.c b/lib/dmadev/rte_dmadev.c
> index 73d24f8ff3..30c3db3a98 100644
> --- a/lib/dmadev/rte_dmadev.c
> +++ b/lib/dmadev/rte_dmadev.c
> @@ -665,6 +665,27 @@ rte_dma_vchan_setup(int16_t dev_id, uint16_t vchan,
> RTE_DMA_LOG(ERR, "Device %d vchan out range!", dev_id);
> return -EINVAL;
> }
> + if (conf->domain.type != RTE_DMA_INTER_DOMAIN_NONE &&
> + conf->direction != RTE_DMA_DIR_MEM_TO_MEM) {
> + RTE_DMA_LOG(ERR, "Device %d inter domain only support mem-to-mem transfer", dev_id);
> + return -EINVAL;
> + }
> + if (conf->domain.type == RTE_DMA_INTER_OS_DOMAIN &&
> + !(dev_info.dev_capa & RTE_DMA_CAPA_INTER_OS_DOMAIN)) {
> + RTE_DMA_LOG(ERR, "Device %d does not support inter os domain", dev_id);
> + return -EINVAL;
> + }
> + if (conf->domain.type == RTE_DMA_INTER_PROCESS_DOMAIN &&
> + !(dev_info.dev_capa & RTE_DMA_CAPA_INTER_PROCESS_DOMAIN)) {
> + RTE_DMA_LOG(ERR, "Device %d does not support inter process domain", dev_id);
> + return -EINVAL;
> + }
> + if ((conf->domain.type == RTE_DMA_INTER_PROCESS_DOMAIN ||
> + conf->domain.type == RTE_DMA_INTER_OS_DOMAIN) &&
> + (conf->domain.reserved[0] != 0 || conf->domain.reserved[1] != 0)) {
> + RTE_DMA_LOG(ERR, "Device %d does not support non-zero reserved fields", dev_id);
> + return -EINVAL;
> + }
> if (conf->direction != RTE_DMA_DIR_MEM_TO_MEM &&
> conf->direction != RTE_DMA_DIR_MEM_TO_DEV &&
> conf->direction != RTE_DMA_DIR_DEV_TO_MEM &&
> @@ -811,6 +832,8 @@ dma_capability_name(uint64_t capability)
> { RTE_DMA_CAPA_HANDLES_ERRORS, "handles_errors" },
> { RTE_DMA_CAPA_M2D_AUTO_FREE, "m2d_auto_free" },
> { RTE_DMA_CAPA_PRI_POLICY_SP, "pri_policy_sp" },
> + { RTE_DMA_CAPA_INTER_PROCESS_DOMAIN, "inter_process_domain" },
> + { RTE_DMA_CAPA_INTER_OS_DOMAIN, "inter_os_domain" },
> { RTE_DMA_CAPA_OPS_COPY, "copy" },
> { RTE_DMA_CAPA_OPS_COPY_SG, "copy_sg" },
> { RTE_DMA_CAPA_OPS_FILL, "fill" },
> @@ -1040,6 +1063,8 @@ dmadev_handle_dev_info(const char *cmd __rte_unused,
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_HANDLES_ERRORS);
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_M2D_AUTO_FREE);
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_PRI_POLICY_SP);
> + ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_INTER_PROCESS_DOMAIN);
> + ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_INTER_OS_DOMAIN);
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY);
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_COPY_SG);
> ADD_CAPA(dma_caps, dev_capa, RTE_DMA_CAPA_OPS_FILL);
> diff --git a/lib/dmadev/rte_dmadev.h b/lib/dmadev/rte_dmadev.h
> index 30e168825e..1708311c5b 100644
> --- a/lib/dmadev/rte_dmadev.h
> +++ b/lib/dmadev/rte_dmadev.h
> @@ -265,6 +265,18 @@ int16_t rte_dma_next_dev(int16_t start_dev_id);
> * known from 'nb_priorities' field in struct rte_dma_info.
> */
> #define RTE_DMA_CAPA_PRI_POLICY_SP RTE_BIT64(8)
> +/** Support inter-process DMA transfers.
> + *
> + * When this bit is set, the DMA device can perform memory transfers between
> + * different process memory spaces.
> + */
> +#define RTE_DMA_CAPA_INTER_PROCESS_DOMAIN RTE_BIT64(9)
> +/** Support inter-OS domain DMA transfers.
> + *
> + * The DMA device can perform memory transfers across different operating
> + * system domains.
> + */
> +#define RTE_DMA_CAPA_INTER_OS_DOMAIN RTE_BIT64(10)
>
> /** Support copy operation.
> * This capability start with index of 32, so that it could leave gap between
> @@ -426,8 +438,13 @@ int rte_dma_close(int16_t dev_id);
> */
> enum rte_dma_direction {
> /** DMA transfer direction - from memory to memory.
> + * When the device supports inter-process or inter-OS domain transfers,
> + * the field `type` in `struct rte_dma_vchan_conf::domain` specifies the
> + * type of domain. For memory-to-memory transfers within the same domain
> + * or process, `type` should be set to `RTE_DMA_INTER_DOMAIN_NONE`.
> *
> * @see struct rte_dma_vchan_conf::direction
> + * @see struct rte_dma_inter_domain_param::type
> */
> RTE_DMA_DIR_MEM_TO_MEM,
> /** DMA transfer direction - from memory to device.
> @@ -572,6 +589,49 @@ struct rte_dma_auto_free_param {
> uint64_t reserved[2];
> };
>
> +/**
> + * Inter-DMA transfer domain type.
> + *
> + * This enum defines the types of transfer domains applicable to DMA operations.
> + * It helps categorize whether a DMA transfer is occurring within the same domain,
> + * across different processes, or between distinct operating system domains.
> + *
> + * @see struct rte_dma_inter_domain_param:type
> + */
> +enum rte_dma_inter_domain_type {
> + /** No inter-domain transfer; standard DMA within same domain. */
> + RTE_DMA_INTER_DOMAIN_NONE,
> + /** Transfer occurs between different user-space processes. */
> + RTE_DMA_INTER_PROCESS_DOMAIN,
> + /** Transfer spans across different operating system domains. */
> + RTE_DMA_INTER_OS_DOMAIN,
> +};
> +
> +/**
> + * Parameters for inter-process or inter-OS DMA transfers.
> + *
> + * This structure defines the parameters required to perform DMA transfers
> + * across different domains, such as between processes or operating systems.
> + * It includes the domain type and handler identifiers for both the source
> + * and destination domains.
> + *
> + * When domain type is RTE_DMA_INTER_DOMAIN_NONE, both source and destination
> + * handlers are invalid, DMA operation is confined within the local process.
> + *
> + * For DMA transfers between the local process or OS domain to another process
> + * or OS domain, valid source and destination handlers must be provided.
> + */
> +struct rte_dma_inter_domain_param {
> + /** Type of inter-domain. */
> + enum rte_dma_inter_domain_type type;
> + /** Source domain handler identifier. */
> + uint16_t src_handler;
> + /** Destination domain handler identifier. */
> + uint16_t dst_handler;
> + /** Reserved for future fields. */
> + uint64_t reserved[2];
> +};
> +
> /**
> * A structure used to configure a virtual DMA channel.
> *
> @@ -609,6 +669,15 @@ struct rte_dma_vchan_conf {
> * @see struct rte_dma_auto_free_param
> */
> struct rte_dma_auto_free_param auto_free;
> + /** Parameters for inter-process or inter-OS domain DMA transfers. This field
> + * specifies the source and destination domain handlers required for DMA
> + * operations that span across different processes or operating system domains.
> + *
> + * @see RTE_DMA_CAPA_INTER_PROCESS_DOMAIN
> + * @see RTE_DMA_CAPA_INTER_OS_DOMAIN
> + * @see struct rte_dma_inter_domain_param
> + */
> + struct rte_dma_inter_domain_param domain;
> };
>
> /**
> diff --git a/lib/dmadev/rte_dmadev_trace.h b/lib/dmadev/rte_dmadev_trace.h
> index 04d9a2741b..f1a178eeb5 100644
> --- a/lib/dmadev/rte_dmadev_trace.h
> +++ b/lib/dmadev/rte_dmadev_trace.h
> @@ -79,6 +79,9 @@ RTE_TRACE_POINT(
> rte_trace_point_emit_int(conf->dst_port.port_type);
> rte_trace_point_emit_u64(conf->dst_port.pcie.val);
> rte_trace_point_emit_ptr(conf->auto_free.m2d.pool);
> + rte_trace_point_emit_int(conf->domain.type);
> + rte_trace_point_emit_u16(conf->domain.src_handler);
> + rte_trace_point_emit_u16(conf->domain.dst_handler);
> rte_trace_point_emit_int(ret);
> )
>
[-- Attachment #2: Type: text/html, Size: 9331 bytes --]
next prev parent reply other threads:[~2025-10-17 13:13 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <--in-reply-to=20251010144631.713063-1-vattunuru@marvell.com>
2025-10-13 4:21 ` [PATCH v3 " Vamsi Krishna
2025-10-13 7:52 ` fengchengwen
2025-10-13 18:31 ` [EXTERNAL] " Vamsi Krishna Attunuru
2025-10-15 7:09 ` fengchengwen
2025-10-16 10:20 ` Vamsi Krishna Attunuru
2025-10-15 17:26 ` Stephen Hemminger
2025-10-16 10:15 ` [EXTERNAL] " Vamsi Krishna Attunuru
2025-10-15 17:27 ` Stephen Hemminger
2025-10-17 5:42 ` [PATCH v4 " Vamsi Krishna
2025-10-17 13:13 ` fengchengwen [this message]
2025-10-18 11:05 ` [EXTERNAL] " Vamsi Krishna Attunuru
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b0ba957e-c147-2a55-283b-281063235bba@huawei.com \
--to=fengchengwen@huawei.com \
--cc=anatoly.burakov@intel.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
--cc=jerinj@marvell.com \
--cc=kevin.laatz@intel.com \
--cc=stephen@networkplumber.org \
--cc=thomas@monjalon.net \
--cc=vattunuru@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).