On 7/2/26 5:24 PM, Patrice Chotard wrote:
On STM32MP157C-DK2, when using the "ums" command, in sleep_thread(),
ctrlc() is called every ~640ms which doesn't allows high reactivity when
user press CTRL+C in U-Boot console.
In sleep_thread() loop, ctrlc() is called every 200000 iterations.
But schedule is called on each loop iteration.
Optimize cyclic_run() in order to parse the cyclic list only is the
next cyclic to run is due.
During cyclic list parsing, save the nearest cyclic timestamp, which
allows to exit from next cyclic_run() call if no cyclic will be executed.
This allow to save computation time :
_ before : ctrlc() is called every ~640ms
_ after : ctrlc() is called every ~230ms
Signed-off-by: Patrice Chotard <[email protected]>
Cc: Marek Vasut <[email protected]>
---
common/cyclic.c | 12 ++++++++++++
include/asm-generic/global_data.h | 4 ++++
2 files changed, 16 insertions(+)
diff --git a/common/cyclic.c b/common/cyclic.c
index b37cd6d8ff0..714d6863d5b 100644
--- a/common/cyclic.c
+++ b/common/cyclic.c
@@ -68,11 +68,17 @@ static void cyclic_run(void)
struct cyclic_info *cyclic;
struct hlist_node *tmp;
u64 now, cpu_time;
+ u64 next_call = UINT64_MAX;
/* Prevent recursion */
if (gd->flags & GD_FLG_CYCLIC_RUNNING)
return;
+ /* check if the next cyclic function's timestamp is reached */
+ now = get_timer_us(0);
+ if (time_after_eq64(gd->next_cyclic_call, now))
+ return;
+
gd->flags |= GD_FLG_CYCLIC_RUNNING;
hlist_for_each_entry_safe(cyclic, tmp, cyclic_get_list(), list) {
/*
@@ -102,7 +108,13 @@ static void cyclic_run(void)
cyclic->already_warned = true;
}
}
+ if (next_call > cyclic->next_call)
+ next_call = cyclic->next_call;
Can you move this entry to the beginning of the cyclic list, so that the
entry with the earliest deadline would be right at the beginning of the
list ? That should squeeze some more improvement out of this I think.
}
+
+ if (next_call != UINT64_MAX)
Can the next_call literally hit UINT64_MAX in that one unlikely case ?
You likely do need a separate flag, bool next_call_valid, to avoid that
edge case.
+ gd->next_cyclic_call = next_call;
+
gd->flags &= ~GD_FLG_CYCLIC_RUNNING;
}
Thank you !