[v12,6/7] bbdev: add queue related warning and status information
Checks
Commit Message
This allows to expose more information with regards to any
queue related failure and warning which cannot be supported
in existing API.
Signed-off-by: Nicolas Chautru <nicolas.chautru@intel.com>
Acked-by: Maxime Coquelin <maxime.coquelin@redhat.com>
---
app/test-bbdev/test_bbdev_perf.c | 2 ++
doc/guides/rel_notes/release_22_11.rst | 3 ++
lib/bbdev/rte_bbdev.c | 19 ++++++++++++
lib/bbdev/rte_bbdev.h | 43 ++++++++++++++++++++++++++
lib/bbdev/version.map | 1 +
5 files changed, 68 insertions(+)
@@ -4361,6 +4361,8 @@ get_bbdev_queue_stats(uint16_t dev_id, uint16_t queue_id,
stats->dequeued_count = q_stats->dequeued_count;
stats->enqueue_err_count = q_stats->enqueue_err_count;
stats->dequeue_err_count = q_stats->dequeue_err_count;
+ stats->enqueue_warning_count = q_stats->enqueue_warning_count;
+ stats->dequeue_warning_count = q_stats->dequeue_warning_count;
stats->acc_offload_cycles = q_stats->acc_offload_cycles;
return 0;
@@ -329,6 +329,9 @@ ABI Changes
* bbdev: Structure ``rte_bbdev_driver_info`` was updated to add new parameters
for queue topology, device status using ``rte_bbdev_device_status``.
+* bbdev: Structure ``rte_bbdev_queue_data`` was updated to add new parameter
+ for enqueue status using ``rte_bbdev_enqueue_status``.
+
Known Issues
------------
@@ -721,6 +721,8 @@ get_stats_from_queues(struct rte_bbdev *dev, struct rte_bbdev_stats *stats)
stats->dequeued_count += q_stats->dequeued_count;
stats->enqueue_err_count += q_stats->enqueue_err_count;
stats->dequeue_err_count += q_stats->dequeue_err_count;
+ stats->enqueue_warn_count += q_stats->enqueue_warn_count;
+ stats->dequeue_warn_count += q_stats->dequeue_warn_count;
}
rte_bbdev_log_debug("Got stats on %u", dev->data->dev_id);
}
@@ -1163,3 +1165,20 @@ rte_bbdev_device_status_str(enum rte_bbdev_device_status status)
rte_bbdev_log(ERR, "Invalid device status");
return NULL;
}
+
+const char *
+rte_bbdev_enqueue_status_str(enum rte_bbdev_enqueue_status status)
+{
+ static const char * const enq_sta_string[] = {
+ "RTE_BBDEV_ENQ_STATUS_NONE",
+ "RTE_BBDEV_ENQ_STATUS_QUEUE_FULL",
+ "RTE_BBDEV_ENQ_STATUS_RING_FULL",
+ "RTE_BBDEV_ENQ_STATUS_INVALID_OP",
+ };
+
+ if (status < sizeof(enq_sta_string) / sizeof(char *))
+ return enq_sta_string[status];
+
+ rte_bbdev_log(ERR, "Invalid enqueue status");
+ return NULL;
+}
@@ -35,6 +35,13 @@ extern "C" {
#define RTE_BBDEV_MAX_DEVS 128 /**< Max number of devices */
#endif
+/*
+ * Maximum size to be used to manage the enum rte_bbdev_enqueue_status
+ * including padding for future enum insertion.
+ * The enum values must be explicitly kept smaller or equal to this padded maximum size.
+ */
+#define RTE_BBDEV_ENQ_STATUS_SIZE_MAX 6
+
/** Flags indicate current state of BBDEV device */
enum rte_bbdev_state {
RTE_BBDEV_UNUSED,
@@ -223,6 +230,21 @@ rte_bbdev_queue_start(uint16_t dev_id, uint16_t queue_id);
int
rte_bbdev_queue_stop(uint16_t dev_id, uint16_t queue_id);
+/**
+ * Flags indicate the reason why a previous enqueue may not have
+ * consumed all requested operations.
+ * In case of multiple reasons the latter supersedes a previous one.
+ * The related macro RTE_BBDEV_ENQ_STATUS_SIZE_MAX can be used as an absolute maximum for
+ * notably sizing array while allowing for future enumeration insertion.
+ */
+enum rte_bbdev_enqueue_status {
+ RTE_BBDEV_ENQ_STATUS_NONE, /**< Nothing to report */
+ RTE_BBDEV_ENQ_STATUS_QUEUE_FULL, /**< Not enough room in queue */
+ RTE_BBDEV_ENQ_STATUS_RING_FULL, /**< Not enough room in ring */
+ RTE_BBDEV_ENQ_STATUS_INVALID_OP, /**< Operation was rejected as invalid */
+ /* Note: RTE_BBDEV_ENQ_STATUS_SIZE_MAX must be larger or equal to maximum enum value */
+};
+
/**
* Flags indicate the status of the device
*/
@@ -246,6 +268,12 @@ struct rte_bbdev_stats {
uint64_t enqueue_err_count;
/** Total error count on operations dequeued */
uint64_t dequeue_err_count;
+ /** Total warning count on operations enqueued */
+ uint64_t enqueue_warn_count;
+ /** Total warning count on operations dequeued */
+ uint64_t dequeue_warn_count;
+ /** Total enqueue status count based on rte_bbdev_enqueue_status enum */
+ uint64_t enqueue_status_count[RTE_BBDEV_ENQ_STATUS_SIZE_MAX];
/** CPU cycles consumed by the (HW/SW) accelerator device to offload
* the enqueue request to its internal queues.
* - For a HW device this is the cycles consumed in MMIO write
@@ -386,6 +414,7 @@ struct rte_bbdev_queue_data {
void *queue_private; /**< Driver-specific per-queue data */
struct rte_bbdev_queue_conf conf; /**< Current configuration */
struct rte_bbdev_stats queue_stats; /**< Queue statistics */
+ enum rte_bbdev_enqueue_status enqueue_status; /**< Enqueue status when op is rejected */
bool started; /**< Queue state */
};
@@ -938,6 +967,20 @@ __rte_experimental
const char*
rte_bbdev_device_status_str(enum rte_bbdev_device_status status);
+/**
+ * Convert queue status from enum to string.
+ *
+ * @param status
+ * Queue status as enum.
+ *
+ * @returns
+ * Queue status as string or NULL if op_type is invalid.
+ *
+ */
+__rte_experimental
+const char*
+rte_bbdev_enqueue_status_str(enum rte_bbdev_enqueue_status status);
+
#ifdef __cplusplus
}
#endif
@@ -47,6 +47,7 @@ EXPERIMENTAL {
rte_bbdev_dequeue_fft_ops;
rte_bbdev_device_status_str;
rte_bbdev_enqueue_fft_ops;
+ rte_bbdev_enqueue_status_str;
rte_bbdev_fft_op_alloc_bulk;
rte_bbdev_fft_op_free_bulk;
};