[v4,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>
---
app/test-bbdev/test_bbdev_perf.c | 2 ++
lib/bbdev/rte_bbdev.c | 21 +++++++++++++++++++++
lib/bbdev/rte_bbdev.h | 34 ++++++++++++++++++++++++++++++++++
lib/bbdev/version.map | 1 +
4 files changed, 58 insertions(+)
Comments
On 7/5/22 5:23 PM, Nicolas Chautru wrote:
> 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>
> ---
> app/test-bbdev/test_bbdev_perf.c | 2 ++
> lib/bbdev/rte_bbdev.c | 21 +++++++++++++++++++++
> lib/bbdev/rte_bbdev.h | 34 ++++++++++++++++++++++++++++++++++
> lib/bbdev/version.map | 1 +
> 4 files changed, 58 insertions(+)
>
> diff --git a/app/test-bbdev/test_bbdev_perf.c b/app/test-bbdev/test_bbdev_perf.c
> index 1abda2d..653b21f 100644
> --- a/app/test-bbdev/test_bbdev_perf.c
> +++ b/app/test-bbdev/test_bbdev_perf.c
> @@ -4360,6 +4360,8 @@ typedef int (test_case_function)(struct active_device *ad,
> 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;
> diff --git a/lib/bbdev/rte_bbdev.c b/lib/bbdev/rte_bbdev.c
> index 28b105d..ddad464 100644
> --- a/lib/bbdev/rte_bbdev.c
> +++ b/lib/bbdev/rte_bbdev.c
> @@ -27,6 +27,8 @@
> #define BBDEV_OP_TYPE_COUNT 6
> /* Number of supported device status */
> #define BBDEV_DEV_STATUS_COUNT 9
> +/* Number of supported enqueue status */
> +#define BBDEV_ENQ_STATUS_COUNT 4
>
> /* BBDev library logging ID */
> RTE_LOG_REGISTER_DEFAULT(bbdev_logtype, NOTICE);
> @@ -723,6 +725,8 @@ struct rte_bbdev *
> 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);
> }
> @@ -1165,3 +1169,20 @@ struct rte_mempool *
> 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 < BBDEV_ENQ_STATUS_COUNT)
Single use of #define, could just be an array size check and remove the
#define
> + return enq_sta_string[status];
> +
> + rte_bbdev_log(ERR, "Invalid enqueue status");
> + return NULL;
> +}
> diff --git a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h
> index ed528b8..b7ecf94 100644
> --- a/lib/bbdev/rte_bbdev.h
> +++ b/lib/bbdev/rte_bbdev.h
> @@ -224,6 +224,19 @@ struct rte_bbdev_queue_conf {
> 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 superdes a previous one
> + */
> +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 */
> + RTE_BBDEV_ENQ_STATUS_PADDED_MAX = 6, /**< Maximum enq status number including padding */
Pad to 8 like the other patch ?
> +};
> +
> +/**
> * Flags indicate the status of the device
> */
> enum rte_bbdev_device_status {
> @@ -246,6 +259,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_PADDED_MAX];
This element is not used in this patch, is it needed ?
> /** 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 +405,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 */
This element is not used in this patch, is it needed ?
Tom
> bool started; /**< Queue state */
> };
>
> @@ -938,6 +958,20 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
> const char*
> rte_bbdev_device_status_str(enum rte_bbdev_device_status status);
>
> +/**
> + * Converts 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
> diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map
> index efae50b..1c06738 100644
> --- a/lib/bbdev/version.map
> +++ b/lib/bbdev/version.map
> @@ -44,6 +44,7 @@ EXPERIMENTAL {
> global:
>
> rte_bbdev_device_status_str;
> + rte_bbdev_enqueue_status_str;
> rte_bbdev_enqueue_fft_ops;
> rte_bbdev_dequeue_fft_ops;
> rte_bbdev_fft_op_alloc_bulk;
Hi Tom,
> -----Original Message-----
> From: Tom Rix <trix@redhat.com>
>
>
> On 7/5/22 5:23 PM, Nicolas Chautru wrote:
> > 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>
> > ---
> > app/test-bbdev/test_bbdev_perf.c | 2 ++
> > lib/bbdev/rte_bbdev.c | 21 +++++++++++++++++++++
> > lib/bbdev/rte_bbdev.h | 34 ++++++++++++++++++++++++++++++++++
> > lib/bbdev/version.map | 1 +
> > 4 files changed, 58 insertions(+)
> >
> > diff --git a/app/test-bbdev/test_bbdev_perf.c
> > b/app/test-bbdev/test_bbdev_perf.c
> > index 1abda2d..653b21f 100644
> > --- a/app/test-bbdev/test_bbdev_perf.c
> > +++ b/app/test-bbdev/test_bbdev_perf.c
> > @@ -4360,6 +4360,8 @@ typedef int (test_case_function)(struct
> active_device *ad,
> > 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;
> > diff --git a/lib/bbdev/rte_bbdev.c b/lib/bbdev/rte_bbdev.c index
> > 28b105d..ddad464 100644
> > --- a/lib/bbdev/rte_bbdev.c
> > +++ b/lib/bbdev/rte_bbdev.c
> > @@ -27,6 +27,8 @@
> > #define BBDEV_OP_TYPE_COUNT 6
> > /* Number of supported device status */
> > #define BBDEV_DEV_STATUS_COUNT 9
> > +/* Number of supported enqueue status */ #define
> > +BBDEV_ENQ_STATUS_COUNT 4
> >
> > /* BBDev library logging ID */
> > RTE_LOG_REGISTER_DEFAULT(bbdev_logtype, NOTICE); @@ -723,6 +725,8
> @@
> > struct rte_bbdev *
> > 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);
> > }
> > @@ -1165,3 +1169,20 @@ struct rte_mempool *
> > 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 < BBDEV_ENQ_STATUS_COUNT)
> Single use of #define, could just be an array size check and remove the #define
Thanks, good point.
> > + return enq_sta_string[status];
> > +
> > + rte_bbdev_log(ERR, "Invalid enqueue status");
> > + return NULL;
> > +}
> > diff --git a/lib/bbdev/rte_bbdev.h b/lib/bbdev/rte_bbdev.h index
> > ed528b8..b7ecf94 100644
> > --- a/lib/bbdev/rte_bbdev.h
> > +++ b/lib/bbdev/rte_bbdev.h
> > @@ -224,6 +224,19 @@ struct rte_bbdev_queue_conf {
> > 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 superdes a previous one */
> > +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 */
> > + RTE_BBDEV_ENQ_STATUS_PADDED_MAX = 6, /**< Maximum enq
> status number including padding */
> Pad to 8 like the other patch ?
It doesn't have to be the same number, just a bit of room for growth.
> > +};
> > +
> > +/**
> > * Flags indicate the status of the device
> > */
> > enum rte_bbdev_device_status {
> > @@ -246,6 +259,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_PADDED_MAX];
> This element is not used in this patch, is it needed ?
> > /** 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 +405,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 */
>
> This element is not used in this patch, is it needed ?
This is exposed to both PMD and application through this commit at queue granularity. Said otherwise the PMD would then set this based on events detected in the PMD implementation.
>
> Tom
>
> > bool started; /**< Queue state */
> > };
> >
> > @@ -938,6 +958,20 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
> > const char*
> > rte_bbdev_device_status_str(enum rte_bbdev_device_status status);
> >
> > +/**
> > + * Converts 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
> > diff --git a/lib/bbdev/version.map b/lib/bbdev/version.map index
> > efae50b..1c06738 100644
> > --- a/lib/bbdev/version.map
> > +++ b/lib/bbdev/version.map
> > @@ -44,6 +44,7 @@ EXPERIMENTAL {
> > global:
> >
> > rte_bbdev_device_status_str;
> > + rte_bbdev_enqueue_status_str;
> > rte_bbdev_enqueue_fft_ops;
> > rte_bbdev_dequeue_fft_ops;
> > rte_bbdev_fft_op_alloc_bulk;
@@ -4360,6 +4360,8 @@ typedef int (test_case_function)(struct active_device *ad,
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;
@@ -27,6 +27,8 @@
#define BBDEV_OP_TYPE_COUNT 6
/* Number of supported device status */
#define BBDEV_DEV_STATUS_COUNT 9
+/* Number of supported enqueue status */
+#define BBDEV_ENQ_STATUS_COUNT 4
/* BBDev library logging ID */
RTE_LOG_REGISTER_DEFAULT(bbdev_logtype, NOTICE);
@@ -723,6 +725,8 @@ struct rte_bbdev *
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);
}
@@ -1165,3 +1169,20 @@ struct rte_mempool *
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 < BBDEV_ENQ_STATUS_COUNT)
+ return enq_sta_string[status];
+
+ rte_bbdev_log(ERR, "Invalid enqueue status");
+ return NULL;
+}
@@ -224,6 +224,19 @@ struct rte_bbdev_queue_conf {
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 superdes a previous one
+ */
+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 */
+ RTE_BBDEV_ENQ_STATUS_PADDED_MAX = 6, /**< Maximum enq status number including padding */
+};
+
+/**
* Flags indicate the status of the device
*/
enum rte_bbdev_device_status {
@@ -246,6 +259,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_PADDED_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 +405,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 +958,20 @@ typedef void (*rte_bbdev_cb_fn)(uint16_t dev_id,
const char*
rte_bbdev_device_status_str(enum rte_bbdev_device_status status);
+/**
+ * Converts 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
@@ -44,6 +44,7 @@ EXPERIMENTAL {
global:
rte_bbdev_device_status_str;
+ rte_bbdev_enqueue_status_str;
rte_bbdev_enqueue_fft_ops;
rte_bbdev_dequeue_fft_ops;
rte_bbdev_fft_op_alloc_bulk;