Merge pull request #7644 from mjstapp/dplane_cleaner

zebra: add an api to process/clean the pending dplane queue
This commit is contained in:
Donald Sharp 2020-12-02 09:01:44 -05:00 committed by GitHub
commit af8a77d636
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 0 deletions

View File

@ -4327,6 +4327,49 @@ static void dplane_provider_init(void)
#endif /* DPLANE_TEST_PROVIDER */
}
/*
* Allow zebra code to walk the queue of pending contexts, evaluate each one
* using a callback function. If the function returns 'true', the context
* will be dequeued and freed without being processed.
*/
int dplane_clean_ctx_queue(bool (*context_cb)(struct zebra_dplane_ctx *ctx,
void *arg), void *val)
{
struct zebra_dplane_ctx *ctx, *temp;
struct dplane_ctx_q work_list;
TAILQ_INIT(&work_list);
if (context_cb == NULL)
goto done;
/* Walk the pending context queue under the dplane lock. */
DPLANE_LOCK();
TAILQ_FOREACH_SAFE(ctx, &zdplane_info.dg_update_ctx_q, zd_q_entries,
temp) {
if (context_cb(ctx, val)) {
TAILQ_REMOVE(&zdplane_info.dg_update_ctx_q, ctx,
zd_q_entries);
TAILQ_INSERT_TAIL(&work_list, ctx, zd_q_entries);
}
}
DPLANE_UNLOCK();
/* Now free any contexts selected by the caller, without holding
* the lock.
*/
TAILQ_FOREACH_SAFE(ctx, &work_list, zd_q_entries, temp) {
TAILQ_REMOVE(&work_list, ctx, zd_q_entries);
dplane_ctx_fini(&ctx);
}
done:
return 0;
}
/* Indicates zebra shutdown/exit is in progress. Some operations may be
* simplified or skipped during shutdown processing.
*/

View File

@ -216,6 +216,15 @@ struct zebra_dplane_ctx *dplane_ctx_alloc(void);
*/
void dplane_ctx_reset(struct zebra_dplane_ctx *ctx);
/*
* Allow zebra code to walk the queue of pending contexts, evaluate each one
* using a callback function. The caller can supply an optional void* arg also.
* If the function returns 'true', the context will be dequeued and freed
* without being processed.
*/
int dplane_clean_ctx_queue(bool (*context_cb)(struct zebra_dplane_ctx *ctx,
void *arg), void *val);
/* Return a dataplane results context block after use; the caller's pointer will
* be cleared.
*/