lib: sbi_ipi: Do not ignore errors from sbi_ipi_send()

Currently, failures in sbi_ipi_send() are silently ignored, which makes
them difficult to debug. Instead, abort sending the IPI and pass back
the error, but still synchronize any IPIs already sent.

Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
Signed-off-by: Anup Patel <anup@brainfault.org>
This commit is contained in:
Samuel Holland
2023-12-18 18:13:45 +05:30
committed by Anup Patel
parent 35cba92655
commit a894187e28

View File

@@ -101,7 +101,7 @@ static int sbi_ipi_sync(struct sbi_scratch *scratch, u32 event)
*/ */
int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data) int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
{ {
int rc; int rc = 0;
bool retry_needed; bool retry_needed;
ulong i, m; ulong i, m;
struct sbi_hartmask target_mask = {0}; struct sbi_hartmask target_mask = {0};
@@ -135,17 +135,21 @@ int sbi_ipi_send_many(ulong hmask, ulong hbase, u32 event, void *data)
retry_needed = false; retry_needed = false;
sbi_hartmask_for_each_hartindex(i, &target_mask) { sbi_hartmask_for_each_hartindex(i, &target_mask) {
rc = sbi_ipi_send(scratch, i, event, data); rc = sbi_ipi_send(scratch, i, event, data);
if (rc < 0)
goto done;
if (rc == SBI_IPI_UPDATE_RETRY) if (rc == SBI_IPI_UPDATE_RETRY)
retry_needed = true; retry_needed = true;
else else
sbi_hartmask_clear_hartindex(i, &target_mask); sbi_hartmask_clear_hartindex(i, &target_mask);
rc = 0;
} }
} while (retry_needed); } while (retry_needed);
done:
/* Sync IPIs */ /* Sync IPIs */
sbi_ipi_sync(scratch, event); sbi_ipi_sync(scratch, event);
return 0; return rc;
} }
int sbi_ipi_event_create(const struct sbi_ipi_event_ops *ops) int sbi_ipi_event_create(const struct sbi_ipi_event_ops *ops)