All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Chen, Gong" <gong.chen@linux.intel.com>
To: linux-kernel@vger.kernel.org
Cc: mingo@kernel.org, tglx@linutronix.de, paulus@samba.org,
	benh@kernel.crashing.org, tony.luck@intel.com, hpa@zytor.com,
	jkosina@suse.cz, rafael.j.wysocki@intel.com, bp@alien8.de,
	linux@arm.linux.org.uk, ralf@linux-mips.org,
	schwidefsky@de.ibm.com, davem@davemloft.net,
	viro@zeniv.linux.org.uk, fweisbec@gmail.com, cl@linux.com,
	akpm@linux-foundation.org, axboe@kernel.dk,
	JBottomley@parallels.com, neilb@suse.de,
	christoffer.dall@linaro.org, rostedt@goodmis.org,
	rric@kernel.org, gregkh@linuxfoundation.org, mhocko@suse.cz,
	david@fromorbit.com, "Chen, Gong" <gong.chen@linux.intel.com>
Subject: [RFC PATCH v1 01/70] cpu: Restructure FROZEN state handling
Date: Tue, 22 Jul 2014 21:58:37 -0400	[thread overview]
Message-ID: <1406080786-3938-2-git-send-email-gong.chen@linux.intel.com> (raw)
In-Reply-To: <1406080786-3938-1-git-send-email-gong.chen@linux.intel.com>

From: Thomas Gleixner <tglx@linutronix.de>

There are only a few callbacks which really care about FROZEN
vs. !FROZEN. No need to have extra states for this.

Publish the frozen state in an extra variable which is updated under
the hotplug lock and let the users interested deal with it w/o
imposing that extra state checks on everyone.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Chen, Gong <gong.chen@linux.intel.com>
---
 kernel/cpu.c | 66 +++++++++++++++++++++++++-----------------------------------
 1 file changed, 27 insertions(+), 39 deletions(-)

diff --git a/kernel/cpu.c b/kernel/cpu.c
index a343bde..3da7e82 100644
--- a/kernel/cpu.c
+++ b/kernel/cpu.c
@@ -27,6 +27,7 @@
 #ifdef CONFIG_SMP
 /* Serializes the updates to cpu_online_mask, cpu_present_mask */
 static DEFINE_MUTEX(cpu_add_remove_lock);
