zephyr/subsys/rtio/rtio_executor_simple.c
Tom Burdick 121462b129 rtio: Low (Memory) Cost Concurrent scheduler
Schedules I/O chains in the same order as they arrive providing a fixed
amount of concurrency. The low memory cost comes at the cost of some
computational cost that is likely to be acceptable with small amounts
of concurrency.

The code cost is about 4x higher than the simple linear executor
which isn't entirely unexpected as the logic requirements are quite a bit
more than doing the next thing in the queue.

Signed-off-by: Tom Burdick <thomas.burdick@intel.com>
2022-06-28 13:53:13 -04:00

79 lines
1.7 KiB
C

/*
* Copyright (c) 2022 Intel Corporation.
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/rtio/rtio_executor_simple.h>
#include <zephyr/rtio/rtio.h>
#include <zephyr/kernel.h>
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(rtio_executor_simple, CONFIG_RTIO_LOG_LEVEL);
/**
* @brief Submit submissions to simple executor
*
* The simple executor provides no concurrency instead
* execution each submission chain one after the next.
*
* @param r RTIO context
*
* @retval 0 Always succeeds
*/
int rtio_simple_submit(struct rtio *r)
{
/* TODO For each submission queue entry chain,
* submit the chain to the first iodev
*/
struct rtio_sqe *sqe = rtio_spsc_consume(r->sq);
if (sqe != NULL) {
rtio_iodev_submit(sqe, r);
}
return 0;
}
/**
* @brief Callback from an iodev describing success
*/
void rtio_simple_ok(struct rtio *r, const struct rtio_sqe *sqe, int result)
{
rtio_cqe_submit(r, result, sqe->userdata);
rtio_spsc_release(r->sq);
rtio_simple_submit(r);
}
/**
* @brief Callback from an iodev describing error
*/
void rtio_simple_err(struct rtio *r, const struct rtio_sqe *sqe, int result)
{
struct rtio_sqe *nsqe;
bool chained;
rtio_cqe_submit(r, result, sqe->userdata);
chained = sqe->flags & RTIO_SQE_CHAINED;
rtio_spsc_release(r->sq);
if (chained) {
nsqe = rtio_spsc_consume(r->sq);
while (nsqe != NULL && nsqe->flags & RTIO_SQE_CHAINED) {
rtio_cqe_submit(r, -ECANCELED, nsqe->userdata);
rtio_spsc_release(r->sq);
nsqe = rtio_spsc_consume(r->sq);
}
if (nsqe != NULL) {
rtio_iodev_submit(nsqe, r);
}
} else {
/* Now we can submit the next in the queue if we aren't done */
rtio_simple_submit(r);
}
}