From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Andi Kleen <ak@muc.de>
Cc: Chris Wright <chrisw@sous-sol.org>,
virtualization@lists.osdl.org, xen-devel@lists.xensource.com,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org
Subject: [patch 17/34] Xen-pv_ops: add flush_tlb_others paravirt_op
Date: Tue, 13 Mar 2007 16:30:34 -0700 [thread overview]
Message-ID: <20070313233032.504059544@goop.org> (raw)
In-Reply-To: 20070313233017.933601256@goop.org
[-- Attachment #1: paravirt-flush_tlb_others.patch --]
[-- Type: text/plain, Size: 5193 bytes --]
This patch adds a pv_op for flush_tlb_others. Some hypervisors, such
as Xen, have much more efficient ways to implement cross-cpu tlb
shootdown than IPI, so expose an appropriate operation to allow it to
be used.
Signed-off-by: Jeremy Fitzhardinge <jeremy@xensource.com>
---
arch/i386/kernel/paravirt.c | 1 +
arch/i386/kernel/smp.c | 15 ++++++++-------
include/asm-i386/paravirt.h | 8 ++++++++
include/asm-i386/tlbflush.h | 19 +++++++++++++++++--
4 files changed, 34 insertions(+), 9 deletions(-)
===================================================================
--- a/arch/i386/kernel/paravirt.c
+++ b/arch/i386/kernel/paravirt.c
@@ -584,6 +584,7 @@ struct paravirt_ops paravirt_ops = {
.flush_tlb_user = native_flush_tlb,
.flush_tlb_kernel = native_flush_tlb_global,
.flush_tlb_single = native_flush_tlb_single,
+ .flush_tlb_others = native_flush_tlb_others,
.map_pt_hook = paravirt_nop,
===================================================================
--- a/arch/i386/kernel/smp.c
+++ b/arch/i386/kernel/smp.c
@@ -256,7 +256,6 @@ static struct mm_struct * flush_mm;
static struct mm_struct * flush_mm;
static unsigned long flush_va;
static DEFINE_SPINLOCK(tlbstate_lock);
-#define FLUSH_ALL 0xffffffff
/*
* We cannot call mmdrop() because we are in interrupt context,
@@ -338,7 +337,7 @@ fastcall void smp_invalidate_interrupt(s
if (flush_mm == per_cpu(cpu_tlbstate, cpu).active_mm) {
if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK) {
- if (flush_va == FLUSH_ALL)
+ if (flush_va == TLB_FLUSH_ALL)
local_flush_tlb();
else
__flush_tlb_one(flush_va);
@@ -353,9 +352,11 @@ out:
put_cpu_no_resched();
}
-static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
- unsigned long va)
-{
+void native_flush_tlb_others(const cpumask_t *cpumaskp, struct mm_struct *mm,
+ unsigned long va)
+{
+ cpumask_t cpumask = *cpumaskp;
+
/*
* A couple of (to be removed) sanity checks:
*
@@ -417,7 +418,7 @@ void flush_tlb_current_task(void)
local_flush_tlb();
if (!cpus_empty(cpu_mask))
- flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL);
preempt_enable();
}
@@ -436,7 +437,7 @@ void flush_tlb_mm (struct mm_struct * mm
leave_mm(smp_processor_id());
}
if (!cpus_empty(cpu_mask))
- flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
+ flush_tlb_others(cpu_mask, mm, TLB_FLUSH_ALL);
preempt_enable();
}
===================================================================
--- a/include/asm-i386/paravirt.h
+++ b/include/asm-i386/paravirt.h
@@ -15,6 +15,7 @@
#ifndef __ASSEMBLY__
#include <linux/types.h>
+#include <linux/cpumask.h>
struct thread_struct;
struct Xgt_desc_struct;
@@ -121,6 +122,8 @@ struct paravirt_ops
void (*flush_tlb_user)(void);
void (*flush_tlb_kernel)(void);
void (*flush_tlb_single)(u32 addr);
+ void (*flush_tlb_others)(const cpumask_t *cpus, struct mm_struct *mm,
+ unsigned long va);
void (*map_pt_hook)(int type, pte_t *va, u32 pfn);
@@ -652,6 +655,11 @@ static inline void arch_exit_mmap(struct
#define __flush_tlb() PVOP_VCALL0(flush_tlb_user)
#define __flush_tlb_global() PVOP_VCALL0(flush_tlb_kernel)
#define __flush_tlb_single(addr) PVOP_VCALL1(flush_tlb_single, addr)
+static inline void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
+ unsigned long va)
+{
+ PVOP_VCALL3(flush_tlb_others, &cpumask, mm, va);
+}
static inline void paravirt_map_pt_hook(int type, pte_t *va, u32 pfn)
{
===================================================================
--- a/include/asm-i386/tlbflush.h
+++ b/include/asm-i386/tlbflush.h
@@ -79,10 +79,14 @@
* - flush_tlb_range(vma, start, end) flushes a range of pages
* - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
* - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
+ * - flush_tlb_others(cpumask, mm, va) flushes a TLBs on other cpus
*
* ..but the i386 has somewhat limited tlb flushing capabilities,
* and page-granular flushes are available only on i486 and up.
*/
+
+#define TLB_FLUSH_ALL 0xffffffff
+
#ifndef CONFIG_SMP
@@ -110,7 +114,12 @@ static inline void flush_tlb_range(struc
__flush_tlb();
}
-#else
+static inline void native_flush_tlb_others(const cpumask_t *cpumask,
+ struct mm_struct *mm, unsigned long va)
+{
+}
+
+#else /* SMP */
#include <asm/smp.h>
@@ -129,6 +138,9 @@ static inline void flush_tlb_range(struc
flush_tlb_mm(vma->vm_mm);
}
+void native_flush_tlb_others(const cpumask_t *cpumask, struct mm_struct *mm,
+ unsigned long va);
+
#define TLBSTATE_OK 1
#define TLBSTATE_LAZY 2
@@ -139,8 +151,11 @@ struct tlb_state
char __cacheline_padding[L1_CACHE_BYTES-8];
};
DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate);
+#endif /* SMP */
-
+#ifndef CONFIG_PARAVIRT
+#define flush_tlb_others(mask, mm, va) \
+ native_flush_tlb_others(&mask, mm, va)
#endif
#define flush_tlb_kernel_range(start, end) flush_tlb_all()
--
next prev parent reply other threads:[~2007-03-13 23:30 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-13 23:30 [patch 00/34] Xen-pv_ops: Xen guest implementation for paravirt_ops interface Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 01/34] Xen-pv_ops: Fix typo in sync_constant_test_bit()s name Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 02/34] Xen-pv_ops: ignore vgacon if hardware not present Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 03/34] Xen-pv_ops: update MAINTAINERS Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 04/34] Xen-pv_ops: use paravirt_nop to consistently mark no-op operations Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 05/34] Xen-pv_ops: Add pagetable accessors to pack and unpack pagetable entries Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 06/34] Xen-pv_ops: Hooks to set up initial pagetable Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 07/34] Xen-pv_ops: Allocate a fixmap slot Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 08/34] Xen-pv_ops: Allow paravirt backend to choose kernel PMD sharing Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 09/34] Xen-pv_ops: add hooks to intercept mm creation and destruction Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 10/34] Xen-pv_ops: Simplify smp_call_function*() by using common implementation Jeremy Fitzhardinge
2007-03-16 2:38 ` Randy Dunlap
2007-03-16 2:38 ` Randy Dunlap
2007-03-13 23:30 ` [patch 11/34] Xen-pv_ops: Add smp_ops interface Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 12/34] Xen-pv_ops: rename struct paravirt_patch to paravirt_patch_site for clarity Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 13/34] Xen-pv_ops: Use patch site IDs computed from offset in paravirt_ops structure Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 14/34] Xen-pv_ops: Fix patch site clobbers to include return register Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 15/34] Xen-pv_ops: Consistently wrap paravirt ops callsites to make them patchable Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 16/34] Xen-pv_ops: add common patching machinery Jeremy Fitzhardinge
2007-03-13 23:30 ` Jeremy Fitzhardinge [this message]
2007-03-13 23:30 ` [patch 18/34] Xen-pv_ops: revert map_pt_hook Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 19/34] Xen-pv_ops: add kmap_atomic_pte for mapping highpte pages Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 20/34] Xen-pv_ops: Add apply_to_page_range() which applies a function to a pte range Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 21/34] Xen-pv_ops: Allocate and free vmalloc areas Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 22/34] Xen-pv_ops: Add nosegneg capability to the vsyscall page notes Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 23/34] Xen-pv_ops: Add XEN config options Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 24/34] Xen-pv_ops: Add Xen interface header files Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 25/34] Xen-pv_ops: Core Xen implementation Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 26/34] Xen-pv_ops: Complete pagetable pinning for Xen Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 27/34] Xen-pv_ops: Implement Xen clockevent device Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 28/34] Xen-pv_ops: Xen SMP guest support Jeremy Fitzhardinge
2007-03-14 13:28 ` Benjamin LaHaise
2007-03-14 13:28 ` Benjamin LaHaise
2007-03-14 15:05 ` Jeremy Fitzhardinge
2007-03-14 15:05 ` Jeremy Fitzhardinge
2007-03-14 20:23 ` Zachary Amsden
2007-03-13 23:30 ` [patch 29/34] Xen-pv_ops: Use the hvc console infrastructure for Xen console Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 30/34] Xen-pv_ops: Add early printk support via hvc console Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 31/34] Xen-pv_ops: Add Xen grant table support Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 32/34] Xen-pv_ops: Add the Xenbus sysfs and virtual device hotplug driver Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 33/34] Xen-pv_ops: Add Xen virtual block device driver Jeremy Fitzhardinge
2007-03-13 23:30 ` [patch 34/34] Xen-pv_ops: Add the Xen virtual network " Jeremy Fitzhardinge
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070313233032.504059544@goop.org \
--to=jeremy@goop.org \
--cc=ak@muc.de \
--cc=akpm@linux-foundation.org \
--cc=chrisw@sous-sol.org \
--cc=linux-kernel@vger.kernel.org \
--cc=virtualization@lists.osdl.org \
--cc=xen-devel@lists.xensource.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.