forked from Mirrors/opensbi
lib: sbi_tlb: Check tlb_range_flush_limit only once per request
The tlb_update() callback is called for each destination hart. Move the size check earlier, so it is executed only once. Signed-off-by: Samuel Holland <samuel.holland@sifive.com> Reviewed-by: Anup Patel <anup@brainfault.org>
This commit is contained in:

committed by
Anup Patel

parent
6112d584d4
commit
35cba92655
@@ -327,16 +327,6 @@ static int tlb_update(struct sbi_scratch *scratch,
|
|||||||
struct sbi_tlb_info *tinfo = data;
|
struct sbi_tlb_info *tinfo = data;
|
||||||
u32 curr_hartid = current_hartid();
|
u32 curr_hartid = current_hartid();
|
||||||
|
|
||||||
/*
|
|
||||||
* If address range to flush is too big then simply
|
|
||||||
* upgrade it to flush all because we can only flush
|
|
||||||
* 4KB at a time.
|
|
||||||
*/
|
|
||||||
if (tinfo->size > tlb_range_flush_limit) {
|
|
||||||
tinfo->start = 0;
|
|
||||||
tinfo->size = SBI_TLB_FLUSH_ALL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the request is to queue a tlb flush entry for itself
|
* If the request is to queue a tlb flush entry for itself
|
||||||
* then just do a local flush and return;
|
* then just do a local flush and return;
|
||||||
@@ -385,6 +375,16 @@ int sbi_tlb_request(ulong hmask, ulong hbase, struct sbi_tlb_info *tinfo)
|
|||||||
if (!tinfo->local_fn)
|
if (!tinfo->local_fn)
|
||||||
return SBI_EINVAL;
|
return SBI_EINVAL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If address range to flush is too big then simply
|
||||||
|
* upgrade it to flush all because we can only flush
|
||||||
|
* 4KB at a time.
|
||||||
|
*/
|
||||||
|
if (tinfo->size > tlb_range_flush_limit) {
|
||||||
|
tinfo->start = 0;
|
||||||
|
tinfo->size = SBI_TLB_FLUSH_ALL;
|
||||||
|
}
|
||||||
|
|
||||||
tlb_pmu_incr_fw_ctr(tinfo);
|
tlb_pmu_incr_fw_ctr(tinfo);
|
||||||
|
|
||||||
return sbi_ipi_send_many(hmask, hbase, tlb_event, tinfo);
|
return sbi_ipi_send_many(hmask, hbase, tlb_event, tinfo);
|
||||||
|
Reference in New Issue
Block a user