On Wed, Oct 25, 2023 at 06:31:10PM +0200, Thomas Monjalon wrote: > When running real-time threads, we may need to force scheduling > kernel threads or other real-time threads. > New functions are added to address these cases. > > The yield functions should not have any interest for normal threads. > Note: other purposes may be addressed with rte_pause() or rte_delay_*(). > > Signed-off-by: Thomas Monjalon <tho...@monjalon.net> > --- > lib/eal/include/rte_thread.h | 22 ++++++++++++++++++++++ > lib/eal/unix/rte_thread.c | 16 ++++++++++++++++ > lib/eal/version.map | 4 ++++ > lib/eal/windows/rte_thread.c | 15 +++++++++++++++ > 4 files changed, 57 insertions(+) > > diff --git a/lib/eal/include/rte_thread.h b/lib/eal/include/rte_thread.h > index 8da9d4d3fb..139cafac96 100644 > --- a/lib/eal/include/rte_thread.h > +++ b/lib/eal/include/rte_thread.h > @@ -183,6 +183,28 @@ int rte_thread_join(rte_thread_t thread_id, uint32_t > *value_ptr); > */ > int rte_thread_detach(rte_thread_t thread_id); > > +/** > + * Allow another thread to run on the same CPU core. > + * > + * Lower priority threads may not be scheduled. > + * > + * Especially useful in real-time thread priority > + * to schedule other real-time threads. > + * @see RTE_THREAD_PRIORITY_REALTIME_CRITICAL > + */ > +__rte_experimental > +void rte_thread_yield(void); > + > +/** > + * Unblock a CPU core running busy in a real-time thread. > + * > + * Especially useful in real-time thread priority > + * to avoid a busy loop blocking vital threads on a core. > + * @see RTE_THREAD_PRIORITY_REALTIME_CRITICAL > + */ > +__rte_experimental > +void rte_thread_yield_realtime(void); > + > /** > * Get the id of the calling thread. > * > diff --git a/lib/eal/unix/rte_thread.c b/lib/eal/unix/rte_thread.c > index 36a21ab2f9..92b4e53adb 100644 > --- a/lib/eal/unix/rte_thread.c > +++ b/lib/eal/unix/rte_thread.c > @@ -5,9 +5,11 @@ > > #include <errno.h> > #include <pthread.h> > +#include <sched.h> > #include <stdbool.h> > #include <stdlib.h> > #include <string.h> > +#include <time.h> > > #include <rte_errno.h> > #include <rte_log.h> > @@ -227,6 +229,20 @@ rte_thread_detach(rte_thread_t thread_id) > return pthread_detach((pthread_t)thread_id.opaque_id); > } > > +void > +rte_thread_yield(void) > +{ > + sched_yield(); > +} > + > +void > +rte_thread_yield_realtime(void) > +{ > + /* A simple yield may not be enough to schedule kernel threads. */ > + struct timespec wait = {.tv_nsec = 1}; > + nanosleep(&wait, NULL); > +} > + While I realise we discussed this earlier, and I also was the original suggester of using sched_yield, I think just having just one function using sleep is probably best after all.
/Bruce