From 8b6ede60471695f07117e29f5b70539658fe364d Mon Sep 17 00:00:00 2001 From: Tom Burdick Date: Mon, 3 Oct 2022 12:44:46 -0500 Subject: [PATCH] rtio: Release sqe before submitting cqe When an application is waiting on a completion it may be expecting, rightfully so, that a new submissions slot is available. Frees the submission queue event prior to enqueuing the completion queue event in the simple executor. Signed-off-by: Tom Burdick --- subsys/rtio/rtio_executor_simple.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/subsys/rtio/rtio_executor_simple.c b/subsys/rtio/rtio_executor_simple.c index 926a63cdcf0..ace34db72b0 100644 --- a/subsys/rtio/rtio_executor_simple.c +++ b/subsys/rtio/rtio_executor_simple.c @@ -41,8 +41,10 @@ int rtio_simple_submit(struct rtio *r) */ void rtio_simple_ok(struct rtio *r, const struct rtio_sqe *sqe, int result) { - rtio_cqe_submit(r, result, sqe->userdata); + void *userdata = sqe->userdata; + rtio_spsc_release(r->sq); + rtio_cqe_submit(r, result, userdata); rtio_simple_submit(r); } @@ -52,18 +54,19 @@ void rtio_simple_ok(struct rtio *r, const struct rtio_sqe *sqe, int result) void rtio_simple_err(struct rtio *r, const struct rtio_sqe *sqe, int result) { struct rtio_sqe *nsqe; - bool chained; + void *userdata = sqe->userdata; + bool chained = sqe->flags & RTIO_SQE_CHAINED; - rtio_cqe_submit(r, result, sqe->userdata); - chained = sqe->flags & RTIO_SQE_CHAINED; rtio_spsc_release(r->sq); + rtio_cqe_submit(r, result, sqe->userdata); if (chained) { nsqe = rtio_spsc_consume(r->sq); while (nsqe != NULL && nsqe->flags & RTIO_SQE_CHAINED) { - rtio_cqe_submit(r, -ECANCELED, nsqe->userdata); + userdata = nsqe->userdata; rtio_spsc_release(r->sq); + rtio_cqe_submit(r, -ECANCELED, userdata); nsqe = rtio_spsc_consume(r->sq); }