Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[kernel][schedule] reduce unnecessary schedule by comparing new ready thread's priority and current #5959

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
judge return value of rt_thread_resume in components srcs
  • Loading branch information
blta committed May 17, 2022
commit 6cccf8c3cc29d4bb8e9a230c357a61d60e0dfbc3
9 changes: 4 additions & 5 deletions components/drivers/audio/audio_pipe.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ static void _rt_pipe_resume_writer(struct rt_audio_pipe *pipe)
tlist);

/* resume the write thread */
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
rt_schedule();

rt_schedule();
}
}

Expand Down Expand Up @@ -108,9 +108,8 @@ static void _rt_pipe_resume_reader(struct rt_audio_pipe *pipe)
tlist);

/* resume the read thread */
rt_thread_resume(thread);

rt_schedule();
if(rt_thread_resume(thread) == RT_EOK)
rt_schedule();
}
}

Expand Down
8 changes: 6 additions & 2 deletions components/drivers/ipc/completion.c
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ RTM_EXPORT(rt_completion_wait);
void rt_completion_done(struct rt_completion *completion)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
RT_ASSERT(completion != RT_NULL);

if (completion->flag == RT_COMPLETED)
Expand All @@ -143,11 +144,14 @@ void rt_completion_done(struct rt_completion *completion)
tlist);

/* resume it */
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);

/* perform a schedule */
rt_schedule();
if (need_schedule == RT_TRUE)
rt_schedule();
}
else
{
Expand Down
26 changes: 19 additions & 7 deletions components/drivers/ipc/dataqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
rt_int32_t timeout)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
rt_thread_t thread;
rt_err_t result;

Expand Down Expand Up @@ -165,11 +166,14 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue,
tlist);

/* resume it */
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);

/* perform a schedule */
rt_schedule();
if (need_schedule == RT_TRUE)
rt_schedule();

return result;
}
Expand Down Expand Up @@ -209,6 +213,7 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
rt_int32_t timeout)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
rt_thread_t thread;
rt_err_t result;

Expand Down Expand Up @@ -286,11 +291,14 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue,
tlist);

/* resume it */
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);

/* perform a schedule */
rt_schedule();
if (need_schedule == RT_TRUE)
rt_schedule();
}
else
{
Expand Down Expand Up @@ -362,6 +370,7 @@ RTM_EXPORT(rt_data_queue_peek);
void rt_data_queue_reset(struct rt_data_queue *queue)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
struct rt_thread *thread;

RT_ASSERT(queue != RT_NULL);
Expand Down Expand Up @@ -397,7 +406,8 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
* In rt_thread_resume function, it will remove current thread from
* suspend list
*/
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

/* enable interrupt */
rt_hw_interrupt_enable(level);
Expand All @@ -421,14 +431,16 @@ void rt_data_queue_reset(struct rt_data_queue *queue)
* In rt_thread_resume function, it will remove current thread from
* suspend list
*/
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

/* enable interrupt */
rt_hw_interrupt_enable(level);
}
rt_exit_critical();

rt_schedule();
if (need_schedule == RT_TRUE)
rt_schedule();
}
RTM_EXPORT(rt_data_queue_reset);

Expand Down
8 changes: 4 additions & 4 deletions components/drivers/ipc/waitqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ int __wqueue_default_wake(struct rt_wqueue_node *wait, void *key)
void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)
{
rt_base_t level;
int need_schedule = 0;
rt_bool_t need_schedule = RT_FALSE;

rt_list_t *queue_list;
struct rt_list_node *node;
Expand All @@ -94,8 +94,8 @@ void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)
entry = rt_list_entry(node, struct rt_wqueue_node, list);
if (entry->wakeup(entry, key) == 0)
{
rt_thread_resume(entry->polling_thread);
need_schedule = 1;
if(rt_thread_resume(entry->polling_thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_wqueue_remove(entry);
break;
Expand All @@ -104,7 +104,7 @@ void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key)
}
rt_hw_interrupt_enable(level);

if (need_schedule)
if (need_schedule == RT_TRUE)
rt_schedule();
}

