From 45e8a672f02f5937d218b0b82eca28db15b76694 Mon Sep 17 00:00:00 2001 From: Piotr Bronowski Date: Thu, 6 Jul 2023 23:02:57 +0000 Subject: dpdk-cryptodev: improve cryptodev cache ring implementation Sw ring is renamed to the cache ring. This name better reflects the puropse of this ring. We've introduced push/pop functions, as well as other utility functions which remove code repetition. Error handlig is improved: previously in case of an error all frame elements were marked as bad, now only these for which errors occured have the error status set. Unnecessary stats counters have been removed. Type: improvement Signed-off-by: Piotr Bronowski Change-Id: I2fd42a529ac84ce5ad260611d6b35a861d441c79 --- src/plugins/dpdk/cryptodev/cryptodev.c | 55 ++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 13 deletions(-) (limited to 'src/plugins/dpdk/cryptodev/cryptodev.c') diff --git a/src/plugins/dpdk/cryptodev/cryptodev.c b/src/plugins/dpdk/cryptodev/cryptodev.c index fa54d2bf4fc..c66e9ed9427 100644 --- a/src/plugins/dpdk/cryptodev/cryptodev.c +++ b/src/plugins/dpdk/cryptodev/cryptodev.c @@ -667,37 +667,66 @@ VLIB_CLI_COMMAND (show_cryptodev_assignment, static) = { }; static clib_error_t * -cryptodev_show_sw_rings_fn (vlib_main_t *vm, unformat_input_t *input, - vlib_cli_command_t *cmd) +cryptodev_show_cache_rings_fn (vlib_main_t *vm, unformat_input_t *input, + vlib_cli_command_t *cmd) { cryptodev_main_t *cmt = &cryptodev_main; u32 thread_index = 0; vec_foreach_index (thread_index, cmt->per_thread_data) { cryptodev_engine_thread_t *cet = cmt->per_thread_data + thread_index; + cryptodev_cache_ring_t *ring = &cet->cache_ring; + u16 head = ring->head; + u16 tail = ring->tail; + u16 n_cached = ((head == tail) && (ring->frames[head].f == 0)) ? + 0 : + ((head == tail) && (ring->frames[head].f != 0)) ? + (CRYPTODEV_CACHE_QUEUE_MASK + 1) : + (head > tail) ? + (head - tail) : + (CRYPTODEV_CACHE_QUEUE_MASK - tail + head); + + u16 enq_head = ring->enq_head; + u16 deq_tail = ring->deq_tail; + u16 n_frames_inflight = + ((enq_head == deq_tail) && (ring->frames[enq_head].f == 0)) ? + 0 : + ((enq_head == deq_tail) && (ring->frames[enq_head].f != 0)) ? + CRYPTODEV_CACHE_QUEUE_MASK + 1 : + (enq_head > deq_tail) ? + (enq_head - deq_tail) : + (CRYPTODEV_CACHE_QUEUE_MASK - deq_tail + enq_head); + + u16 n_frames_processed = + ((tail == deq_tail) && (ring->frames[deq_tail].f == 0)) ? + 0 : + ((tail == deq_tail) && (ring->frames[deq_tail].f != 0)) ? + (CRYPTODEV_CACHE_QUEUE_MASK + 1) : + (deq_tail > tail) ? (deq_tail - tail) : + (CRYPTODEV_CACHE_QUEUE_MASK - tail + deq_tail); + if (vlib_num_workers () > 0 && thread_index == 0) continue; vlib_cli_output (vm, "\n\n"); - vlib_cli_output (vm, "Frames total: %d", cet->frames_on_ring); - vlib_cli_output (vm, "Frames pending in a ring: %d", - cet->frames_on_ring - cet->enqueued_not_dequeueq - - cet->deqeued_not_returned); + vlib_cli_output (vm, "Frames total: %d", n_cached); + vlib_cli_output (vm, "Frames pending in the ring: %d", + n_cached - n_frames_inflight - n_frames_processed); vlib_cli_output (vm, "Frames enqueued but not dequeued: %d", - cet->enqueued_not_dequeueq); + n_frames_inflight); vlib_cli_output (vm, "Frames dequed but not returned: %d", - cet->deqeued_not_returned); + n_frames_processed); vlib_cli_output (vm, "inflight: %d", cet->inflight); - vlib_cli_output (vm, "Head: %d", cet->frame_ring.head); - vlib_cli_output (vm, "Tail: %d", cet->frame_ring.tail); + vlib_cli_output (vm, "Head: %d", ring->head); + vlib_cli_output (vm, "Tail: %d", ring->tail); vlib_cli_output (vm, "\n\n"); } return 0; } VLIB_CLI_COMMAND (show_cryptodev_sw_rings, static) = { - .path = "show cryptodev sw-ring status", - .short_help = "show status of all cryptodev software rings", - .function = cryptodev_show_sw_rings_fn, + .path = "show cryptodev cache status", + .short_help = "show status of all cryptodev cache rings", + .function = cryptodev_show_cache_rings_fn, }; static clib_error_t * -- cgit 1.2.3-korg