diff for duplicates of <499D90AE.7060102@goop.org> diff --git a/a/1.txt b/N1/1.txt index 3224e99..d1ee0fa 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -72,75 +72,3 @@ exchange if the guest still has pagetable references to the page. It's almost safe. I've got this patch in my tree to tie up the flush_tlb_all loose end, though I won't claim its pretty. - ->From 5812263a50a27c697a2287b41d4f005804b6b34a Mon Sep 17 00:00:00 2001 -From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> -Date: Tue, 17 Feb 2009 09:44:14 -0800 -Subject: [PATCH] x86: implement flush_tlb_all in terms of flush_tlb_others - -Modify flush_tlb_others to take a NULL mm, meaning "flush user -and kernel tlbs", and implement flush_tlb_all in terms of that. - -The principle motivation for this is to make sure it goes via -paravirt_ops, which allows for more efficient cross-cpu tlb -flushes than a plain IPI. - -Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> - -diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c -index 14c5af4..2d112f9 100644 ---- a/arch/x86/mm/tlb.c -+++ b/arch/x86/mm/tlb.c -@@ -148,7 +148,13 @@ void smp_invalidate_interrupt(struct pt_regs *regs) - * BUG(); - */ - -- if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) { -+ if (f->flush_mm == NULL) { -+ /* No mm - flush all kernel and user tlbs */ -+ __flush_tlb_all(); -+ if (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY) -+ leave_mm(cpu); -+ } else if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) { -+ /* Flushing a specific user mm */ - if (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) { - if (f->flush_va == TLB_FLUSH_ALL) - local_flush_tlb(); -@@ -281,16 +287,15 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long va) - preempt_enable(); - } - --static void do_flush_tlb_all(void *info) -+void flush_tlb_all(void) - { -- unsigned long cpu = smp_processor_id(); -+ preempt_disable(); -+ -+ flush_tlb_others(cpu_online_mask, NULL, TLB_FLUSH_ALL); - - __flush_tlb_all(); - if (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY) -- leave_mm(cpu); --} -+ leave_mm(smp_processor_id()); - --void flush_tlb_all(void) --{ -- on_each_cpu(do_flush_tlb_all, NULL, 1); -+ preempt_enable(); - } -diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c -index 7cadab1..dc83b47 100644 ---- a/arch/x86/xen/mmu.c -+++ b/arch/x86/xen/mmu.c -@@ -1350,7 +1350,6 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, - struct multicall_space mcs; - - BUG_ON(cpumask_empty(cpus)); -- BUG_ON(!mm); - - mcs = xen_mc_entry(sizeof(*args)); - args = mcs.args; - - - J diff --git a/a/content_digest b/N1/content_digest index c75942a..a6fe674 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -86,78 +86,6 @@ "> \n" "\n" "It's almost safe. I've got this patch in my tree to tie up the \n" - "flush_tlb_all loose end, though I won't claim its pretty.\n" - "\n" - ">From 5812263a50a27c697a2287b41d4f005804b6b34a Mon Sep 17 00:00:00 2001\n" - "From: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>\n" - "Date: Tue, 17 Feb 2009 09:44:14 -0800\n" - "Subject: [PATCH] x86: implement flush_tlb_all in terms of flush_tlb_others\n" - "\n" - "Modify flush_tlb_others to take a NULL mm, meaning \"flush user\n" - "and kernel tlbs\", and implement flush_tlb_all in terms of that.\n" - "\n" - "The principle motivation for this is to make sure it goes via\n" - "paravirt_ops, which allows for more efficient cross-cpu tlb\n" - "flushes than a plain IPI.\n" - "\n" - "Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>\n" - "\n" - "diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c\n" - "index 14c5af4..2d112f9 100644\n" - "--- a/arch/x86/mm/tlb.c\n" - "+++ b/arch/x86/mm/tlb.c\n" - "@@ -148,7 +148,13 @@ void smp_invalidate_interrupt(struct pt_regs *regs)\n" - " \t\t * BUG();\n" - " \t\t */\n" - " \n" - "-\tif (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) {\n" - "+\tif (f->flush_mm == NULL) {\n" - "+\t\t/* No mm - flush all kernel and user tlbs */\n" - "+\t\t__flush_tlb_all();\n" - "+\t\tif (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY)\n" - "+\t\t\tleave_mm(cpu);\n" - "+\t} else if (f->flush_mm == percpu_read(cpu_tlbstate.active_mm)) {\n" - "+\t\t/* Flushing a specific user mm */\n" - " \t\tif (percpu_read(cpu_tlbstate.state) == TLBSTATE_OK) {\n" - " \t\t\tif (f->flush_va == TLB_FLUSH_ALL)\n" - " \t\t\t\tlocal_flush_tlb();\n" - "@@ -281,16 +287,15 @@ void flush_tlb_page(struct vm_area_struct *vma, unsigned long va)\n" - " \tpreempt_enable();\n" - " }\n" - " \n" - "-static void do_flush_tlb_all(void *info)\n" - "+void flush_tlb_all(void)\n" - " {\n" - "-\tunsigned long cpu = smp_processor_id();\n" - "+\tpreempt_disable();\n" - "+\n" - "+\tflush_tlb_others(cpu_online_mask, NULL, TLB_FLUSH_ALL);\n" - " \n" - " \t__flush_tlb_all();\n" - " \tif (percpu_read(cpu_tlbstate.state) == TLBSTATE_LAZY)\n" - "-\t\tleave_mm(cpu);\n" - "-}\n" - "+\t\tleave_mm(smp_processor_id());\n" - " \n" - "-void flush_tlb_all(void)\n" - "-{\n" - "-\ton_each_cpu(do_flush_tlb_all, NULL, 1);\n" - "+\tpreempt_enable();\n" - " }\n" - "diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c\n" - "index 7cadab1..dc83b47 100644\n" - "--- a/arch/x86/xen/mmu.c\n" - "+++ b/arch/x86/xen/mmu.c\n" - "@@ -1350,7 +1350,6 @@ static void xen_flush_tlb_others(const struct cpumask *cpus,\n" - " \tstruct multicall_space mcs;\n" - " \n" - " \tBUG_ON(cpumask_empty(cpus));\n" - "-\tBUG_ON(!mm);\n" - " \n" - " \tmcs = xen_mc_entry(sizeof(*args));\n" - " \targs = mcs.args;\n" - "\n" - "\n" - J + flush_tlb_all loose end, though I won't claim its pretty. -13778b4705fb8193bd6460f9fa5a5385f8c46ee47ae98f2f6d3846214a398f81 +89ca68df648aa8631feb1c4fbaa25ad2a22504182af5874afb346700c4ecf079
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.