Update some Kconfig comments; Add a upper limit on the lower priority worker thread for priority inheritance
This commit is contained in:
parent
792e40f513
commit
7f36c4e97b
@ -79,8 +79,10 @@
|
|||||||
* then an additional, lower-priority work queue will also be created. This
|
* then an additional, lower-priority work queue will also be created. This
|
||||||
* lower priority work queue is better suited for more extended processing
|
* lower priority work queue is better suited for more extended processing
|
||||||
* (such as file system clean-up operations)
|
* (such as file system clean-up operations)
|
||||||
* CONFIG_SCHED_LPWORKPRIORITY - The execution priority of the lower priority
|
* CONFIG_SCHED_LPWORKPRIORITY - The minimum execution priority of the lower
|
||||||
* worker thread. Default: 50
|
* priority worker thread. Default: 50
|
||||||
|
* CONFIG_SCHED_LPWORKPRIOMAX - The maximum execution priority of the lower
|
||||||
|
* priority worker thread. Default: 176
|
||||||
* CONFIG_SCHED_LPWORKPERIOD - How often the lower priority worker thread
|
* CONFIG_SCHED_LPWORKPERIOD - How often the lower priority worker thread
|
||||||
* checks for work in units of microseconds. Default: 50*1000 (50 MS).
|
* checks for work in units of microseconds. Default: 50*1000 (50 MS).
|
||||||
* CONFIG_SCHED_LPWORKSTACKSIZE - The stack size allocated for the lower
|
* CONFIG_SCHED_LPWORKSTACKSIZE - The stack size allocated for the lower
|
||||||
@ -175,6 +177,27 @@
|
|||||||
# define CONFIG_SCHED_LPWORKPRIORITY 50
|
# define CONFIG_SCHED_LPWORKPRIORITY 50
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
|
# ifndef CONFIG_SCHED_LPWORKPRIOMAX
|
||||||
|
# ifdef CONFIG_SCHED_HPWORK
|
||||||
|
# define CONFIG_SCHED_LPWORKPRIOMAX (CONFIG_SCHED_WORKPRIORITY-16)
|
||||||
|
# else
|
||||||
|
# define CONFIG_SCHED_LPWORKPRIOMAX 176
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef CONFIG_SCHED_HPWORK
|
||||||
|
# if CONFIG_SCHED_LPWORKPRIORITY >= CONFIG_SCHED_WORKPRIORITY
|
||||||
|
# error CONFIG_SCHED_LPWORKPRIORITY >= CONFIG_SCHED_WORKPRIORITY
|
||||||
|
# endif
|
||||||
|
# if CONFIG_SCHED_LPWORKPRIOMAX >= CONFIG_SCHED_WORKPRIORITY
|
||||||
|
# error CONFIG_SCHED_LPWORKPRIOMAX >= CONFIG_SCHED_WORKPRIORITY
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if CONFIG_SCHED_LPWORKPRIORITY > CONFIG_SCHED_LPWORKPRIOMAX
|
||||||
|
# error CONFIG_SCHED_LPWORKPRIORITY > CONFIG_SCHED_LPWORKPRIOMAX
|
||||||
|
# endif
|
||||||
|
|
||||||
# ifndef CONFIG_SCHED_LPWORKPERIOD
|
# ifndef CONFIG_SCHED_LPWORKPERIOD
|
||||||
# define CONFIG_SCHED_LPWORKPERIOD (50*1000) /* 50 milliseconds */
|
# define CONFIG_SCHED_LPWORKPERIOD (50*1000) /* 50 milliseconds */
|
||||||
# endif
|
# endif
|
||||||
|
77
libc/Kconfig
77
libc/Kconfig
@ -412,9 +412,10 @@ config SCHED_HPWORK
|
|||||||
bool "High priority (kernel) worker thread"
|
bool "High priority (kernel) worker thread"
|
||||||
default y
|
default y
|
||||||
---help---
|
---help---
|
||||||
If SCHED_WORKQUEUE is defined, then a single, high priority work queue is
|
If SCHED_WORKQUEUE is defined, then a single, high priority work
|
||||||
created by default. This high priority worker thread is intended to serve
|
queue is created by default. This high priority worker thread is
|
||||||
as the "bottom half" for driver interrupt handling.
|
intended to serve as the "bottom half" for driver interrupt
|
||||||
|
handling.
|
||||||
|
|
||||||
if SCHED_HPWORK
|
if SCHED_HPWORK
|
||||||
|
|
||||||
@ -422,7 +423,20 @@ config SCHED_WORKPRIORITY
|
|||||||
int "High priority worker thread priority"
|
int "High priority worker thread priority"
|
||||||
default 192
|
default 192
|
||||||
---help---
|
---help---
|
||||||
The execution priority of the worker thread. Default: 192
|
The execution priority of the higher priority worker thread.
|
||||||
|
|
||||||
|
The higher priority worker thread is intended to serve as the
|
||||||
|
"bottom" half for device drivers. As a consequence it must run at
|
||||||
|
a very high, fixed priority. Typically, it should be the highest
|
||||||
|
priority thread in your system. Default: 192
|
||||||
|
|
||||||
|
For lower priority, application oriented worker thread support,
|
||||||
|
please consider enabling the lower priority work queue. The lower
|
||||||
|
priority work queue runs at a lower priority, of course, but has
|
||||||
|
the added advantage that it supports "priority inheritance" (if
|
||||||
|
PRIORITY_INHERITANCE is also selected): The priority of the lower
|
||||||
|
priority worker thread can then be adjusted to match the highest
|
||||||
|
priority client.
|
||||||
|
|
||||||
config SCHED_WORKPERIOD
|
config SCHED_WORKPERIOD
|
||||||
int "High priority worker thread period"
|
int "High priority worker thread period"
|
||||||
@ -445,8 +459,9 @@ config SCHED_LPWORK
|
|||||||
If SCHED_WORKQUEUE is defined, then a single work queue is created by
|
If SCHED_WORKQUEUE is defined, then a single work queue is created by
|
||||||
default. If SCHED_LPWORK is also defined then an additional, lower-
|
default. If SCHED_LPWORK is also defined then an additional, lower-
|
||||||
priority work queue will also be created. This lower priority work
|
priority work queue will also be created. This lower priority work
|
||||||
queue is better suited for more extended processing (such as file system
|
queue is better suited for more extended, application oriented
|
||||||
clean-up operations)
|
processing (such as file system clean-up operations or asynchronous
|
||||||
|
I/O)
|
||||||
|
|
||||||
if SCHED_LPWORK
|
if SCHED_LPWORK
|
||||||
|
|
||||||
@ -454,7 +469,55 @@ config SCHED_LPWORKPRIORITY
|
|||||||
int "Low priority worker thread priority"
|
int "Low priority worker thread priority"
|
||||||
default 50
|
default 50
|
||||||
---help---
|
---help---
|
||||||
The execution priority of the lopwer priority worker thread. Default: 50
|
The minimum execution priority of the lower priority worker thread.
|
||||||
|
|
||||||
|
The lower priority worker thread is intended support application-
|
||||||
|
oriented functions. The lower priority work queue runs at a lower
|
||||||
|
priority, of course, but has the added advantage that it supports
|
||||||
|
"priority inheritance" (if PRIORITY_INHERITANCE is also selected):
|
||||||
|
The priority of the lower priority worker thread can then be
|
||||||
|
adjusted to match the highest priority client. Default: 50
|
||||||
|
|
||||||
|
NOTE: This priority inheritance feature is not automatic. The
|
||||||
|
lower priority worker thread will always a fixed priority unless
|
||||||
|
you implement logic that calls lpwork_boostpriority() to raise the
|
||||||
|
priority of the lower priority worker thread (typically called
|
||||||
|
before scheduling the work) and then call the matching
|
||||||
|
lpwork_restorepriority() when the work is completed (typically
|
||||||
|
called within the work handler at the completion of the work).
|
||||||
|
Currently, only the NuttX asynchronous I/O logic uses this dynamic
|
||||||
|
prioritization feature.
|
||||||
|
|
||||||
|
The higher priority worker thread, on the other hand, is intended
|
||||||
|
to serve as the "bottom" half for device drivers. As a consequence
|
||||||
|
it must run at a very high, fixed priority. Typically, it should
|
||||||
|
be the highest priority thread in your system.
|
||||||
|
|
||||||
|
config SCHED_LPWORKPRIOMAX
|
||||||
|
int "Low priority worker thread maximum priority"
|
||||||
|
default 176
|
||||||
|
depends on PRIORITY_INHERITANCE
|
||||||
|
---help---
|
||||||
|
The maximum execution priority of the lower priority worker thread.
|
||||||
|
|
||||||
|
The lower priority worker thread is intended support application-
|
||||||
|
oriented functions. The lower priority work queue runs at a lower
|
||||||
|
priority, of course, but has the added advantage that it supports
|
||||||
|
"priority inheritance" (if PRIORITY_INHERITANCE is also selected):
|
||||||
|
The priority of the lower priority worker thread can then be
|
||||||
|
adjusted to match the highest priority client.
|
||||||
|
|
||||||
|
The higher priority worker thread, on the other hand, is intended
|
||||||
|
to serve as the "bottom" half for device drivers. As a consequence
|
||||||
|
it must run at a very high, fixed priority. Typically, it should
|
||||||
|
be the highest priority thread in your system.
|
||||||
|
|
||||||
|
This function provides an upper limit on the priority of the lower
|
||||||
|
priority worker thread. This would be necessary, for example, if
|
||||||
|
the higher priority worker thread were to defer work to the lower
|
||||||
|
priority thread. Clearly, in such a case, you would want to limit
|
||||||
|
the maximum priority of the lower priority work thread. Default:
|
||||||
|
176
|
||||||
|
|
||||||
config SCHED_LPWORKPERIOD
|
config SCHED_LPWORKPERIOD
|
||||||
int "Low priority worker thread period"
|
int "Low priority worker thread period"
|
||||||
|
@ -78,6 +78,13 @@ void lpwork_boostpriority(uint8_t reqprio)
|
|||||||
irqstate_t flags;
|
irqstate_t flags;
|
||||||
pid_t wpid;
|
pid_t wpid;
|
||||||
|
|
||||||
|
/* Clip to the configured maximum priority */
|
||||||
|
|
||||||
|
if (reqprio > CONFIG_SCHED_LPWORKPRIOMAX)
|
||||||
|
{
|
||||||
|
reqprio = CONFIG_SCHED_LPWORKPRIOMAX;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the process ID of the low priority worker thread from the low
|
/* Get the process ID of the low priority worker thread from the low
|
||||||
* priority work queue. Then get the TCB of the low priority worker
|
* priority work queue. Then get the TCB of the low priority worker
|
||||||
* thread from the process ID.
|
* thread from the process ID.
|
||||||
@ -194,6 +201,13 @@ void lpwork_restorepriority(uint8_t reqprio)
|
|||||||
int index;
|
int index;
|
||||||
int selected;
|
int selected;
|
||||||
|
|
||||||
|
/* Clip to the configured maximum priority */
|
||||||
|
|
||||||
|
if (reqprio > CONFIG_SCHED_LPWORKPRIOMAX)
|
||||||
|
{
|
||||||
|
reqprio = CONFIG_SCHED_LPWORKPRIOMAX;
|
||||||
|
}
|
||||||
|
|
||||||
/* Get the process ID of the low priority worker thread from the low
|
/* Get the process ID of the low priority worker thread from the low
|
||||||
* priority work queue. Then get the TCB of the low priority worker
|
* priority work queue. Then get the TCB of the low priority worker
|
||||||
* thread from the process ID.
|
* thread from the process ID.
|
||||||
|
Loading…
Reference in New Issue
Block a user