mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-03-15 19:31:32 +00:00
lib: sbi_ipi: Process self-IPIs in sbi_ipi_send()
An IPI sent to the local hart can be processed directly instead of triggering the IPI device. This is more efficient, and it avoids a deadlock when the .sync callback is defined. Since interrupts are disabled while handling an ecall, the IPI would not get delivered until the next mret, but sbi_ipi_sync() is called before then. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org> Reviewed-by: Xiang W <wxjstz@126.com>
This commit is contained in:
parent
a894187e28
commit
446fa65eb5
1 changed files with 8 additions and 0 deletions
|
@ -60,6 +60,14 @@ static int sbi_ipi_send(struct sbi_scratch *scratch, u32 remote_hartindex,
|
|||
remote_hartindex, data);
|
||||
if (ret != SBI_IPI_UPDATE_SUCCESS)
|
||||
return ret;
|
||||
} else if (scratch == remote_scratch) {
|
||||
/*
|
||||
* IPI events with an update() callback are expected to return
|
||||
* SBI_IPI_UPDATE_BREAK for self-IPIs. For other events, check
|
||||
* for self-IPI and execute the callback directly here.
|
||||
*/
|
||||
ipi_ops->process(scratch);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Add table
Reference in a new issue