git: bec000c9c1ef - main - amd64: add a func pointer to tlb shootdown function
Date: Wed, 05 Jun 2024 12:38:39 UTC
The branch main has been updated by whu: URL: https://cgit.FreeBSD.org/src/commit/?id=bec000c9c1ef409989685bb03ff0532907befb4a commit bec000c9c1ef409989685bb03ff0532907befb4a Author: Souradeep Chakrabarti <schakrabarti@microsoft.com> AuthorDate: 2024-06-05 12:25:05 +0000 Commit: Wei Hu <whu@FreeBSD.org> CommitDate: 2024-06-05 12:25:05 +0000 amd64: add a func pointer to tlb shootdown function Make the tlb shootdown function as a pointer. By default, it still points to the system function smp_targeted_tlb_shootdown(). It allows other implemenations to overwrite in the future. Reviewed by: kib Tested by: whu Authored-by: Souradeep Chakrabarti <schakrabarti@microsoft.com> Co-Authored-by: Erni Sri Satya Vennela <ernis@microsoft.com> MFC after: 1 week Sponsored by: Microsoft Differential Revision: https://reviews.freebsd.org/D45174 --- sys/amd64/amd64/mp_machdep.c | 27 ++++++--------------------- sys/vm/pmap.h | 27 +++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/sys/amd64/amd64/mp_machdep.c b/sys/amd64/amd64/mp_machdep.c index d506ffada4b9..91737637b714 100644 --- a/sys/amd64/amd64/mp_machdep.c +++ b/sys/amd64/amd64/mp_machdep.c @@ -102,13 +102,16 @@ void *bootpcpu; extern u_int mptramp_la57; extern u_int mptramp_nx; - +smp_targeted_tlb_shootdown_t smp_targeted_tlb_shootdown = &smp_targeted_tlb_shootdown_native; /* * Local data and functions. */ static int start_ap(int apic_id, vm_paddr_t boot_address); +void +smp_targeted_tlb_shootdown_native(pmap_t pmap, vm_offset_t addr1, vm_offset_t addr2, + smp_invl_cb_t curcpu_cb, enum invl_op_codes op); /* * Initialize the IPI handlers and start up the AP's. */ @@ -497,24 +500,6 @@ start_ap(int apic_id, vm_paddr_t boot_address) * Flush the TLB on other CPU's */ -/* - * Invalidation request. PCPU pc_smp_tlb_op uses u_int instead of the - * enum to avoid both namespace and ABI issues (with enums). - */ -enum invl_op_codes { - INVL_OP_TLB = 1, - INVL_OP_TLB_INVPCID = 2, - INVL_OP_TLB_INVPCID_PTI = 3, - INVL_OP_TLB_PCID = 4, - INVL_OP_PGRNG = 5, - INVL_OP_PGRNG_INVPCID = 6, - INVL_OP_PGRNG_PCID = 7, - INVL_OP_PG = 8, - INVL_OP_PG_INVPCID = 9, - INVL_OP_PG_PCID = 10, - INVL_OP_CACHE = 11, -}; - /* * These variables are initialized at startup to reflect how each of * the different kinds of invalidations should be performed on the @@ -600,8 +585,8 @@ invl_scoreboard_slot(u_int cpu) * Function must be called with the thread pinned, and it unpins on * completion. */ -static void -smp_targeted_tlb_shootdown(pmap_t pmap, vm_offset_t addr1, vm_offset_t addr2, +void +smp_targeted_tlb_shootdown_native(pmap_t pmap, vm_offset_t addr1, vm_offset_t addr2, smp_invl_cb_t curcpu_cb, enum invl_op_codes op) { cpuset_t mask; diff --git a/sys/vm/pmap.h b/sys/vm/pmap.h index 9101201287b2..c8ca6279031c 100644 --- a/sys/vm/pmap.h +++ b/sys/vm/pmap.h @@ -167,6 +167,33 @@ void pmap_unwire(pmap_t pmap, vm_offset_t start, vm_offset_t end); void pmap_zero_page(vm_page_t); void pmap_zero_page_area(vm_page_t, int off, int size); +/* + * Invalidation request. PCPU pc_smp_tlb_op uses u_int instead of the + * enum to avoid both namespace and ABI issues (with enums). + */ +enum invl_op_codes { + INVL_OP_TLB = 1, + INVL_OP_TLB_INVPCID = 2, + INVL_OP_TLB_INVPCID_PTI = 3, + INVL_OP_TLB_PCID = 4, + INVL_OP_PGRNG = 5, + INVL_OP_PGRNG_INVPCID = 6, + INVL_OP_PGRNG_PCID = 7, + INVL_OP_PG = 8, + INVL_OP_PG_INVPCID = 9, + INVL_OP_PG_PCID = 10, + INVL_OP_CACHE = 11, +}; +typedef void (*smp_invl_local_cb_t)(struct pmap *, vm_offset_t addr1, + vm_offset_t addr2); +typedef void (*smp_targeted_tlb_shootdown_t)(pmap_t, vm_offset_t, vm_offset_t, + smp_invl_local_cb_t, enum invl_op_codes); + +extern void +smp_targeted_tlb_shootdown_native(pmap_t, vm_offset_t, vm_offset_t, + smp_invl_local_cb_t, enum invl_op_codes); +extern smp_targeted_tlb_shootdown_t smp_targeted_tlb_shootdown; + #define pmap_resident_count(pm) ((pm)->pm_stats.resident_count) #define pmap_wired_count(pm) ((pm)->pm_stats.wired_count)