Thread (79 messages) 79 messages, 10 authors, 2021-07-06

Re: [dpdk-dev] [RFC PATCH] dmadev: introduce DMA device library

From: Jerin Jacob <hidden>
Date: 2021-06-24 07:03:34

On Wed, Jun 23, 2021 at 9:20 AM fengchengwen [off-list ref] wrote:
quoted
quoted
So I prefer following prototype:
  uint16_t rte_dmadev_completed(uint16_t dev_id, dma_cookie_t *cookie, uint16_t nb_cpls, bool *has_error)
    -- nb_cpls: indicate max process operations number
    -- has_error: indicate if there is an error
    -- return value: the number of successful completed operations.
    -- example:
       1) If there are already 32 completed ops, and 4th is error, and nb_cpls is 32, then
          the ret will be 3(because 1/2/3th is OK), and has_error will be true.
       2) If there are already 32 completed ops, and all successful completed, then the ret
          will be min(32, nb_cpls), and has_error will be false.
       3) If there are already 32 completed ops, and all failed completed, then the ret will
          be 0, and has_error will be true.
  uint16_t rte_dmadev_completed_status(uint16_t dev_id, dma_cookie_t *cookie, uint16_t nb_status, uint32_t *status)
    -- return value: the number of failed completed operations.


In typical storage use cases etc, Sometimes application need to
provide scatter-gather list,
At least in our hardware sg list gives a "single completion result"
and it stops on the first failure to restart
the transfer by application. Have you thought of scatter-gather use
case and how it is in other  HW?
cookie and request are in a one-to-one correspondence, whether the request is a single or sg-list.
Kunpeng9x0 don't support sg-list, I'm still investigating other hardware.

The above 'restart the transfer by application' mean re-schedule request (and have one new cookie) or
just re-enable current failed request (this may introduce new API) ?
quoted
prototype like the following works for us:
rte_dmadev_enq_sg(void **src, void **dest, unsigned int **length, int
nb_segments, cookie, ,,,)
OK, we could define one scatter-list struct to wrap src/dest/length.

Inspired from following system call [1]

[1]
https://man7.org/linux/man-pages/man2/process_vm_readv.2.html

I propose the following style syntax for the sg list

struct rte_dma_iovec {
    void  *iov_base;    /* Starting address */
    size_t iov_len;     /* Number of bytes to transfer */
};

rte_dmadev_enq_sg(const struct rte_dma_iovec  *src_iov, unsigned int srcvcnt,
const struct rte_dma_iovec  *dst_iov, unsigned int dstvcnt, ....)

The reason for separating iov_len for src and dest is the many to one case and
one to many cases.  Example:
Copy of Multiple 2MB of 15 source segments to one 30MB dest. Quite use
full in storage use cases.

quoted
quoted
The application use the following invocation order when polling:
  has_error = false; // could be init to false by dmadev API, we need discuss
  ret = rte_dmadev_completed(dev_id, &cookie, bust_size, &has_error);
  // process successful completed case:
  for (int i = 0; i < ret; i++) {
  }
  if (unlikely(has_error)) {
    // process failed completed case
    ret = rte_dmadev_completed_status(dev_id, &cookie, burst_size - ret, status_array);
    for (int i = 0; i < ret; i++) {
      // ...
    }
  }

quoted
This two-function approach also allows future support for other DMA
functions such as comparison, where a status value is always required. Any
apps using that functionality would just always use the "_status" function
for completions.

/Bruce

.
.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help