On Fri, Apr 17, 2020 at 12:56 PM Fu, Patrick <patrick...@intel.com> wrote:
>
> Background
> ====================================
> DPDK vhost library implements a user-space VirtIO net backend allowing host 
> applications to directly communicate with VirtIO front-end in VMs and 
> containers. However, every vhost enqueue/dequeue operation requires to copy 
> packet buffers between guest and host memory. The overhead of copying large 
> bulk of data makes the vhost backend become the I/O bottleneck. DMA engines, 
> including un-core DMA accelerator, like Crystal Beach DMA (CBDMA) and Data 
> Streaming Accelerator (DSA), and discrete card general purpose DMA, are 
> extremely efficient in data movement within system memory. Therefore, we 
> propose a set of asynchronous DMA data movement API in vhost library for DMA 
> acceleration. With offloading packet copies in vhost data-path from the CPU 
> to the DMA engine, which can not only accelerate data transfers, but also 
> save precious CPU core resources.
>
> New API Overview
> ====================================
> The proposed APIs in the vhost library support various DMA engines to 
> accelerate data transfers in the data-path. For the higher performance, DMA 
> engines work in an asynchronous manner, where DMA data transfers and CPU 
> computations are executed in parallel. The proposed API consists of control 
> path API and data path API. The control path API includes Registration API 
> and DMA operation callback, and the data path API includes asynchronous API. 
> To remove the dependency of vendor specific DMA engines, the DMA operation 
> callback provides generic DMA data transfer abstractions. To support 
> asynchronous DMA data movement, the new async API provides asynchronous ring 
> operation semantic in data-path. To enable/disable DMA acceleration for 
> virtqueues, users need to use registration API is to register/unregister DMA 
> callback implementations to the vhost library and bind DMA channels to 
> virtqueues. The DMA channels used by virtqueues are provided by DPDK 
> applications, which is backed by  virtual or physical DMA devices.
> The proposed APIs are consisted of 3 sub-sets:
> 1. DMA Registration APIs
> 2. DMA Operation Callbacks
> 3. Async Data APIs
>
> DMA Registration APIs
> ====================================
> DMA acceleration is per queue basis. DPDK applications need to explicitly 
> decide whether a virtqueue needs DMA acceleration and which DMA channel to 
> use. In addition, a DMA channel is dedicated to a virtqueue and a DMA channel 
> cannot be bound to multiple virtqueues at the same time. To enable DMA 
> acceleration for a virtqueue, DPDK applications need to implement DMA 
> operation callbacks for a specific DMA type (e.g. CBDMA) first, then register 
> the callbacks to the vhost library and bind a DMA channel to a virtqueue, and 
> finally use the new async API to perform data-path operations on the 
> virtqueue.
> The definitions of registration API are shown below:
> int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
>                                         struct rte_vdma_device_ops *ops);
>
> int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id);

We already have multiple DMA implementation over raw dev.
Why not make a new dmadev class for DMA acceleration and use it by
virtio and any other clients?

Reply via email to