[PATCH 1/5] lib: sbi_tlb: Reduce size of struct sbi_tlb_info
Samuel Holland
samuel.holland at sifive.com
Mon Dec 11 10:16:03 PST 2023
Hi Anup,
On 2023-12-11 12:07 PM, Anup Patel wrote:
> Let us reduce the size of struct sbi_tlb_info by doing the
> following:
> 1) Change the data type of asid and vmid fields to uint16_t
> 2) Replace local_fn() function pointer with an enum
>
> Based on the above, the size of struct sbi_tlb_info is reduced
> by 16 bytes on RV64 and 4 bytes on RV32.
Nice improvement!
> Signed-off-by: Anup Patel <apatel at ventanamicro.com>
> ---
> include/sbi/sbi_tlb.h | 29 +++++++------
> lib/sbi/sbi_ecall_legacy.c | 8 ++--
> lib/sbi/sbi_ecall_rfence.c | 16 +++----
> lib/sbi/sbi_tlb.c | 89 ++++++++++++++++++++++++++++----------
> 4 files changed, 92 insertions(+), 50 deletions(-)
>
> diff --git a/include/sbi/sbi_tlb.h b/include/sbi/sbi_tlb.h
> index 55dcab0..2c50fe8 100644
> --- a/include/sbi/sbi_tlb.h
> +++ b/include/sbi/sbi_tlb.h
> [...]
> static void tlb_pmu_incr_fw_ctr(struct sbi_tlb_info *data)
> {
> if (unlikely(!data))
> return;
>
> - if (data->local_fn == sbi_tlb_local_fence_i)
> + switch (data->type) {
> + case SBI_TLB_FENCE_I:
> sbi_pmu_ctr_incr_fw(SBI_PMU_FW_FENCE_I_SENT);
> - else if (data->local_fn == sbi_tlb_local_sfence_vma)
> + break;
> + case SBI_TLB_SFENCE_VMA:
> sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_SENT);
> - else if (data->local_fn == sbi_tlb_local_sfence_vma_asid)
> + break;
> + case SBI_TLB_SFENCE_VMA_ASID:
> sbi_pmu_ctr_incr_fw(SBI_PMU_FW_SFENCE_VMA_ASID_SENT);
> - else if (data->local_fn == sbi_tlb_local_hfence_gvma)
> - sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_SENT);
> - else if (data->local_fn == sbi_tlb_local_hfence_gvma_vmid)
> + break;
> + case SBI_TLB_HFENCE_GVMA_VMID:
> sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_VMID_SENT);
> - else if (data->local_fn == sbi_tlb_local_hfence_vvma)
> - sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_VVMA_SENT);
> - else if (data->local_fn == sbi_tlb_local_hfence_vvma_asid)
> + break;
> + case SBI_TLB_HFENCE_GVMA:
> + sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_GVMA_SENT);
> + break;
> + case SBI_TLB_HFENCE_VVMA_ASID:
> sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_VVMA_ASID_SENT);
> + break;
> + case SBI_TLB_HFENCE_VVMA:
> + sbi_pmu_ctr_incr_fw(SBI_PMU_FW_HFENCE_VVMA_SENT);
> + break;
These switch cases are all practically the same. Can this be simplified by using
a lookup table for the PMU event?
Regards,
Samuel
More information about the opensbi
mailing list