posix: sched: ensure min and max priority are schedulable
Previously, there was an off-by-one error for SCHED_RR. Fixes #56729 Signed-off-by: Chris Friedt <cfriedt@meta.com>
This commit is contained in:
parent
7f3326ad5d
commit
2b2cbf8107
|
@ -18,12 +18,10 @@
|
|||
#define PTHREAD_INIT_FLAGS PTHREAD_CANCEL_ENABLE
|
||||
#define PTHREAD_CANCELED ((void *) -1)
|
||||
|
||||
#define LOWEST_POSIX_THREAD_PRIORITY 1
|
||||
|
||||
K_MUTEX_DEFINE(pthread_once_lock);
|
||||
|
||||
static const struct pthread_attr init_pthread_attrs = {
|
||||
.priority = LOWEST_POSIX_THREAD_PRIORITY,
|
||||
.priority = 0,
|
||||
.stack = NULL,
|
||||
.stacksize = 0,
|
||||
.flags = PTHREAD_INIT_FLAGS,
|
||||
|
@ -73,9 +71,11 @@ static uint32_t zephyr_to_posix_priority(int32_t z_prio, int *policy)
|
|||
if (z_prio < 0) {
|
||||
*policy = SCHED_FIFO;
|
||||
prio = -1 * (z_prio + 1);
|
||||
__ASSERT_NO_MSG(prio < CONFIG_NUM_COOP_PRIORITIES);
|
||||
} else {
|
||||
*policy = SCHED_RR;
|
||||
prio = (CONFIG_NUM_PREEMPT_PRIORITIES - z_prio);
|
||||
prio = (CONFIG_NUM_PREEMPT_PRIORITIES - z_prio - 1);
|
||||
__ASSERT_NO_MSG(prio < CONFIG_NUM_PREEMPT_PRIORITIES);
|
||||
}
|
||||
|
||||
return prio;
|
||||
|
@ -87,9 +87,11 @@ static int32_t posix_to_zephyr_priority(uint32_t priority, int policy)
|
|||
|
||||
if (policy == SCHED_FIFO) {
|
||||
/* Zephyr COOP priority starts from -1 */
|
||||
__ASSERT_NO_MSG(priority < CONFIG_NUM_COOP_PRIORITIES);
|
||||
prio = -1 * (priority + 1);
|
||||
} else {
|
||||
prio = (CONFIG_NUM_PREEMPT_PRIORITIES - priority);
|
||||
__ASSERT_NO_MSG(priority < CONFIG_NUM_PREEMPT_PRIORITIES);
|
||||
prio = (CONFIG_NUM_PREEMPT_PRIORITIES - priority - 1);
|
||||
}
|
||||
|
||||
return prio;
|
||||
|
|
|
@ -7,13 +7,9 @@
|
|||
#include <zephyr/kernel.h>
|
||||
#include <zephyr/posix/sched.h>
|
||||
|
||||
static bool valid_posix_policy(int policy)
|
||||
static inline bool valid_posix_policy(int policy)
|
||||
{
|
||||
if (policy != SCHED_FIFO && policy != SCHED_RR) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
return policy == SCHED_FIFO || policy == SCHED_RR;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -23,25 +19,12 @@ static bool valid_posix_policy(int policy)
|
|||
*/
|
||||
int sched_get_priority_min(int policy)
|
||||
{
|
||||
if (valid_posix_policy(policy) == false) {
|
||||
if (!valid_posix_policy(policy)) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_COOP_ENABLED)) {
|
||||
if (policy == SCHED_FIFO) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_ENABLED)) {
|
||||
if (policy == SCHED_RR) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -51,25 +34,10 @@ int sched_get_priority_min(int policy)
|
|||
*/
|
||||
int sched_get_priority_max(int policy)
|
||||
{
|
||||
if (valid_posix_policy(policy) == false) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_COOP_ENABLED)) {
|
||||
if (policy == SCHED_FIFO) {
|
||||
/* Posix COOP priority starts from 0
|
||||
* whereas zephyr starts from -1
|
||||
*/
|
||||
return (CONFIG_NUM_COOP_PRIORITIES - 1);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (IS_ENABLED(CONFIG_PREEMPT_ENABLED)) {
|
||||
if (policy == SCHED_RR) {
|
||||
return CONFIG_NUM_PREEMPT_PRIORITIES;
|
||||
}
|
||||
if (IS_ENABLED(CONFIG_COOP_ENABLED) && policy == SCHED_FIFO) {
|
||||
return CONFIG_NUM_COOP_PRIORITIES - 1;
|
||||
} else if (IS_ENABLED(CONFIG_PREEMPT_ENABLED) && policy == SCHED_RR) {
|
||||
return CONFIG_NUM_PREEMPT_PRIORITIES - 1;
|
||||
}
|
||||
|
||||
errno = EINVAL;
|
||||
|
|
Loading…
Reference in a new issue