git: bec000c9c1ef - main - amd64: add a func pointer to tlb shootdown function

From: Wei Hu <whu_at_FreeBSD.org>
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)