X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=examples%2Fvhost%2Fioat.c;h=457f8171f061800b7182d6ee870276f8f640507e;hb=25829b55b463f7bb0b69af0e63b19121a16d2a63;hp=b2c74f65379f22668d576bae407fbb67882c7b3f;hpb=abec60e7115dc3197ffc94a1eee9353b9b808600;p=dpdk.git diff --git a/examples/vhost/ioat.c b/examples/vhost/ioat.c index b2c74f6537..457f8171f0 100644 --- a/examples/vhost/ioat.c +++ b/examples/vhost/ioat.c @@ -1,9 +1,11 @@ /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2020 Intel Corporation */ + +#include +#ifdef RTE_RAW_IOAT #include #include -#include #include "ioat.h" #include "main.h" @@ -15,11 +17,11 @@ struct packet_tracker { unsigned short next_read; unsigned short next_write; unsigned short last_remain; + unsigned short ioat_space; }; struct packet_tracker cb_tracker[MAX_VHOST_DEVICE]; - int open_ioat(const char *value) { @@ -36,7 +38,7 @@ open_ioat(const char *value) int ret = 0; uint16_t i = 0; char *dma_arg[MAX_VHOST_DEVICE]; - uint8_t args_nr; + int args_nr; while (isblank(*addrs)) addrs++; @@ -54,9 +56,18 @@ open_ioat(const char *value) } args_nr = rte_strsplit(substr, strlen(substr), dma_arg, MAX_VHOST_DEVICE, ','); - do { + if (args_nr <= 0) { + ret = -1; + goto out; + } + while (i < args_nr) { char *arg_temp = dma_arg[i]; - rte_strsplit(arg_temp, strlen(arg_temp), ptrs, 2, '@'); + uint8_t sub_nr; + sub_nr = rte_strsplit(arg_temp, strlen(arg_temp), ptrs, 2, '@'); + if (sub_nr != 2) { + ret = -1; + goto out; + } start = strstr(ptrs[0], "txd"); if (start == NULL) { @@ -102,22 +113,22 @@ open_ioat(const char *value) goto out; } rte_rawdev_start(dev_id); - + cb_tracker[dev_id].ioat_space = IOAT_RING_SIZE - 1; dma_info->nr++; i++; - } while (i < args_nr); + } out: free(input); return ret; } -uint32_t +int32_t ioat_transfer_data_cb(int vid, uint16_t queue_id, struct rte_vhost_async_desc *descs, struct rte_vhost_async_status *opaque_data, uint16_t count) { uint32_t i_desc; - int dev_id = dma_bind[vid].dmas[queue_id * 2 + VIRTIO_RXQ].dev_id; + uint16_t dev_id = dma_bind[vid].dmas[queue_id * 2 + VIRTIO_RXQ].dev_id; struct rte_vhost_iov_iter *src = NULL; struct rte_vhost_iov_iter *dst = NULL; unsigned long i_seg; @@ -129,13 +140,9 @@ ioat_transfer_data_cb(int vid, uint16_t queue_id, src = descs[i_desc].src; dst = descs[i_desc].dst; i_seg = 0; + if (cb_tracker[dev_id].ioat_space < src->nr_segs) + break; while (i_seg < src->nr_segs) { - /* - * TODO: Assuming that the ring space of the - * IOAT device is large enough, so there is no - * error here, and the actual error handling - * will be added later. - */ rte_ioat_enqueue_copy(dev_id, (uintptr_t)(src->iov[i_seg].iov_base) + src->offset, @@ -147,7 +154,8 @@ ioat_transfer_data_cb(int vid, uint16_t queue_id, i_seg++; } write &= mask; - cb_tracker[dev_id].size_track[write] = i_seg; + cb_tracker[dev_id].size_track[write] = src->nr_segs; + cb_tracker[dev_id].ioat_space -= src->nr_segs; write++; } } else { @@ -160,24 +168,35 @@ ioat_transfer_data_cb(int vid, uint16_t queue_id, return i_desc; } -uint32_t +int32_t ioat_check_completed_copies_cb(int vid, uint16_t queue_id, struct rte_vhost_async_status *opaque_data, uint16_t max_packets) { if (!opaque_data) { uintptr_t dump[255]; - unsigned short n_seg; + int n_seg; unsigned short read, write; unsigned short nb_packet = 0; unsigned short mask = MAX_ENQUEUED_SIZE - 1; unsigned short i; - int dev_id = dma_bind[vid].dmas[queue_id * 2 + + uint16_t dev_id = dma_bind[vid].dmas[queue_id * 2 + VIRTIO_RXQ].dev_id; - n_seg = rte_ioat_completed_ops(dev_id, 255, dump, dump); - n_seg += cb_tracker[dev_id].last_remain; - if (!n_seg) + n_seg = rte_ioat_completed_ops(dev_id, 255, NULL, NULL, dump, dump); + if (n_seg < 0) { + RTE_LOG(ERR, + VHOST_DATA, + "fail to poll completed buf on IOAT device %u", + dev_id); + return 0; + } + if (n_seg == 0) return 0; + + cb_tracker[dev_id].ioat_space += n_seg; + n_seg += cb_tracker[dev_id].last_remain; + read = cb_tracker[dev_id].next_read; write = cb_tracker[dev_id].next_write; for (i = 0; i < max_packets; i++) { @@ -199,3 +218,5 @@ ioat_check_completed_copies_cb(int vid, uint16_t queue_id, /* Opaque data is not supported */ return -1; } + +#endif /* RTE_RAW_IOAT */