Ping for apply.

Thanks
Vamsi

>-----Original Message-----
>From: fengchengwen <[email protected]>
>Sent: Friday, October 17, 2025 6:44 PM
>To: Vamsi Krishna Attunuru <[email protected]>; [email protected]
>Cc: [email protected]; [email protected];
>[email protected]; [email protected]; Jerin Jacob
><[email protected]>; [email protected]
>Subject: [EXTERNAL] Re: [PATCH v4 1/1] lib/dma: introduce inter-process and
>inter-OS DMA
>
>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 ZjQcmQRYFpfptBannerStart
>Prioritize security for external emails:
>Confirm sender and content safety before clicking links or opening
>attachments <https://us-phishalarm-
>ewt.proofpoint.com/EWT/v1/CRVmXkqW!tg3T1fUeg1V6HqwW2f3ajfUSFVFe
>SbtXJSSGR1d3qnuqzo3OfbjKl24ZuXOC375prAstNSCkOPXj96o4H2iZsGSW94E7
>UAoZMQE$>
>Report Suspicious
>
>ZjQcmQRYFpfptBannerEnd
>
>Acked-by: Chengwen Feng <[email protected]>
><mailto:[email protected]>
>
>
>
>
>
>On 2025/10/17 13:42, Vamsi Krishna wrote:
>
>
>       From: Vamsi Attunuru <[email protected]>
><mailto:[email protected]>
>
>       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 <[email protected]>
><mailto:[email protected]>
>       ---
>       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);
>        )
>

Reply via email to