Expand Down
30 changes: 24 additions & 6 deletions components/drivers/ipc/workqueue.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue,
struct rt_work *work, rt_tick_t ticks)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
rt_err_t err;

level = rt_hw_interrupt_disable();
Expand All @@ -119,9 +120,14 @@ static rt_err_t _workqueue_submit_work(struct rt_workqueue *queue,
((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);
if(rt_thread_resume(queue->work_thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);
rt_schedule();

/* perform a schedule */
if (need_schedule == RT_TRUE)
rt_schedule();
}
else
{
Expand Down Expand Up @@ -180,6 +186,7 @@ static void _delayed_work_timeout_handler(void *parameter)
struct rt_work *work;
struct rt_workqueue *queue;
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;

work = (struct rt_work *)parameter;
queue = work->workqueue;
Expand All @@ -201,9 +208,14 @@ static void _delayed_work_timeout_handler(void *parameter)
((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);
if(rt_thread_resume(queue->work_thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);
rt_schedule();

/* perform a schedule */
if (need_schedule == RT_TRUE)
rt_schedule();
}
else
{
Expand Down Expand Up @@ -346,6 +358,7 @@ rt_err_t rt_workqueue_submit_work(struct rt_workqueue *queue, struct rt_work *wo
rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *work)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;

RT_ASSERT(queue != RT_NULL);
RT_ASSERT(work != RT_NULL);
Expand All @@ -359,9 +372,14 @@ rt_err_t rt_workqueue_urgent_work(struct rt_workqueue *queue, struct rt_work *wo
((queue->work_thread->stat & RT_THREAD_STAT_MASK) == RT_THREAD_SUSPEND))
{
/* resume work thread */
rt_thread_resume(queue->work_thread);
if(rt_thread_resume(queue->work_thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);
rt_schedule();

/* perform a schedule */
if (need_schedule == RT_TRUE)
rt_schedule();
}
else
{
Expand Down
8 changes: 6 additions & 2 deletions components/vbus/prio_queue.c
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ rt_err_t rt_prio_queue_push(struct rt_prio_queue *que,
rt_int32_t timeout)
{
rt_base_t level;
rt_bool_t need_schedule = RT_FALSE;
struct rt_prio_queue_item *item;

RT_ASSERT(que);
Expand Down Expand Up @@ -164,11 +165,14 @@ rt_err_t rt_prio_queue_push(struct rt_prio_queue *que,
struct rt_thread,
tlist);
/* resume it */
rt_thread_resume(thread);
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;

rt_hw_interrupt_enable(level);

/* perform a schedule */
rt_schedule();
if (need_schedule == RT_TRUE)
rt_schedule();

return RT_EOK;
}
Expand Down
4 changes: 2 additions & 2 deletions components/vbus/vbus.c
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,8 @@ static void _bus_out_entry(void *param)

void rt_vbus_resume_out_thread(void)
{
rt_thread_resume(&_bus_out_thread);
rt_schedule();
if(rt_thread_resume(&_bus_out_thread) == RT_EOK)
rt_schedule();
}

rt_err_t rt_vbus_post(rt_uint8_t id,
Expand Down
11 changes: 7 additions & 4 deletions components/vbus/watermark_queue.h
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ rt_inline rt_err_t rt_wm_que_inc(struct rt_watermark_queue *wg,
*/
rt_inline void rt_wm_que_dec(struct rt_watermark_queue *wg)
{
int need_sched = 0;
rt_bool_t need_schedule = RT_FALSE;

rt_base_t level;

if (wg->level == 0)
Expand All @@ -119,12 +120,14 @@ rt_inline void rt_wm_que_dec(struct rt_watermark_queue *wg)
thread = rt_list_entry(wg->suspended_threads.next,
struct rt_thread,
tlist);
rt_thread_resume(thread);
need_sched = 1;
/* resume it */
if(rt_thread_resume(thread) == RT_EOK)
need_schedule = RT_TRUE;
}
}
rt_hw_interrupt_enable(level);

if (need_sched)
/* perform a schedule */
if (need_schedule == RT_TRUE)
rt_schedule();
}