[PATCH 2/3] lib: sbi_ipi: Process self-IPIs in sbi_ipi_send()

Xiang W wxjstz at 126.com
Sun Dec 10 23:24:08 PST 2023


在 2023-12-08星期五的 13:22 -0800,Samuel Holland写道:
> 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 at sifive.com>
> ---
> 
>  lib/sbi/sbi_ipi.c | 8 ++++++++
>  1 file changed, 8 insertions(+)
> 
> diff --git a/lib/sbi/sbi_ipi.c b/lib/sbi/sbi_ipi.c
> index 1fd24228..ac31cd94 100644
> --- a/lib/sbi/sbi_ipi.c
> +++ b/lib/sbi/sbi_ipi.c
> @@ -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;
This modification will affect sbi_tlb.c. tlb_update has already called
tinfo->local_fn(tinfo) when returning SBI_IPI_UPDATE_BREAK. And the 
synchronization variable is only updated when SBI_IPI_UPDATE_SUCCESS is 
returned. If tlb_process is called, the synchronization variable will be 
affected.

Regards,
Xiang W

>  	}
>  
>  	/*
> -- 
> 2.42.0
> 
> 




More information about the opensbi mailing list