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 <thomas.burdick@intel.com>
This commit is contained in:
Tom Burdick 2022-10-03 12:44:46 -05:00 committed by Maureen Helm
commit 8b6ede6047

View file

@ -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);
}