forked from Mirrors/opensbi
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:

committed by
Anup Patel

parent
35cba92655
commit
a894187e28
@@ -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)
|
||||||
|
Reference in New Issue
Block a user