WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [IA64] vhtp clean-up

# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 77ccce98ddef972ef187eea09583f8545b5858c3
# Parent  06e5c5599147cd34caab554ca71ab03e52c85e6f
[IA64] vhtp clean-up

Create a clean interface for vhpt/tlb.

Signed-off-by: Tristan Gingold <tristan.gingold@xxxxxxxx>
---
 xen/include/asm-ia64/flushtlb.h               |    9 -
 xen/include/asm-ia64/linux-xen/asm/tlbflush.h |  119 --------------
 xen/arch/ia64/linux-xen/smp.c                 |   32 ---
 xen/arch/ia64/xen/domain.c                    |   20 --
 xen/arch/ia64/xen/hyperprivop.S               |    2 
 xen/arch/ia64/xen/process.c                   |    6 
 xen/arch/ia64/xen/vcpu.c                      |   46 -----
 xen/arch/ia64/xen/vhpt.c                      |  214 +++++++++++++++++---------
 xen/arch/ia64/xen/xenmisc.c                   |    3 
 xen/include/asm-ia64/mm.h                     |    2 
 xen/include/asm-ia64/tlbflush.h               |   37 ++++
 xen/include/asm-ia64/vcpu.h                   |    5 
 xen/include/asm-ia64/vhpt.h                   |   11 -
 13 files changed, 193 insertions(+), 313 deletions(-)

diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/linux-xen/smp.c
--- a/xen/arch/ia64/linux-xen/smp.c     Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/linux-xen/smp.c     Tue May 16 10:35:58 2006 -0600
@@ -53,28 +53,6 @@
 #endif
 
 #ifdef XEN
-// FIXME: MOVE ELSEWHERE
-//Huh? This seems to be used on ia64 even if !CONFIG_SMP
-void flush_tlb_mask(cpumask_t mask)
-{
-    int cpu;
-
-    cpu = smp_processor_id();
-    if (cpu_isset (cpu, mask)) {
-        cpu_clear(cpu, mask);
-       local_flush_tlb_all ();
-    }
-
-#ifdef CONFIG_SMP
-    if (cpus_empty(mask))
-        return;
-
-    for (cpu = 0; cpu < NR_CPUS; ++cpu)
-        if (cpu_isset(cpu, mask))
-          smp_call_function_single
-            (cpu, (void (*)(void *))local_flush_tlb_all, NULL, 1, 1);
-#endif
-}
 //#if CONFIG_SMP || IA64
 #if CONFIG_SMP
 //Huh? This seems to be used on ia64 even if !CONFIG_SMP
@@ -276,7 +254,6 @@ smp_send_reschedule (int cpu)
 {
        platform_send_ipi(cpu, IA64_IPI_RESCHEDULE, IA64_IPI_DM_INT, 0);
 }
-#endif
 
 void
 smp_flush_tlb_all (void)
@@ -284,15 +261,6 @@ smp_flush_tlb_all (void)
        on_each_cpu((void (*)(void *))local_flush_tlb_all, NULL, 1, 1);
 }
 
