/* Amount of data plane context processed. */
_Atomic uint32_t dplane_contexts;
- /* Amount of data plane contexts enqueued. */
- _Atomic uint32_t ctxqueue_len;
/* Peak amount of data plane contexts enqueued. */
_Atomic uint32_t ctxqueue_len_peak;
FPM_STR
"FPM statistic counters\n")
{
+ uint32_t curr_queue_len;
+
+ frr_with_mutex (&gfnc->ctxqueue_mutex) {
+ curr_queue_len = dplane_ctx_queue_count(&gfnc->ctxqueue);
+ }
+
vty_out(vty, "%30s\n%30s\n", "FPM counters", "============");
#define SHOW_COUNTER(label, counter) \
SHOW_COUNTER("Connection errors", gfnc->counters.connection_errors);
SHOW_COUNTER("Data plane items processed",
gfnc->counters.dplane_contexts);
- SHOW_COUNTER("Data plane items enqueued",
- gfnc->counters.ctxqueue_len);
+ SHOW_COUNTER("Data plane items enqueued", curr_queue_len);
SHOW_COUNTER("Data plane items queue peak",
gfnc->counters.ctxqueue_len_peak);
SHOW_COUNTER("Buffer full hits", gfnc->counters.buffer_full);
"FPM statistic counters\n"
JSON_STR)
{
+ uint32_t curr_queue_len;
+
+ frr_with_mutex (&gfnc->ctxqueue_mutex) {
+ curr_queue_len = dplane_ctx_queue_count(&gfnc->ctxqueue);
+ }
+
struct json_object *jo;
jo = json_object_new_object();
gfnc->counters.connection_errors);
json_object_int_add(jo, "data-plane-contexts",
gfnc->counters.dplane_contexts);
- json_object_int_add(jo, "data-plane-contexts-queue",
- gfnc->counters.ctxqueue_len);
+ json_object_int_add(jo, "data-plane-contexts-queue", curr_queue_len);
json_object_int_add(jo, "data-plane-contexts-queue-peak",
gfnc->counters.ctxqueue_len_peak);
json_object_int_add(jo, "buffer-full-hits", gfnc->counters.buffer_full);
/* Account the processed entries. */
processed_contexts++;
- atomic_fetch_sub_explicit(&fnc->counters.ctxqueue_len, 1,
- memory_order_relaxed);
dplane_ctx_set_status(ctx, ZEBRA_DPLANE_REQUEST_SUCCESS);
dplane_provider_enqueue_out_ctx(fnc->prov, ctx);
struct zebra_dplane_ctx *ctx;
struct fpm_nl_ctx *fnc;
int counter, limit;
- uint64_t cur_queue, peak_queue = 0, stored_peak_queue;
+ uint64_t cur_queue = 0, peak_queue = 0, stored_peak_queue;
fnc = dplane_provider_get_data(prov);
limit = dplane_provider_get_work_limit(prov);
* anyway.
*/
if (fnc->socket != -1 && fnc->connecting == false) {
- /*
- * Update the number of queued contexts *before*
- * enqueueing, to ensure counter consistency.
- */
- atomic_fetch_add_explicit(&fnc->counters.ctxqueue_len,
- 1, memory_order_relaxed);
-
frr_with_mutex (&fnc->ctxqueue_mutex) {
dplane_ctx_enqueue_tail(&fnc->ctxqueue, ctx);
+ cur_queue =
+ dplane_ctx_queue_count(&fnc->ctxqueue);
}
- cur_queue = atomic_load_explicit(
- &fnc->counters.ctxqueue_len,
- memory_order_relaxed);
if (peak_queue < cur_queue)
peak_queue = cur_queue;
continue;
atomic_store_explicit(&fnc->counters.ctxqueue_len_peak,
peak_queue, memory_order_relaxed);
- if (atomic_load_explicit(&fnc->counters.ctxqueue_len,
- memory_order_relaxed)
- > 0)
+ if (cur_queue > 0)
event_add_event(fnc->fthread->master, fpm_process_queue, fnc, 0,
&fnc->t_dequeue);