X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fcommon%2Fqat%2Fqat_common.c;h=5343a1451e8a3a896e0331a77ce3ef497aa57fc9;hb=aa6dc1017cd3fa7b722ca877558e871f82eb1f02;hp=c206d3b70239a27f850abf3270e1ef46ce5c47b2;hpb=98c4a35c736fb6c214416b67e80acb689d6fc877;p=dpdk.git diff --git a/drivers/common/qat/qat_common.c b/drivers/common/qat/qat_common.c index c206d3b702..5343a1451e 100644 --- a/drivers/common/qat/qat_common.c +++ b/drivers/common/qat/qat_common.c @@ -7,50 +7,66 @@ #include "qat_logs.h" int -qat_sgl_fill_array(struct rte_mbuf *buf, uint64_t buf_start, - struct qat_sgl *list, uint32_t data_len) +qat_sgl_fill_array(struct rte_mbuf *buf, int64_t offset, + void *list_in, uint32_t data_len, + const uint16_t max_segs) { - int nr = 1; - - uint32_t buf_len = rte_pktmbuf_iova(buf) - - buf_start + rte_pktmbuf_data_len(buf); - - list->buffers[0].addr = buf_start; - list->buffers[0].resrvd = 0; - list->buffers[0].len = buf_len; - - if (data_len <= buf_len) { - list->num_bufs = nr; - list->buffers[0].len = data_len; - return 0; - } - - buf = buf->next; - while (buf) { - if (unlikely(nr == QAT_SGL_MAX_NUMBER)) { - QAT_LOG(ERR, - "QAT PMD exceeded size of QAT SGL entry(%u)", - QAT_SGL_MAX_NUMBER); - return -EINVAL; + int res = -EINVAL; + uint32_t buf_len, nr; + struct qat_sgl *list = (struct qat_sgl *)list_in; +#if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG + uint8_t *virt_addr[max_segs]; +#endif + + for (nr = buf_len = 0; buf && nr < max_segs; buf = buf->next) { + if (offset >= rte_pktmbuf_data_len(buf)) { + offset -= rte_pktmbuf_data_len(buf); + continue; } - list->buffers[nr].len = rte_pktmbuf_data_len(buf); + list->buffers[nr].len = rte_pktmbuf_data_len(buf) - offset; list->buffers[nr].resrvd = 0; - list->buffers[nr].addr = rte_pktmbuf_iova(buf); + list->buffers[nr].addr = rte_pktmbuf_iova_offset(buf, offset); +#if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG + virt_addr[nr] = rte_pktmbuf_mtod_offset(buf, uint8_t*, offset); +#endif + offset = 0; buf_len += list->buffers[nr].len; - buf = buf->next; - if (buf_len > data_len) { - list->buffers[nr].len -= - buf_len - data_len; - buf = NULL; + if (buf_len >= data_len) { + list->buffers[nr].len -= buf_len - data_len; + res = 0; + break; } ++nr; } - list->num_bufs = nr; - return 0; + if (unlikely(res != 0)) { + if (nr == max_segs) { + QAT_DP_LOG(ERR, "Exceeded max segments in QAT SGL (%u)", + max_segs); + } else { + QAT_DP_LOG(ERR, "Mbuf chain is too short"); + } + } else { + + list->num_bufs = ++nr; +#if RTE_LOG_DP_LEVEL >= RTE_LOG_DEBUG + QAT_DP_LOG(INFO, "SGL with %d buffers:", list->num_bufs); + for (nr = 0; nr < list->num_bufs; nr++) { + QAT_DP_LOG(INFO, + "QAT SGL buf %d, len = %d, iova = 0x%012"PRIx64, + nr, list->buffers[nr].len, + list->buffers[nr].addr); + QAT_DP_HEXDUMP_LOG(DEBUG, "qat SGL", + virt_addr[nr], + list->buffers[nr].len); + } +#endif + } + + return res; } void qat_stats_get(struct qat_pci_device *dev, @@ -78,6 +94,9 @@ void qat_stats_get(struct qat_pci_device *dev, stats->dequeued_count += qp[i]->stats.dequeued_count; stats->enqueue_err_count += qp[i]->stats.enqueue_err_count; stats->dequeue_err_count += qp[i]->stats.dequeue_err_count; + stats->threshold_hit_count += qp[i]->stats.threshold_hit_count; + QAT_LOG(DEBUG, "Threshold was used for qp %d %"PRIu64" times", + i, stats->threshold_hit_count); } }