From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758938Ab3BSSKr (ORCPT ); Tue, 19 Feb 2013 13:10:47 -0500 Received: from mail-vc0-f169.google.com ([209.85.220.169]:54382 "EHLO mail-vc0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758727Ab3BSSKo (ORCPT ); Tue, 19 Feb 2013 13:10:44 -0500 Date: Tue, 19 Feb 2013 13:10:39 -0500 From: Konrad Rzeszutek Wilk To: "Srivatsa S. Bhat" Cc: tglx@linutronix.de, peterz@infradead.org, tj@kernel.org, oleg@redhat.com, paulmck@linux.vnet.ibm.com, rusty@rustcorp.com.au, mingo@kernel.org, akpm@linux-foundation.org, namhyung@kernel.org, rostedt@goodmis.org, wangyun@linux.vnet.ibm.com, xiaoguangrong@linux.vnet.ibm.com, rjw@sisk.pl, sbw@mit.edu, fweisbec@gmail.com, linux@arm.linux.org.uk, nikunj@linux.vnet.ibm.com, linux-pm@vger.kernel.org, linux-arch@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, netdev@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v5 29/45] x86/xen: Use get/put_online_cpus_atomic() to prevent CPU offline Message-ID: <20130219181038.GB18244@phenom.dumpdata.com> References: <20130122073210.13822.50434.stgit@srivatsabhat.in.ibm.com> <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 22, 2013 at 01:10:51PM +0530, Srivatsa S. Bhat wrote: > Once stop_machine() is gone from the CPU offline path, we won't be able to > depend on preempt_disable() or local_irq_disable() to prevent CPUs from > going offline from under us. > > Use the get/put_online_cpus_atomic() APIs to prevent CPUs from going offline, > while invoking from atomic context. > > Cc: Konrad Rzeszutek Wilk Weird. I see this in the patch but I don't see it in the header? Did you explicitly suppress the CC part? Anyhow, the patch looks sane enough, thought I need to to run it through a test framework just to be on a sure side. > Cc: Jeremy Fitzhardinge > Cc: "H. Peter Anvin" > Cc: x86@kernel.org > Cc: xen-devel@lists.xensource.com > Cc: virtualization@lists.linux-foundation.org > Signed-off-by: Srivatsa S. Bhat > --- > > arch/x86/xen/mmu.c | 11 +++++++++-- > arch/x86/xen/smp.c | 9 +++++++++ > 2 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c > index 01de35c..6a95a15 100644 > --- a/arch/x86/xen/mmu.c > +++ b/arch/x86/xen/mmu.c > @@ -39,6 +39,7 @@ > * Jeremy Fitzhardinge , XenSource Inc, 2007 > */ > #include > +#include > #include > #include > #include > @@ -1163,9 +1164,13 @@ static void xen_drop_mm_ref(struct mm_struct *mm) > */ > static void xen_exit_mmap(struct mm_struct *mm) > { > - get_cpu(); /* make sure we don't move around */ > + /* > + * Make sure we don't move around, and prevent CPUs from going > + * offline. > + */ > + get_online_cpus_atomic(); > xen_drop_mm_ref(mm); > - put_cpu(); > + put_online_cpus_atomic(); > > spin_lock(&mm->page_table_lock); > > @@ -1371,6 +1376,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > args->op.arg2.vcpumask = to_cpumask(args->mask); > > /* Remove us, and any offline CPUS. */ > + get_online_cpus_atomic(); > cpumask_and(to_cpumask(args->mask), cpus, cpu_online_mask); > cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); > > @@ -1383,6 +1389,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); > > xen_mc_issue(PARAVIRT_LAZY_MMU); > + put_online_cpus_atomic(); > } > > static unsigned long xen_read_cr3(void) > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > index 4f7d259..7d753ae 100644 > --- a/arch/x86/xen/smp.c > +++ b/arch/x86/xen/smp.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -487,8 +488,10 @@ static void __xen_send_IPI_mask(const struct cpumask *mask, > { > unsigned cpu; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) > xen_send_IPI_one(cpu, vector); > + put_online_cpus_atomic(); > } > > static void xen_smp_send_call_function_ipi(const struct cpumask *mask) > @@ -551,8 +554,10 @@ void xen_send_IPI_all(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > __xen_send_IPI_mask(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > void xen_send_IPI_self(int vector) > @@ -572,20 +577,24 @@ void xen_send_IPI_mask_allbutself(const struct cpumask *mask, > if (!(num_online_cpus() > 1)) > return; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) { > if (this_cpu == cpu) > continue; > > xen_smp_send_call_function_single_ipi(cpu); > } > + put_online_cpus_atomic(); > } > > void xen_send_IPI_allbutself(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-vb0-f52.google.com (mail-vb0-f52.google.com [209.85.212.52]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 6EC862C007A for ; Wed, 20 Feb 2013 05:10:47 +1100 (EST) Received: by mail-vb0-f52.google.com with SMTP id fa15so4332331vbb.25 for ; Tue, 19 Feb 2013 10:10:43 -0800 (PST) Sender: Konrad Rzeszutek Date: Tue, 19 Feb 2013 13:10:39 -0500 From: Konrad Rzeszutek Wilk To: "Srivatsa S. Bhat" Subject: Re: [PATCH v5 29/45] x86/xen: Use get/put_online_cpus_atomic() to prevent CPU offline Message-ID: <20130219181038.GB18244@phenom.dumpdata.com> References: <20130122073210.13822.50434.stgit@srivatsabhat.in.ibm.com> <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> Cc: linux-doc@vger.kernel.org, peterz@infradead.org, fweisbec@gmail.com, linux-kernel@vger.kernel.org, mingo@kernel.org, linux-arch@vger.kernel.org, linux@arm.linux.org.uk, xiaoguangrong@linux.vnet.ibm.com, wangyun@linux.vnet.ibm.com, paulmck@linux.vnet.ibm.com, nikunj@linux.vnet.ibm.com, linux-pm@vger.kernel.org, rusty@rustcorp.com.au, rostedt@goodmis.org, rjw@sisk.pl, namhyung@kernel.org, tglx@linutronix.de, linux-arm-kernel@lists.infradead.org, netdev@vger.kernel.org, oleg@redhat.com, sbw@mit.edu, tj@kernel.org, akpm@linux-foundation.org, linuxppc-dev@lists.ozlabs.org List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , On Tue, Jan 22, 2013 at 01:10:51PM +0530, Srivatsa S. Bhat wrote: > Once stop_machine() is gone from the CPU offline path, we won't be able to > depend on preempt_disable() or local_irq_disable() to prevent CPUs from > going offline from under us. > > Use the get/put_online_cpus_atomic() APIs to prevent CPUs from going offline, > while invoking from atomic context. > > Cc: Konrad Rzeszutek Wilk Weird. I see this in the patch but I don't see it in the header? Did you explicitly suppress the CC part? Anyhow, the patch looks sane enough, thought I need to to run it through a test framework just to be on a sure side. > Cc: Jeremy Fitzhardinge > Cc: "H. Peter Anvin" > Cc: x86@kernel.org > Cc: xen-devel@lists.xensource.com > Cc: virtualization@lists.linux-foundation.org > Signed-off-by: Srivatsa S. Bhat > --- > > arch/x86/xen/mmu.c | 11 +++++++++-- > arch/x86/xen/smp.c | 9 +++++++++ > 2 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c > index 01de35c..6a95a15 100644 > --- a/arch/x86/xen/mmu.c > +++ b/arch/x86/xen/mmu.c > @@ -39,6 +39,7 @@ > * Jeremy Fitzhardinge , XenSource Inc, 2007 > */ > #include > +#include > #include > #include > #include > @@ -1163,9 +1164,13 @@ static void xen_drop_mm_ref(struct mm_struct *mm) > */ > static void xen_exit_mmap(struct mm_struct *mm) > { > - get_cpu(); /* make sure we don't move around */ > + /* > + * Make sure we don't move around, and prevent CPUs from going > + * offline. > + */ > + get_online_cpus_atomic(); > xen_drop_mm_ref(mm); > - put_cpu(); > + put_online_cpus_atomic(); > > spin_lock(&mm->page_table_lock); > > @@ -1371,6 +1376,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > args->op.arg2.vcpumask = to_cpumask(args->mask); > > /* Remove us, and any offline CPUS. */ > + get_online_cpus_atomic(); > cpumask_and(to_cpumask(args->mask), cpus, cpu_online_mask); > cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); > > @@ -1383,6 +1389,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); > > xen_mc_issue(PARAVIRT_LAZY_MMU); > + put_online_cpus_atomic(); > } > > static unsigned long xen_read_cr3(void) > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > index 4f7d259..7d753ae 100644 > --- a/arch/x86/xen/smp.c > +++ b/arch/x86/xen/smp.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -487,8 +488,10 @@ static void __xen_send_IPI_mask(const struct cpumask *mask, > { > unsigned cpu; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) > xen_send_IPI_one(cpu, vector); > + put_online_cpus_atomic(); > } > > static void xen_smp_send_call_function_ipi(const struct cpumask *mask) > @@ -551,8 +554,10 @@ void xen_send_IPI_all(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > __xen_send_IPI_mask(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > void xen_send_IPI_self(int vector) > @@ -572,20 +577,24 @@ void xen_send_IPI_mask_allbutself(const struct cpumask *mask, > if (!(num_online_cpus() > 1)) > return; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) { > if (this_cpu == cpu) > continue; > > xen_smp_send_call_function_single_ipi(cpu); > } > + put_online_cpus_atomic(); > } > > void xen_send_IPI_allbutself(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > From mboxrd@z Thu Jan 1 00:00:00 1970 From: konrad@kernel.org (Konrad Rzeszutek Wilk) Date: Tue, 19 Feb 2013 13:10:39 -0500 Subject: [PATCH v5 29/45] x86/xen: Use get/put_online_cpus_atomic() to prevent CPU offline In-Reply-To: <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> References: <20130122073210.13822.50434.stgit@srivatsabhat.in.ibm.com> <20130122074046.13822.61950.stgit@srivatsabhat.in.ibm.com> Message-ID: <20130219181038.GB18244@phenom.dumpdata.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Tue, Jan 22, 2013 at 01:10:51PM +0530, Srivatsa S. Bhat wrote: > Once stop_machine() is gone from the CPU offline path, we won't be able to > depend on preempt_disable() or local_irq_disable() to prevent CPUs from > going offline from under us. > > Use the get/put_online_cpus_atomic() APIs to prevent CPUs from going offline, > while invoking from atomic context. > > Cc: Konrad Rzeszutek Wilk Weird. I see this in the patch but I don't see it in the header? Did you explicitly suppress the CC part? Anyhow, the patch looks sane enough, thought I need to to run it through a test framework just to be on a sure side. > Cc: Jeremy Fitzhardinge > Cc: "H. Peter Anvin" > Cc: x86 at kernel.org > Cc: xen-devel at lists.xensource.com > Cc: virtualization at lists.linux-foundation.org > Signed-off-by: Srivatsa S. Bhat > --- > > arch/x86/xen/mmu.c | 11 +++++++++-- > arch/x86/xen/smp.c | 9 +++++++++ > 2 files changed, 18 insertions(+), 2 deletions(-) > > diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c > index 01de35c..6a95a15 100644 > --- a/arch/x86/xen/mmu.c > +++ b/arch/x86/xen/mmu.c > @@ -39,6 +39,7 @@ > * Jeremy Fitzhardinge , XenSource Inc, 2007 > */ > #include > +#include > #include > #include > #include > @@ -1163,9 +1164,13 @@ static void xen_drop_mm_ref(struct mm_struct *mm) > */ > static void xen_exit_mmap(struct mm_struct *mm) > { > - get_cpu(); /* make sure we don't move around */ > + /* > + * Make sure we don't move around, and prevent CPUs from going > + * offline. > + */ > + get_online_cpus_atomic(); > xen_drop_mm_ref(mm); > - put_cpu(); > + put_online_cpus_atomic(); > > spin_lock(&mm->page_table_lock); > > @@ -1371,6 +1376,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > args->op.arg2.vcpumask = to_cpumask(args->mask); > > /* Remove us, and any offline CPUS. */ > + get_online_cpus_atomic(); > cpumask_and(to_cpumask(args->mask), cpus, cpu_online_mask); > cpumask_clear_cpu(smp_processor_id(), to_cpumask(args->mask)); > > @@ -1383,6 +1389,7 @@ static void xen_flush_tlb_others(const struct cpumask *cpus, > MULTI_mmuext_op(mcs.mc, &args->op, 1, NULL, DOMID_SELF); > > xen_mc_issue(PARAVIRT_LAZY_MMU); > + put_online_cpus_atomic(); > } > > static unsigned long xen_read_cr3(void) > diff --git a/arch/x86/xen/smp.c b/arch/x86/xen/smp.c > index 4f7d259..7d753ae 100644 > --- a/arch/x86/xen/smp.c > +++ b/arch/x86/xen/smp.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > #include > > #include > @@ -487,8 +488,10 @@ static void __xen_send_IPI_mask(const struct cpumask *mask, > { > unsigned cpu; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) > xen_send_IPI_one(cpu, vector); > + put_online_cpus_atomic(); > } > > static void xen_smp_send_call_function_ipi(const struct cpumask *mask) > @@ -551,8 +554,10 @@ void xen_send_IPI_all(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > __xen_send_IPI_mask(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > void xen_send_IPI_self(int vector) > @@ -572,20 +577,24 @@ void xen_send_IPI_mask_allbutself(const struct cpumask *mask, > if (!(num_online_cpus() > 1)) > return; > > + get_online_cpus_atomic(); > for_each_cpu_and(cpu, mask, cpu_online_mask) { > if (this_cpu == cpu) > continue; > > xen_smp_send_call_function_single_ipi(cpu); > } > + put_online_cpus_atomic(); > } > > void xen_send_IPI_allbutself(int vector) > { > int xen_vector = xen_map_vector(vector); > > + get_online_cpus_atomic(); > if (xen_vector >= 0) > xen_send_IPI_mask_allbutself(cpu_online_mask, xen_vector); > + put_online_cpus_atomic(); > } > > static irqreturn_t xen_call_function_interrupt(int irq, void *dev_id) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ >