diff options
-rw-r--r-- | core/opal.c | 9 | ||||
-rw-r--r-- | include/cpu.h | 1 |
2 files changed, 10 insertions, 0 deletions
diff --git a/core/opal.c b/core/opal.c index 63a0851..2834b38 100644 --- a/core/opal.c +++ b/core/opal.c @@ -167,6 +167,7 @@ int64_t opal_entry_check(struct stack_frame *eframe) } } + cpu->entered_opal_call_at = mftb(); return OPAL_SUCCESS; } @@ -176,6 +177,8 @@ int64_t opal_exit_check(int64_t retval, struct stack_frame *eframe) { struct cpu_thread *cpu = this_cpu(); uint64_t token = eframe->gpr[0]; + uint64_t now = mftb(); + uint64_t call_time = tb_to_msecs(now - cpu->entered_opal_call_at); if (!cpu->in_opal_call) { disable_fast_reboot("Un-accounted firmware entry"); @@ -193,6 +196,12 @@ int64_t opal_exit_check(int64_t retval, struct stack_frame *eframe) drop_my_locks(true); } } + + if (call_time > 100) { + prlog((call_time < 1000) ? PR_DEBUG : PR_WARNING, + "Spent %llu msecs in OPAL call %llu!\n", + call_time, token); + } return retval; } diff --git a/include/cpu.h b/include/cpu.h index 2fe4798..851fb8e 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -62,6 +62,7 @@ struct cpu_thread { void *icp_regs; uint32_t in_opal_call; uint32_t quiesce_opal_call; + uint64_t entered_opal_call_at; uint32_t con_suspend; struct list_head locks_held; bool con_need_flush; |