+static bool cpuhp_tasks_frozen;
 
 /*
  * The following two APIs (cpu_maps_update_begin/done) must be used when
@@ -194,27 +195,30 @@ int __ref __register_cpu_notifier(struct notifier_block *nb)
 	return raw_notifier_chain_register(&cpu_chain, nb);
 }
 
-static int __cpu_notify(unsigned long val, void *v, int nr_to_call,
+static int __cpu_notify(unsigned long val, unsigned int cpu, int nr_to_call,
 			int *nr_calls)
 {
+	unsigned long mod = cpuhp_tasks_frozen ? CPU_TASKS_FROZEN : 0;
+	void *hcpu = (void *)(long)cpu;
+
 	int ret;
 
-	ret = __raw_notifier_call_chain(&cpu_chain, val, v, nr_to_call,
+	ret = __raw_notifier_call_chain(&cpu_chain, val | mod, hcpu, nr_to_call,
 					nr_calls);
 
 	return notifier_to_errno(ret);
 }
 
-static int cpu_notify(unsigned long val, void *v)
+static int cpu_notify(unsigned long val, unsigned int cpu)
 {
-	return __cpu_notify(val, v, -1, NULL);
+	return __cpu_notify(val, cpu, -1, NULL);
 }
 
 #ifdef CONFIG_HOTPLUG_CPU
 
-static void cpu_notify_nofail(unsigned long val, void *v)
+static void cpu_notify_nofail(unsigned long val, unsigned int cpu)
 {
-	BUG_ON(cpu_notify(val, v));
+	BUG_ON(cpu_notify(val, cpu));
 }
 EXPORT_SYMBOL(register_cpu_notifier);
 EXPORT_SYMBOL(__register_cpu_notifier);
@@ -291,23 +295,17 @@ static inline void check_for_tasks(int cpu)
 	write_unlock_irq(&tasklist_lock);
 }
 
-struct take_cpu_down_param {
-	unsigned long mod;
-	void *hcpu;
-};
-
 /* Take this CPU down. */
 static int __ref take_cpu_down(void *_param)
 {
-	struct take_cpu_down_param *param = _param;
-	int err;
+	int err, cpu = smp_processor_id();
 
 	/* Ensure this CPU doesn't handle any more interrupts. */
 	err = __cpu_disable();
 	if (err < 0)
 		return err;
 
-	cpu_notify(CPU_DYING | param->mod, param->hcpu);
+	cpu_notify(CPU_DYING, cpu);
 	/* Park the stopper thread */
 	kthread_park(current);
 	return 0;
@@ -317,12 +315,6 @@ static int __ref take_cpu_down(void *_param)
 static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 {
 	int err, nr_calls = 0;
-	void *hcpu = (void *)(long)cpu;
-	unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0;
-	struct take_cpu_down_param tcd_param = {
-		.mod = mod,
-		.hcpu = hcpu,
-	};
 
 	if (num_online_cpus() == 1)
 		return -EBUSY;
@@ -332,10 +324,12 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 
 	cpu_hotplug_begin();
 
-	err = __cpu_notify(CPU_DOWN_PREPARE | mod, hcpu, -1, &nr_calls);
+	cpuhp_tasks_frozen = tasks_frozen;
+
+	err = __cpu_notify(CPU_DOWN_PREPARE, cpu, -1, &nr_calls);
 	if (err) {
 		nr_calls--;
-		__cpu_notify(CPU_DOWN_FAILED | mod, hcpu, nr_calls, NULL);
+		__cpu_notify(CPU_DOWN_FAILED, cpu, nr_calls, NULL);
 		pr_warn("%s: attempt to take down CPU %u failed\n",
 			__func__, cpu);
 		goto out_release;
@@ -362,11 +356,11 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 	 * So now all preempt/rcu users must observe !cpu_active().
 	 */
 
-	err = __stop_machine(take_cpu_down, &tcd_param, cpumask_of(cpu));
+	err = __stop_machine(take_cpu_down, NULL, cpumask_of(cpu));
 	if (err) {
 		/* CPU didn't die: tell everyone.  Can't complain. */
 		smpboot_unpark_threads(cpu);
-		cpu_notify_nofail(CPU_DOWN_FAILED | mod, hcpu);
+		cpu_notify_nofail(CPU_DOWN_FAILED, cpu);
 		goto out_release;
 	}
 	BUG_ON(cpu_online(cpu));
@@ -385,14 +379,14 @@ static int __ref _cpu_down(unsigned int cpu, int tasks_frozen)
 	__cpu_die(cpu);
 
 	/* CPU is completely dead: tell everyone.  Too late to complain. */
-	cpu_notify_nofail(CPU_DEAD | mod, hcpu);
+	cpu_notify_nofail(CPU_DEAD, cpu);
 
 	check_for_tasks(cpu);
 
 out_release:
 	cpu_hotplug_done();
 	if (!err)
-		cpu_notify_nofail(CPU_POST_DEAD | mod, hcpu);
+		cpu_notify_nofail(CPU_POST_DEAD, cpu);
 	return err;
 }
 
@@ -419,10 +413,8 @@ EXPORT_SYMBOL(cpu_down);
 /* Requires cpu_add_remove_lock to be held */
 static int _cpu_up(unsigned int cpu, int tasks_frozen)
 {
-	int ret, nr_calls = 0;
-	void *hcpu = (void *)(long)cpu;
-	unsigned long mod = tasks_frozen ? CPU_TASKS_FROZEN : 0;
 	struct task_struct *idle;
+	int ret, nr_calls = 0;
 
 	cpu_hotplug_begin();
 
@@ -441,7 +433,9 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen)
 	if (ret)
 		goto out;
 
-	ret = __cpu_notify(CPU_UP_PREPARE | mod, hcpu, -1, &nr_calls);
+	cpuhp_tasks_frozen = tasks_frozen;
+
+	ret = __cpu_notify(CPU_UP_PREPARE, cpu, -1, &nr_calls);
 	if (ret) {
 		nr_calls--;
 		pr_warn("%s: attempt to bring up CPU %u failed\n",
@@ -459,11 +453,11 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen)
 	smpboot_unpark_threads(cpu);
 
 	/* Now call notifier in preparation. */
-	cpu_notify(CPU_ONLINE | mod, hcpu);
+	cpu_notify(CPU_ONLINE, cpu);
 
 out_notify:
 	if (ret != 0)
-		__cpu_notify(CPU_UP_CANCELED | mod, hcpu, nr_calls, NULL);
+		__cpu_notify(CPU_UP_CANCELED, cpu, nr_calls, NULL);
 out:
 	cpu_hotplug_done();
 
@@ -650,13 +644,7 @@ core_initcall(cpu_hotplug_pm_sync_init);
  */
 void notify_cpu_starting(unsigned int cpu)
 {
-	unsigned long val = CPU_STARTING;
-
-#ifdef CONFIG_PM_SLEEP_SMP
-	if (frozen_cpus != NULL && cpumask_test_cpu(cpu, frozen_cpus))
-		val = CPU_STARTING_FROZEN;
-#endif /* CONFIG_PM_SLEEP_SMP */
-	cpu_notify(val, (void *)(long)cpu);
+	cpu_notify(CPU_STARTING, cpu);
 }
 
 #endif /* CONFIG_SMP */
-- 
2.0.0.rc2


  reply	other threads:[~2014-07-23  2:31 UTC|newest]

Thread overview: 106+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-23  1:58 [RESEND RFC PATCH v1 0/70] Gloabl CPU Hot-plug flag _FROZEN Clean up Chen, Gong
2014-07-23  1:58 ` Chen, Gong [this message]
2014-07-23 13:50   ` [RFC PATCH v1 01/70] cpu: Restructure FROZEN state handling Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 02/70] ia64, err_inject: _FROZEN Cleanup Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 03/70] ia64, mca: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 04/70] ia64, palinfo: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 05/70] ia64, salinfo: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 06/70] ia64, topology: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 07/70] x86, intel_cacheinfo: " Chen, Gong
2014-07-23 14:05   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 08/70] x86, mce, therm_throt: " Chen, Gong
2014-07-23 16:17   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 09/70] x86, mce_amd: " Chen, Gong
2014-07-23 16:21   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 10/70] x86, kvm: " Chen, Gong
2014-07-23 16:23   ` Borislav Petkov
2014-07-23 19:22     ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 11/70] x86, vsyscall_64: " Chen, Gong
2014-07-23 17:24   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 12/70] x86, pci, amd_bus: " Chen, Gong
2014-07-23 18:07   ` Borislav Petkov
2014-07-24  1:31     ` Chen, Gong
2014-07-24  8:28       ` Borislav Petkov
2014-07-28  6:03         ` Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 13/70] x86, x2apic_cluster: " Chen, Gong
2014-07-23 20:36   ` Borislav Petkov
2014-07-28  6:04     ` Chen, Gong
2014-07-29  8:44       ` Borislav Petkov
2014-07-29  9:00         ` Chen, Gong
2014-07-30  6:24     ` Chen, Gong
2014-07-30  8:48       ` Borislav Petkov
2014-07-31  7:52         ` Chen, Gong
2014-07-31  9:13           ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 14/70] x86, microcode, core: " Chen, Gong
2014-07-24  9:03   ` Borislav Petkov
2014-07-28  6:06     ` Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 15/70] x86, kernel, cpuid: " Chen, Gong
2014-07-24  9:11   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 16/70] x86, kernel, msr: " Chen, Gong
2014-07-24  9:52   ` Borislav Petkov
2014-07-23  1:58 ` [RFC PATCH v1 17/70] arm, vfp, vfpmodule: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 18/70] arm, kvm: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 19/70] powerpc, sysfs: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 20/70] powerpc, mm, numa: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 21/70] powerpc, powermac, smp: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 22/70] powerpc, mmu_context_nohash: " Chen, Gong
2014-07-23  1:58 ` [RFC PATCH v1 23/70] mips, loongson, smp: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 24/70] s390, perf_cpum_sf: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 25/70] sparc, sysfs: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 26/70] rcu, tree: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 27/70] kernel, padata: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 28/70] kernel, profile: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 29/70] kernel, sched, core: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 30/70] kernel, hrtimer: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 31/70] kernel, relay: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 32/70] kernel, smp: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 33/70] kernel, timer: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 34/70] kernel, softirq: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 35/70] mm, slab: " Chen, Gong
2014-07-28 15:55   ` Christoph Lameter
2014-07-23  1:59 ` [RFC PATCH v1 36/70] mm, vmscan: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 37/70] mm, vmstat: " Chen, Gong
2014-07-28 15:56   ` Christoph Lameter
2014-07-23  1:59 ` [RFC PATCH v1 38/70] mm, memcontrol: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 39/70] mm, page_alloc: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 40/70] mm, slub: " Chen, Gong
2014-07-28 15:56   ` Christoph Lameter
2014-07-23  1:59 ` [RFC PATCH v1 41/70] fs, buffer: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 42/70] xfs, xfs_mount: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 43/70] net, iucv: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 44/70] net, core, flow: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 45/70] net, core, dev: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 46/70] block, blk-mq: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 47/70] block, blk-iopoll: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 48/70] block, blk-softirq: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 49/70] driver, base, topology: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 50/70] clocksource, metag_generic: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 51/70] powercap, intel_rapl: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 52/70] cpuidle, cpuidle-powernv: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 53/70] cpuidle, cpuidle-pseries: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 54/70] cpufreq, acpi-cpufreq: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 55/70] irqchip, irq-armada-370-xp: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 56/70] irqchip, irq-gic: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 57/70] scsi, bnx2fc, bnx2fc_fcoe: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 58/70] scsi, bnx2i, bnx2i_init: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 59/70] scsi, fcoe: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 60/70] scsi, virtio_scsi: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 61/70] md, raid5: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 62/70] virt, kvm, arm, arch_timer: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 63/70] virt, kvm, arm, vgic: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 64/70] trace, ring_buffer: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 65/70] oprofile, timer_int: " Chen, Gong
2014-07-28 13:35   ` Robert Richter
2014-07-23  1:59 ` [RFC PATCH v1 66/70] lib, cpu-notifier-error-inject: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 67/70] lib, percpu_counter: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 68/70] lib, radix-tree: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 69/70] staging, lustre, linux-cpu: " Chen, Gong
2014-07-23  1:59 ` [RFC PATCH v1 70/70] cpu: Eliminate _FROZEN flags thoroughly Chen, Gong
2014-07-25  1:35 ` [RESEND RFC PATCH v1 0/70] Gloabl CPU Hot-plug flag _FROZEN Clean up Chen, Gong
2014-07-25  7:10   ` Borislav Petkov
2014-07-25 13:46     ` Chen, Gong
2014-07-25 15:00 ` Robert Richter
2014-07-27  6:36   ` Chen, Gong
2014-07-27 10:17     ` Borislav Petkov
2014-07-28 13:28     ` Robert Richter
     [not found] <1406020218-6657-1-git-send-email-gong.chen@linux.intel.com>
2014-07-22  9:09 ` [RFC PATCH v1 01/70] cpu: Restructure FROZEN state handling Chen, Gong

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=1406080786-3938-2-git-send-email-gong.chen@linux.intel.com \
    --to=gong.chen@linux.intel.com \
    --cc=JBottomley@parallels.com \
    --cc=akpm@linux-foundation.org \
    --cc=axboe@kernel.dk \
    --cc=benh@kernel.crashing.org \
    --cc=bp@alien8.de \
    --cc=christoffer.dall@linaro.org \
    --cc=cl@linux.com \
    --cc=davem@davemloft.net \
    --cc=david@fromorbit.com \
    --cc=fweisbec@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=hpa@zytor.com \
    --cc=jkosina@suse.cz \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mhocko@suse.cz \
    --cc=mingo@kernel.org \
    --cc=neilb@suse.de \
    --cc=paulus@samba.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=ralf@linux-mips.org \
    --cc=rostedt@goodmis.org \
    --cc=rric@kernel.org \
    --cc=schwidefsky@de.ibm.com \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=viro@zeniv.linux.org.uk \
    /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.