-#ifdef XEN
-void
-smp_vhpt_flush_all(void)
-{
-       on_each_cpu((void (*)(void *))vhpt_flush, NULL, 1, 1);
-}
-#endif
-
-#ifndef XEN
 void
 smp_flush_tlb_mm (struct mm_struct *mm)
 {
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/domain.c        Tue May 16 10:35:58 2006 -0600
@@ -89,13 +89,9 @@ void arch_domain_destroy(struct domain *
        if (d->shared_info != NULL)
                free_xenheap_page(d->shared_info);
 
+       domain_flush_destroy (d);
+
        deallocate_rid_range(d);
-
-       /* It is really good in this? */
-       flush_tlb_all();
-
-       /* It is really good in this? */
-       vhpt_flush_all();
 }
 
 static void default_idle(void)
@@ -873,17 +869,7 @@ domain_page_flush(struct domain* d, unsi
 domain_page_flush(struct domain* d, unsigned long mpaddr,
                   unsigned long old_mfn, unsigned long new_mfn)
 {
-    struct vcpu* v;
-    //XXX SMP
-    for_each_vcpu(d, v) {
-        vcpu_purge_tr_entry(&v->arch.dtlb);
-        vcpu_purge_tr_entry(&v->arch.itlb);
-    }
-
-    // flush vhpt
-    vhpt_flush();
-    // flush tlb
-    flush_tlb_all();
+    domain_flush_vtlb_all (d);
 }
 #endif
 
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/hyperprivop.S
--- a/xen/arch/ia64/xen/hyperprivop.S   Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/hyperprivop.S   Tue May 16 10:35:58 2006 -0600
@@ -47,7 +47,7 @@
 #endif
 
 #ifdef CONFIG_SMP
-#warning "FIXME: ptc.ga instruction requires spinlock for SMP"
+//#warning "FIXME: ptc.ga instruction requires spinlock for SMP"
 #undef FAST_PTC_GA
 #endif
 
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/process.c
--- a/xen/arch/ia64/xen/process.c       Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/process.c       Tue May 16 10:35:58 2006 -0600
@@ -307,11 +307,7 @@ void ia64_do_page_fault (unsigned long a
                if (fault == IA64_USE_TLB && !current->arch.dtlb.pte.p) {
                        /* dtlb has been purged in-between.  This dtlb was
                           matching.  Undo the work.  */
-#ifdef VHPT_GLOBAL
-                       vhpt_flush_address (address, 1);
-#endif
-                       ia64_ptcl(address, 1<<2);
-                       ia64_srlz_i();
+                       vcpu_flush_tlb_vhpt_range (address, 1);
                        goto again;
                }
                return;
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c  Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/vcpu.c  Tue May 16 10:35:58 2006 -0600
@@ -28,8 +28,6 @@ extern void setfpreg (unsigned long regn
 
 extern void panic_domain(struct pt_regs *, const char *, ...);
 extern unsigned long translate_domain_mpaddr(unsigned long);
-extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
-
 
 typedef        union {
        struct ia64_psr ia64_psr;
@@ -1702,11 +1700,6 @@ IA64FAULT vcpu_set_pkr(VCPU *vcpu, UINT6
  VCPU translation register access routines
 **************************************************************************/
 
-void vcpu_purge_tr_entry(TR_ENTRY *trp)
-{
-       trp->pte.val = 0;
-}
-
 static void vcpu_set_tr_entry(TR_ENTRY *trp, UINT64 pte, UINT64 itir, UINT64 
ifa)
 {
        UINT64 ps;
@@ -1867,21 +1860,13 @@ IA64FAULT vcpu_fc(VCPU *vcpu, UINT64 vad
        return fault;
 }
 
-int ptce_count = 0;
 IA64FAULT vcpu_ptc_e(VCPU *vcpu, UINT64 vadr)
 {
        // Note that this only needs to be called once, i.e. the
        // architected loop to purge the entire TLB, should use
        //  base = stride1 = stride2 = 0, count0 = count 1 = 1
 
-       // just invalidate the "whole" tlb
-       vcpu_purge_tr_entry(&PSCBX(vcpu,dtlb));
-       vcpu_purge_tr_entry(&PSCBX(vcpu,itlb));
-
-#ifdef VHPT_GLOBAL
-       vhpt_flush();   // FIXME: This is overdoing it
-#endif
-       local_flush_tlb_all();
+       vcpu_flush_vtlb_all ();
 
        return IA64_NO_FAULT;
 }
@@ -1899,33 +1884,8 @@ IA64FAULT vcpu_ptc_ga(VCPU *vcpu,UINT64 
        // FIXME: ??breaks if domain PAGE_SIZE < Xen PAGE_SIZE
 //printf("######## vcpu_ptc_ga(%p,%p) ##############\n",vadr,addr_range);
 
-#ifdef CONFIG_XEN_SMP
-       struct domain *d = vcpu->domain;
-       struct vcpu *v;
-
-       for_each_vcpu (d, v) {
-               if (v == vcpu)
-                       continue;
-
-               /* Purge TC entries.
-                  FIXME: clear only if match.  */
-               vcpu_purge_tr_entry(&PSCBX(v,dtlb));
-               vcpu_purge_tr_entry(&PSCBX(v,itlb));
-
-#ifdef VHPT_GLOBAL
-               /* Invalidate VHPT entries.  */
-               vhpt_flush_address_remote (v->processor, vadr, addr_range);
-#endif
-       }
-#endif
-
-#ifdef VHPT_GLOBAL
-       vhpt_flush_address(vadr,addr_range);
-#endif
-       ia64_global_tlb_purge(vadr,vadr+addr_range,PAGE_SHIFT);
-       /* Purge tc.  */
-       vcpu_purge_tr_entry(&PSCBX(vcpu,dtlb));
-       vcpu_purge_tr_entry(&PSCBX(vcpu,itlb));
+       domain_flush_vtlb_range (vcpu->domain, vadr, addr_range);
+
        return IA64_NO_FAULT;
 }
 
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/vhpt.c
--- a/xen/arch/ia64/xen/vhpt.c  Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/vhpt.c  Tue May 16 10:35:58 2006 -0600
@@ -12,32 +12,31 @@
 #include <asm/system.h>
 #include <asm/pgalloc.h>
 #include <asm/page.h>
-#include <asm/dma.h>
 #include <asm/vhpt.h>
+#include <asm/vcpu.h>
+
+/* Defined in tlb.c  */
+extern void ia64_global_tlb_purge(UINT64 start, UINT64 end, UINT64 nbits);
 
 extern long running_on_sim;
 
 DEFINE_PER_CPU (unsigned long, vhpt_paddr);
 DEFINE_PER_CPU (unsigned long, vhpt_pend);
 
-void vhpt_flush(void)
-{
-       struct vhpt_lf_entry *v =__va(__ia64_per_cpu_var(vhpt_paddr));
-       int i;
-#if 0
-static int firsttime = 2;
-
-if (firsttime) firsttime--;
-else {
-printf("vhpt_flush: *********************************************\n");
-printf("vhpt_flush: *********************************************\n");
-printf("vhpt_flush: *********************************************\n");
-printf("vhpt_flush: flushing vhpt (seems to crash at rid wrap?)...\n");
-printf("vhpt_flush: *********************************************\n");
-printf("vhpt_flush: *********************************************\n");
-printf("vhpt_flush: *********************************************\n");
-}
-#endif
+static void vhpt_flush(void)
+{
+       struct vhpt_lf_entry *v = (struct vhpt_lf_entry *)VHPT_ADDR;
+       int i;
+
+       for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++)
+               v->ti_tag = INVALID_TI_TAG;
+}
+
+static void vhpt_erase(void)
+{
+       struct vhpt_lf_entry *v = (struct vhpt_lf_entry *)VHPT_ADDR;
+       int i;
+
        for (i = 0; i < VHPT_NUM_ENTRIES; i++, v++) {
                v->itir = 0;
                v->CChain = 0;
@@ -47,51 +46,6 @@ printf("vhpt_flush: ********************
        // initialize cache too???
 }
 
-#ifdef VHPT_GLOBAL
-void vhpt_flush_address(unsigned long vadr, unsigned long addr_range)
-{
-       struct vhpt_lf_entry *vlfe;
-
-       if ((vadr >> 61) == 7) {
-               // no vhpt for region 7 yet, see vcpu_itc_no_srlz
-               printf("vhpt_flush_address: region 7, spinning...\n");
-               while(1);
-       }
-#if 0
-       // this only seems to occur at shutdown, but it does occur
-       if ((!addr_range) || addr_range & (addr_range - 1)) {
-               printf("vhpt_flush_address: weird range, spinning...\n");
-               while(1);
-       }
-//printf("************** vhpt_flush_address(%p,%p)\n",vadr,addr_range);
-#endif
-       while ((long)addr_range > 0) {
-               vlfe = (struct vhpt_lf_entry *)ia64_thash(vadr);
-               // FIXME: for now, just blow it away even if it belongs to
-               // another domain.  Later, use ttag to check for match
-//if (!(vlfe->ti_tag & INVALID_TI_TAG)) {
-//printf("vhpt_flush_address: blowing away valid tag for vadr=%p\n",vadr);
-//}
-               vlfe->ti_tag |= INVALID_TI_TAG;
-               addr_range -= PAGE_SIZE;
-               vadr += PAGE_SIZE;
-       }
-}
-
-void vhpt_flush_address_remote(int cpu,
-                              unsigned long vadr, unsigned long addr_range)
-{
-       while ((long)addr_range > 0) {
-               /* Get the VHPT entry.  */
-               unsigned int off = ia64_thash(vadr) - VHPT_ADDR;
-               volatile struct vhpt_lf_entry *v;
-               v =__va(per_cpu(vhpt_paddr, cpu) + off);
-               v->ti_tag = INVALID_TI_TAG;
-               addr_range -= PAGE_SIZE;
-               vadr += PAGE_SIZE;
-       }
-}
-#endif
 
 static void vhpt_map(unsigned long pte)
 {
@@ -147,17 +101,11 @@ void vhpt_multiple_insert(unsigned long 
 
 void vhpt_init(void)
 {
-       unsigned long vhpt_total_size, vhpt_alignment;
        unsigned long paddr, pte;
        struct page_info *page;
 #if !VHPT_ENABLED
        return;
 #endif
-       // allocate a huge chunk of physical memory.... how???
-       vhpt_total_size = 1 << VHPT_SIZE_LOG2;  // 4MB, 16MB, 64MB, or 256MB
-       vhpt_alignment = 1 << VHPT_SIZE_LOG2;   // 4MB, 16MB, 64MB, or 256MB
-       printf("vhpt_init: vhpt size=0x%lx, align=0x%lx\n",
-               vhpt_total_size, vhpt_alignment);
        /* This allocation only holds true if vhpt table is unique for
         * all domains. Or else later new vhpt table should be allocated
         * from domain heap when each domain is created. Assume xen buddy
@@ -167,17 +115,135 @@ void vhpt_init(void)
        if (!page)
                panic("vhpt_init: can't allocate VHPT!\n");
        paddr = page_to_maddr(page);
+       if (paddr & ((1 << VHPT_SIZE_LOG2) - 1))
+               panic("vhpt_init: bad VHPT alignment!\n");
        __get_cpu_var(vhpt_paddr) = paddr;
-       __get_cpu_var(vhpt_pend) = paddr + vhpt_total_size - 1;
+       __get_cpu_var(vhpt_pend) = paddr + (1 << VHPT_SIZE_LOG2) - 1;
        printf("vhpt_init: vhpt paddr=0x%lx, end=0x%lx\n",
                paddr, __get_cpu_var(vhpt_pend));
        pte = pte_val(pfn_pte(paddr >> PAGE_SHIFT, PAGE_KERNEL));
        vhpt_map(pte);
        ia64_set_pta(VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) |
                VHPT_ENABLED);
-       vhpt_flush();
-}
-
+       vhpt_erase();
+}
+
+
+void vcpu_flush_vtlb_all (void)
+{
+       struct vcpu *v = current;
+
+       /* First VCPU tlb.  */
+       vcpu_purge_tr_entry(&PSCBX(v,dtlb));
+       vcpu_purge_tr_entry(&PSCBX(v,itlb));
+
+       /* Then VHPT.  */
+       vhpt_flush ();
+
+       /* Then mTLB.  */
+       local_flush_tlb_all ();
+
+       /* We could clear bit in d->domain_dirty_cpumask only if domain d in
+          not running on this processor.  There is currently no easy way to
+          check this.  */
+}
+
+void domain_flush_vtlb_all (void)
+{
+       int cpu = smp_processor_id ();
+       struct vcpu *v;
+
+       for_each_vcpu (current->domain, v)
+               if (v->processor == cpu)
+                       vcpu_flush_vtlb_all ();
+               else
+                       smp_call_function_single
+                               (v->processor,
+                                (void(*)(void *))vcpu_flush_vtlb_all,
+                                NULL,1,1);
+}
+
+static void cpu_flush_vhpt_range (int cpu, u64 vadr, u64 addr_range)
+{
+       void *vhpt_base = __va(per_cpu(vhpt_paddr, cpu));
+
+       while ((long)addr_range > 0) {
+               /* Get the VHPT entry.  */
+               unsigned int off = ia64_thash(vadr) - VHPT_ADDR;
+               volatile struct vhpt_lf_entry *v;
+               v = vhpt_base + off;
+               v->ti_tag = INVALID_TI_TAG;
+               addr_range -= PAGE_SIZE;
+               vadr += PAGE_SIZE;
+       }
+}
+
+void vcpu_flush_tlb_vhpt_range (u64 vadr, u64 log_range)
+{
+       cpu_flush_vhpt_range (current->processor, vadr, 1UL << log_range);
+       ia64_ptcl(vadr, log_range << 2);
+       ia64_srlz_i();
+}
+
+void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range)
+{
+       struct vcpu *v;
+
+#if 0
+       // this only seems to occur at shutdown, but it does occur
+       if ((!addr_range) || addr_range & (addr_range - 1)) {
+               printf("vhpt_flush_address: weird range, spinning...\n");
+               while(1);
+       }
+#endif
+
+       for_each_vcpu (d, v) {
+               /* Purge TC entries.
+                  FIXME: clear only if match.  */
+               vcpu_purge_tr_entry(&PSCBX(v,dtlb));
+               vcpu_purge_tr_entry(&PSCBX(v,itlb));
+
+               /* Invalidate VHPT entries.  */
+               cpu_flush_vhpt_range (v->processor, vadr, addr_range);
+       }
+
+       /* ptc.ga  */
+       ia64_global_tlb_purge(vadr,vadr+addr_range,PAGE_SHIFT);
+}
+
+static void flush_tlb_vhpt_all (struct domain *d)
+{
+       /* First VHPT.  */
+       vhpt_flush ();
+
+       /* Then mTLB.  */
+       local_flush_tlb_all ();
+}
+
+void domain_flush_destroy (struct domain *d)
+{
+       /* Very heavy...  */
+       on_each_cpu ((void (*)(void *))flush_tlb_vhpt_all, d, 1, 1);
+       cpus_clear (d->domain_dirty_cpumask);
+}
+
+void flush_tlb_mask(cpumask_t mask)
+{
+    int cpu;
+
+    cpu = smp_processor_id();
+    if (cpu_isset (cpu, mask)) {
+        cpu_clear(cpu, mask);
+        flush_tlb_vhpt_all (NULL);
+    }
+
+    if (cpus_empty(mask))
+        return;
+
+    for_each_cpu_mask (cpu, mask)
+        smp_call_function_single
+            (cpu, (void (*)(void *))flush_tlb_vhpt_all, NULL, 1, 1);
+}
 
 void zero_vhpt_stats(void)
 {
diff -r 06e5c5599147 -r 77ccce98ddef xen/arch/ia64/xen/xenmisc.c
--- a/xen/arch/ia64/xen/xenmisc.c       Tue May 16 09:05:36 2006 -0600
+++ b/xen/arch/ia64/xen/xenmisc.c       Tue May 16 10:35:58 2006 -0600
@@ -267,6 +267,9 @@ void context_switch(struct vcpu *prev, s
            vmx_load_state(next);
     /*ia64_psr(ia64_task_regs(next))->dfh = !ia64_is_local_fpu_owner(next);*/
     prev = ia64_switch_to(next);
+
+    //cpu_set(smp_processor_id(), current->domain->domain_dirty_cpumask);
+
     if (!VMX_DOMAIN(current)){
            vcpu_set_next_timer(current);
     }
diff -r 06e5c5599147 -r 77ccce98ddef xen/include/asm-ia64/mm.h
--- a/xen/include/asm-ia64/mm.h Tue May 16 09:05:36 2006 -0600
+++ b/xen/include/asm-ia64/mm.h Tue May 16 10:35:58 2006 -0600
@@ -12,7 +12,7 @@
 
 #include <asm/processor.h>
 #include <asm/atomic.h>
-#include <asm/flushtlb.h>
+#include <asm/tlbflush.h>
 #include <asm/io.h>
 
 #include <public/xen.h>
diff -r 06e5c5599147 -r 77ccce98ddef xen/include/asm-ia64/vcpu.h
--- a/xen/include/asm-ia64/vcpu.h       Tue May 16 09:05:36 2006 -0600
+++ b/xen/include/asm-ia64/vcpu.h       Tue May 16 10:35:58 2006 -0600
@@ -135,7 +135,10 @@ extern IA64FAULT vcpu_set_pkr(VCPU *vcpu
 extern IA64FAULT vcpu_set_pkr(VCPU *vcpu, UINT64 reg, UINT64 val);
 extern IA64FAULT vcpu_tak(VCPU *vcpu, UINT64 vadr, UINT64 *key);
 /* TLB */
-extern void vcpu_purge_tr_entry(TR_ENTRY *trp);
+static inline void vcpu_purge_tr_entry(TR_ENTRY *trp)
+{
+       trp->pte.val = 0;
+}
 extern IA64FAULT vcpu_itr_d(VCPU *vcpu, UINT64 slot, UINT64 padr,
                UINT64 itir, UINT64 ifa);
 extern IA64FAULT vcpu_itr_i(VCPU *vcpu, UINT64 slot, UINT64 padr,
diff -r 06e5c5599147 -r 77ccce98ddef xen/include/asm-ia64/vhpt.h
--- a/xen/include/asm-ia64/vhpt.h       Tue May 16 09:05:36 2006 -0600
+++ b/xen/include/asm-ia64/vhpt.h       Tue May 16 10:35:58 2006 -0600
@@ -14,13 +14,7 @@
 /* Number of entries in the VHPT.  The size of an entry is 4*8B == 32B */
 #define        VHPT_NUM_ENTRIES                (1 << (VHPT_SIZE_LOG2 - 5))
 
-#ifdef CONFIG_SMP
-# define vhpt_flush_all()      smp_vhpt_flush_all()
-#else
-# define vhpt_flush_all()      vhpt_flush()
-#endif
 // FIXME: These should be automatically generated
-
 #define        VLE_PGFLAGS_OFFSET              0
 #define        VLE_ITIR_OFFSET                 8
 #define        VLE_TITAG_OFFSET                16
@@ -42,15 +36,10 @@ extern void vhpt_init (void);
 extern void vhpt_init (void);
 extern void zero_vhpt_stats(void);
 extern int dump_vhpt_stats(char *buf);
-extern void vhpt_flush_address(unsigned long vadr, unsigned long addr_range);
-extern void vhpt_flush_address_remote(int cpu, unsigned long vadr,
-                                     unsigned long addr_range);
 extern void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte,
                                 unsigned long logps);
 extern void vhpt_insert (unsigned long vadr, unsigned long pte,
                         unsigned long logps);
-extern void vhpt_flush(void);
-extern void smp_vhpt_flush_all(void);
 
 /* Currently the VHPT is allocated per CPU.  */
 DECLARE_PER_CPU (unsigned long, vhpt_paddr);
diff -r 06e5c5599147 -r 77ccce98ddef xen/include/asm-ia64/tlbflush.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/asm-ia64/tlbflush.h   Tue May 16 10:35:58 2006 -0600
@@ -0,0 +1,37 @@
+#ifndef __FLUSHTLB_H__
+#define __FLUSHTLB_H__
+
+#include <xen/sched.h>
+
+/* TLB flushes can be either local (current vcpu only) or domain wide (on
+   all vcpus).
+   TLB flushes can be either all-flush or range only.
+
+   vTLB flushing means flushing VCPU virtual TLB + machine TLB + machine VHPT.
+*/
+
+/* Local all flush of vTLB.  */
+void vcpu_flush_vtlb_all (void);
+
+/* Local range flush of machine TLB only (not full VCPU virtual TLB!!!)  */
+void vcpu_flush_tlb_vhpt_range (u64 vadr, u64 log_range);
+
+/* Global all flush of vTLB  */
+void domain_flush_vtlb_all (void);
+
+/* Global range-flush of vTLB.  */
+void domain_flush_vtlb_range (struct domain *d, u64 vadr, u64 addr_range);
+
+/* Final vTLB flush on every dirty cpus.  */
+void domain_flush_destroy (struct domain *d);
+
+/* Flush v-tlb on cpus set in mask for current domain.  */
+void flush_tlb_mask(cpumask_t mask);
+
+/* Flush local machine TLB.  */
+void local_flush_tlb_all (void);
+
+#define tlbflush_current_time() 0
+#define tlbflush_filter(x,y) ((void)0)
+
+#endif
diff -r 06e5c5599147 -r 77ccce98ddef xen/include/asm-ia64/flushtlb.h
--- a/xen/include/asm-ia64/flushtlb.h   Tue May 16 09:05:36 2006 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-#ifndef __FLUSHTLB_H__
-#define __FLUSHTLB_H__
-
-#include <asm/tlbflush.h>
-
-#define tlbflush_current_time() 0
-#define tlbflush_filter(x,y) ((void)0)
-
-#endif
diff -r 06e5c5599147 -r 77ccce98ddef 
xen/include/asm-ia64/linux-xen/asm/tlbflush.h
--- a/xen/include/asm-ia64/linux-xen/asm/tlbflush.h     Tue May 16 09:05:36 
2006 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,119 +0,0 @@
-#ifndef _ASM_IA64_TLBFLUSH_H
-#define _ASM_IA64_TLBFLUSH_H
-
-/*
- * Copyright (C) 2002 Hewlett-Packard Co
- *     David Mosberger-Tang <davidm@xxxxxxxxxx>
- */
-
-#include <linux/config.h>
-
-#include <linux/mm.h>
-
-#include <asm/intrinsics.h>
-#include <asm/mmu_context.h>
-#include <asm/page.h>
-
-/*
- * Now for some TLB flushing routines.  This is the kind of stuff that
- * can be very expensive, so try to avoid them whenever possible.
- */
-
-/*
- * Flush everything (kernel mapping may also have changed due to
- * vmalloc/vfree).
- */
-extern void local_flush_tlb_all (void);
-
-#ifdef CONFIG_SMP
-  extern void smp_flush_tlb_all (void);
-  extern void smp_flush_tlb_mm (struct mm_struct *mm);
-# define flush_tlb_all()       smp_flush_tlb_all()
-#else
-# define flush_tlb_all()       local_flush_tlb_all()
-#endif
-
-#ifndef XEN
-static inline void
-local_finish_flush_tlb_mm (struct mm_struct *mm)
-{
-#ifndef XEN
-// FIXME SMP?
-       if (mm == current->active_mm)
-               activate_context(mm);
-#endif
-}
-
-/*
- * Flush a specified user mapping.  This is called, e.g., as a result of 
fork() and
- * exit().  fork() ends up here because the copy-on-write mechanism needs to 
write-protect
- * the PTEs of the parent task.
- */
-static inline void
-flush_tlb_mm (struct mm_struct *mm)
-{
-       if (!mm)
-               return;
-
-#ifndef XEN
-// FIXME SMP?
-       mm->context = 0;
-#endif
-
-       if (atomic_read(&mm->mm_users) == 0)
-               return;         /* happens as a result of exit_mmap() */
-
-#ifdef CONFIG_SMP
-       smp_flush_tlb_mm(mm);
-#else
-       local_finish_flush_tlb_mm(mm);
-#endif
-}
-
-extern void flush_tlb_range (struct vm_area_struct *vma, unsigned long start, 
unsigned long end);
-
-/*
- * Page-granular tlb flush.
- */
-static inline void
-flush_tlb_page (struct vm_area_struct *vma, unsigned long addr)
-{
-#ifdef CONFIG_SMP
-       flush_tlb_range(vma, (addr & PAGE_MASK), (addr & PAGE_MASK) + 
PAGE_SIZE);
-#else
-#ifdef XEN
-       if (vma->vm_mm == current->domain->arch.mm)
-#else
-       if (vma->vm_mm == current->active_mm)
-#endif
-               ia64_ptcl(addr, (PAGE_SHIFT << 2));
-#ifndef XEN
-// FIXME SMP?
-       else
-               vma->vm_mm->context = 0;
-#endif
-#endif
-}
-
-/*
- * Flush the TLB entries mapping the virtually mapped linear page
- * table corresponding to address range [START-END).
- */
-static inline void
-flush_tlb_pgtables (struct mm_struct *mm, unsigned long start, unsigned long 
end)
-{
-       /*
-        * Deprecated.  The virtual page table is now flushed via the normal 
gather/flush
-        * interface (see tlb.h).
-        */
-}
-
-
-#define flush_tlb_kernel_range(start, end)     flush_tlb_all() /* XXX fix me */
-#endif /* XEN */
-
-#ifdef XEN
-extern void flush_tlb_mask(cpumask_t mask);
-#endif
-
-#endif /* _ASM_IA64_TLBFLUSH_H */

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [IA64] vhtp clean-up, Xen patchbot-unstable <=