[PATCH] lib: sbi: Improve hartindex_to_hartid_table
Anup Patel
anup at brainfault.org
Tue Nov 14 08:39:23 PST 2023
On Mon, Oct 9, 2023 at 2:52 PM Xiang W <wxjstz at 126.com> wrote:
>
> Modify hartindex_to_hartid_table point to plat->hart_index2id to
> save memory. This slows down sbi_hartindex_to_hartid slightly
> because it needs to determine whether hartindex_to_hartid_table is
> NULL. This will also improve the speed of sbi_hartid_to_hartindex
> when plat->hart_index2id is NULL, since there is no need to iterate
> through the array.
>
> Signed-off-by: Xiang W <wxjstz at 126.com>
> ---
> include/sbi/sbi_scratch.h | 13 ++++++++-----
> lib/sbi/sbi_scratch.c | 7 +++++--
> 2 files changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/include/sbi/sbi_scratch.h b/include/sbi/sbi_scratch.h
> index e6a33ba..02db224 100644
> --- a/include/sbi/sbi_scratch.h
> +++ b/include/sbi/sbi_scratch.h
> @@ -213,13 +213,16 @@ extern u32 last_hartindex_having_scratch;
> (((__hartindex) <= sbi_scratch_last_hartindex()) ? true : false)
>
> /** HART index to HART id table */
> -extern u32 hartindex_to_hartid_table[];
> +extern const u32* hartindex_to_hartid_table;
>
> /** Get sbi_scratch from HART index */
> -#define sbi_hartindex_to_hartid(__hartindex) \
> -({ \
> - ((__hartindex) <= sbi_scratch_last_hartindex()) ?\
> - hartindex_to_hartid_table[__hartindex] : -1U; \
> +#define sbi_hartindex_to_hartid(__hartindex) \
> +({ \
> + ((__hartindex) <= sbi_scratch_last_hartindex()) ? \
> + (hartindex_to_hartid_table ? \
> + hartindex_to_hartid_table[__hartindex] :\
> + __hartindex) : \
> + -1U; \
Now, we have one more unnecessary "if ()" check in the
hot-path.
This patch deteriorates sbi_hartindex_to_hartid() instead
of improving it.
Regards,
Anup
> })
>
> /** HART index to scratch table */
> diff --git a/lib/sbi/sbi_scratch.c b/lib/sbi/sbi_scratch.c
> index ccbbc68..e097077 100644
> --- a/lib/sbi/sbi_scratch.c
> +++ b/lib/sbi/sbi_scratch.c
> @@ -15,7 +15,7 @@
> #include <sbi/sbi_string.h>
>
> u32 last_hartindex_having_scratch = 0;
> -u32 hartindex_to_hartid_table[SBI_HARTMASK_MAX_BITS + 1] = { -1U };
> +const u32 *hartindex_to_hartid_table;
> struct sbi_scratch *hartindex_to_scratch_table[SBI_HARTMASK_MAX_BITS + 1] = { 0 };
>
> static spinlock_t extra_lock = SPIN_LOCK_INITIALIZER;
> @@ -25,6 +25,9 @@ u32 sbi_hartid_to_hartindex(u32 hartid)
> {
> u32 i;
>
> + if (hartindex_to_hartid_table == NULL)
> + return hartid;
> +
> for (i = 0; i <= last_hartindex_having_scratch; i++)
> if (hartindex_to_hartid_table[i] == hartid)
> return i;
> @@ -41,11 +44,11 @@ int sbi_scratch_init(struct sbi_scratch *scratch)
>
> for (i = 0; i < plat->hart_count; i++) {
> h = (plat->hart_index2id) ? plat->hart_index2id[i] : i;
> - hartindex_to_hartid_table[i] = h;
> hartindex_to_scratch_table[i] =
> ((hartid2scratch)scratch->hartid_to_scratch)(h, i);
> }
>
> + hartindex_to_hartid_table = plat->hart_index2id;
> last_hartindex_having_scratch = plat->hart_count - 1;
>
> return 0;
> --
> 2.40.1
>
>
> --
> opensbi mailing list
> opensbi at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/opensbi
More information about the opensbi
mailing list