All of lore.kernel.org
 help / color / mirror / Atom feed
From: Glauber de Oliveira Costa <gcosta@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: akpm@linux-foundation.org, tglx@linutronix.de, mingo@elte.hu,
	ak@suse.de, Glauber Costa <gcosta@redhat.com>
Subject: [PATCH 50/79] [PATCH] use create_idle struct in do_boot_cpu
Date: Wed, 19 Mar 2008 14:25:45 -0300	[thread overview]
Message-ID: <12059478013647-git-send-email-gcosta@redhat.com> (raw)
In-Reply-To: <12059477974089-git-send-email-gcosta@redhat.com>

From: Glauber Costa <gcosta@redhat.com>

Use a new worker, with help of the create_idle struct
to fork the idle thread. We now have two workers, the first
of them triggered by __smp_prepare_cpu. But the later is
going away soon.

Signed-off-by: Glauber Costa <gcosta@redhat.com>
---
 arch/x86/kernel/smpboot_32.c |   86 ++++++++++++++++++++++++++++-------------
 1 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/arch/x86/kernel/smpboot_32.c b/arch/x86/kernel/smpboot_32.c
index c30abed..fc1eb52 100644
--- a/arch/x86/kernel/smpboot_32.c
+++ b/arch/x86/kernel/smpboot_32.c
@@ -79,6 +79,24 @@ static void map_cpu_to_logical_apicid(void);
 /* State of each CPU. */
 DEFINE_PER_CPU(int, cpu_state) = { 0 };
 
+/* Store all idle threads, this can be reused instead of creating
+* a new thread. Also avoids complicated thread destroy functionality
+* for idle threads.
+*/
+#ifdef CONFIG_HOTPLUG_CPU
+/*
+ * Needed only for CONFIG_HOTPLUG_CPU because __cpuinitdata is
+ * removed after init for !CONFIG_HOTPLUG_CPU.
+ */
+static DEFINE_PER_CPU(struct task_struct *, idle_thread_array);
+#define get_idle_for_cpu(x)      (per_cpu(idle_thread_array, x))
+#define set_idle_for_cpu(x, p)   (per_cpu(idle_thread_array, x) = (p))
+#else
+struct task_struct *idle_thread_array[NR_CPUS] __cpuinitdata ;
+#define get_idle_for_cpu(x)      (idle_thread_array[(x)])
+#define set_idle_for_cpu(x, p)   (idle_thread_array[(x)] = (p))
+#endif
+
 static atomic_t init_deasserted;
 
 static void __cpuinit smp_callin(void)
@@ -513,30 +531,21 @@ wakeup_secondary_cpu(int phys_apicid, unsigned long start_eip)
 
 extern cpumask_t cpu_initialized;
 
-#ifdef CONFIG_HOTPLUG_CPU
-static struct task_struct * __cpuinitdata cpu_idle_tasks[NR_CPUS];
-static inline struct task_struct * __cpuinit alloc_idle_task(int cpu)
-{
+struct create_idle {
+	struct work_struct work;
 	struct task_struct *idle;
+	struct completion done;
+	int cpu;
+};
 
-	if ((idle = cpu_idle_tasks[cpu]) != NULL) {
-		/* initialize thread_struct.  we really want to avoid destroy
-		 * idle tread
-		 */
-		idle->thread.sp = (unsigned long)task_pt_regs(idle);
-		init_idle(idle, cpu);
-		return idle;
-	}
-	idle = fork_idle(cpu);
+static void __cpuinit do_fork_idle(struct work_struct *work)
+{
+	struct create_idle *c_idle =
+		container_of(work, struct create_idle, work);
 
-	if (!IS_ERR(idle))
-		cpu_idle_tasks[cpu] = idle;
-	return idle;
+	c_idle->idle = fork_idle(c_idle->cpu);
+	complete(&c_idle->done);
 }
-#else
-#define alloc_idle_task(cpu) fork_idle(cpu)
-#endif
-
 static int __cpuinit do_boot_cpu(int apicid, int cpu)
 /*
  * NOTE - on most systems this is a PHYSICAL apic ID, but on multiquad
@@ -544,11 +553,15 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)
  * Returns zero if CPU booted OK, else error code from wakeup_secondary_cpu.
  */
 {
-	struct task_struct *idle;
 	unsigned long boot_error;
 	int timeout;
 	unsigned long start_eip;
 	unsigned short nmi_high = 0, nmi_low = 0;
+	struct create_idle c_idle = {
+		.cpu = cpu,
+		.done = COMPLETION_INITIALIZER_ONSTACK(c_idle.done),
+	};
+	INIT_WORK(&c_idle.work, do_fork_idle);
 
 	/*
 	 * Save current MTRR state in case it was changed since early boot
@@ -556,19 +569,38 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)
 	 */
 	mtrr_save_state();
 
+	c_idle.idle = get_idle_for_cpu(cpu);
+
 	/*
 	 * We can't use kernel_thread since we must avoid to
 	 * reschedule the child.
 	 */
-	idle = alloc_idle_task(cpu);
-	if (IS_ERR(idle))
-		panic("failed fork for CPU %d", cpu);
+	if (c_idle.idle) {
+		c_idle.idle->thread.sp = (unsigned long) (((struct pt_regs *)
+			(THREAD_SIZE +  task_stack_page(c_idle.idle))) - 1);
+		init_idle(c_idle.idle, cpu);
+		goto do_rest;
+	}
+
+	if (!keventd_up() || current_is_keventd())
+		c_idle.work.func(&c_idle.work);
+	else {
+		schedule_work(&c_idle.work);
+		wait_for_completion(&c_idle.done);
+	}
+
+	if (IS_ERR(c_idle.idle)) {
+		printk(KERN_ERR "failed fork for CPU %d\n", cpu);
+		return PTR_ERR(c_idle.idle);
+	}
 
+	set_idle_for_cpu(cpu, c_idle.idle);
+do_rest:
+	per_cpu(current_task, cpu) = c_idle.idle;
 	init_gdt(cpu);
- 	per_cpu(current_task, cpu) = idle;
 	early_gdt_descr.address = (unsigned long)get_cpu_gdt_table(cpu);
 
-	idle->thread.ip = (unsigned long) start_secondary;
+	c_idle.idle->thread.ip = (unsigned long) start_secondary;
 	/* start_eip had better be page-aligned! */
 	start_eip = setup_trampoline();
 
@@ -577,7 +609,7 @@ static int __cpuinit do_boot_cpu(int apicid, int cpu)
 	/* So we see what's up   */
 	printk("Booting processor %d/%d ip %lx\n", cpu, apicid, start_eip);
 	/* Stack for startup_32 can be just as for start_secondary onwards */
-	stack_start.sp = (void *) idle->thread.sp;
+	stack_start.sp = (void *) c_idle.idle->thread.sp;
 
 	irq_ctx_init(cpu);
 
-- 
1.5.0.6


  reply	other threads:[~2008-03-19 20:25 UTC|newest]

Thread overview: 104+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-03-19 17:24 [PATCH 0/79] smpboot integration Glauber de Oliveira Costa
2008-03-19 17:24 ` [PATCH 01/79] [PATCH] change var types in __inquire_remote_apic Glauber de Oliveira Costa
2008-03-19 17:24   ` [PATCH 02/79] [PATCH] add loglevel to printks Glauber de Oliveira Costa
2008-03-19 17:24     ` [PATCH 03/79] [PATCH] use apic_*_around instead of apic_write in x86_64 Glauber de Oliveira Costa
2008-03-19 17:24       ` [PATCH 04/79] [PATCH] use start_ipi_hook " Glauber de Oliveira Costa
2008-03-19 17:25         ` [PATCH 05/79] [PATCH] add an smp_apply_quirks to smpboot_32.c Glauber de Oliveira Costa
2008-03-19 17:25           ` [PATCH 06/79] [PATCH] decouple call to print_cpu_info from smp_store_cpu_info Glauber de Oliveira Costa
2008-03-19 17:25             ` [PATCH 07/79] [PATCH] provide specialized identification routines for x86_64 Glauber de Oliveira Costa
2008-03-19 17:25               ` [PATCH 08/79] [PATCH] use identify_boot_cpu Glauber de Oliveira Costa
2008-03-19 17:25                 ` [PATCH 09/79] [PATCH] call identify_secondary_cpu in smp_store_cpu_info Glauber de Oliveira Costa
2008-03-19 17:25                   ` [PATCH 10/79] [PATCH] merge smp_store_cpu_info Glauber de Oliveira Costa
2008-03-19 17:25                     ` [PATCH 11/79] [PATCH] always enable irqs when entering idle Glauber de Oliveira Costa
2008-03-19 17:25                       ` [PATCH 12/79] [PATCH] don't call local_irq_enable before " Glauber de Oliveira Costa
2008-03-19 17:25                         ` [PATCH 13/79] [PATCH] move setup_secondary_clock a little bit down in the function Glauber de Oliveira Costa
2008-03-19 17:25                           ` [PATCH 14/79] [PATCH] move state update out of ipi_lock Glauber de Oliveira Costa
2008-03-19 17:25                             ` [PATCH 15/79] [PATCH] provide APIC_INTEGRATED definition for x86_64 Glauber de Oliveira Costa
2008-03-19 17:25                               ` [PATCH 16/79] [PATCH] use APIC_INTEGRATED tests in x86_64 Glauber de Oliveira Costa
2008-03-19 17:25                                 ` [PATCH 17/79] [PATCH] add barriers statement Glauber de Oliveira Costa
2008-03-19 17:25                                   ` [PATCH 18/79] [PATCH] isolate sanity checking Glauber de Oliveira Costa
2008-03-19 17:25                                     ` [PATCH 19/79] [PATCH] isolate logic to disable smp Glauber de Oliveira Costa
2008-03-19 17:25                                       ` [PATCH 20/79] [PATCH] do tests before do_boot_cpu in i386 Glauber de Oliveira Costa
2008-03-19 17:25                                         ` [PATCH 21/79] [PATCH] make __smp_prepare_cpu void Glauber de Oliveira Costa
2008-03-19 17:25                                           ` [PATCH 22/79] [PATCH] move assignment of CPU_PREPARE before do_boot_cpu Glauber de Oliveira Costa
2008-03-19 17:25                                             ` [PATCH 23/79] [PATCH] unify extern masks declaration Glauber de Oliveira Costa
2008-03-19 17:25                                               ` [PATCH 24/79] [PATCH] define bios to apicid mapping Glauber de Oliveira Costa
2008-03-19 17:25                                                 ` [PATCH 25/79] [PATCH] initialize map pointers in setup_32.c Glauber de Oliveira Costa
2008-03-19 17:25                                                   ` [PATCH 26/79] [PATCH] make node to apic mapping declarations unconditional Glauber de Oliveira Costa
2008-03-19 17:25                                                     ` [PATCH 27/79] [PATCH] fix alloc_bootmem_pages_node macro Glauber de Oliveira Costa
2008-03-19 17:25                                                       ` [PATCH 28/79] [PATCH] use specialized routine for setup per-cpu area Glauber de Oliveira Costa
2008-03-19 17:25                                                         ` [PATCH 29/79] [PATCH] fill bios cpu to apicid maps Glauber de Oliveira Costa
2008-03-19 17:25                                                           ` [PATCH 30/79] [PATCH] fill cpu to apicid and present map in mpparse Glauber de Oliveira Costa
2008-03-19 17:25                                                             ` [PATCH 31/79] [PATCH] get rid of cpucount Glauber de Oliveira Costa
2008-03-19 17:25                                                               ` [PATCH 32/79] [PATCH] allow user to impress friends Glauber de Oliveira Costa
2008-03-19 17:25                                                                 ` [PATCH 33/79] [PATCH] do smp tainting checks in a separate function Glauber de Oliveira Costa
2008-03-19 17:25                                                                   ` [PATCH 34/79] [PATCH] move impress_friends and smp_check to cpus_done Glauber de Oliveira Costa
2008-03-19 17:25                                                                     ` [PATCH 35/79] [PATCH] add subarch support (for headers) to x86_64 Glauber de Oliveira Costa
2008-03-19 17:25                                                                       ` [PATCH 36/79] [PATCH] include mach_wakecpu.h in smpboot_64 Glauber de Oliveira Costa
2008-03-19 17:25                                                                         ` [PATCH 37/79] [PATCH] include smpboot_hooks.h in smpboot_64.c Glauber de Oliveira Costa
2008-03-19 17:25                                                                           ` [PATCH 38/79] [PATCH] move smp_intr_init away from smpboot_32.c Glauber de Oliveira Costa
     [not found]                                                                             ` <12059477521176-git-send! -email-gcosta@redhat.com>
2008-03-19 17:25                                                                             ` [PATCH 39/79] [PATCH] don't set maps in native_smp_prepare_boot_cpu() Glauber de Oliveira Costa
2008-03-19 17:25                                                                               ` [PATCH 40/79] [PATCH] wipe get_nmi_reason out of nmi_64.h Glauber de Oliveira Costa
2008-03-19 17:25                                                                                 ` [PATCH 41/79] [PATCH] unify nmi_32.h and nmi_64.h Glauber de Oliveira Costa
2008-03-19 17:25                                                                                   ` [PATCH 42/79] [PATCH] call check_nmi_watchdog explicitly in native_smp_cpus_done Glauber de Oliveira Costa
2008-03-19 17:25                                                                                     ` [PATCH 43/79] [PATCH] call nmi_watchdog_default in i386 Glauber de Oliveira Costa
2008-03-19 17:25                                                                                       ` [PATCH 44/79] [PATCH] don't initialize sibling and core maps during preparation Glauber de Oliveira Costa
2008-03-19 17:25                                                                                         ` [PATCH 45/79] [PATCH] fix apic acking of irqs Glauber de Oliveira Costa
2008-03-19 17:25                                                                                           ` [PATCH 46/79] [PATCH] schedule work only if keventd is already running Glauber de Oliveira Costa
2008-03-19 17:25                                                                                             ` [PATCH 47/79] [PATCH] do not zap_low_mappings in __smp_prepare_cpus Glauber de Oliveira Costa
2008-03-19 17:25                                                                                               ` [PATCH 48/79] [PATCH] boot cpus from cpu_up, instead of prepare_cpus Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                 ` [PATCH 49/79] [PATCH] get rid of commenced mask Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                   ` Glauber de Oliveira Costa [this message]
2008-03-19 17:25                                                                                                     ` [PATCH 51/79] [PATCH] don't span a new worker in __smp_prepare_cpu Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                       ` [PATCH 52/79] [PATCH] modify smp_callin in x86_64 to look like i386 Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                         ` [PATCH 53/79] [PATCH] wrap esr setting up in i386 in lapic_setup_esr Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                           ` [PATCH 54/79] [PATCH] provide an end_local_APIC_setup function Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                             ` [PATCH 55/79] [PATCH] calibrate delay with irqs enabled Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                               ` [PATCH 56/79] [PATCH] minor adjustments for do_boot_cpu Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                 ` [PATCH 57/79] [PATCH] call do_boot_cpu directly from native_cpu_up Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                   ` [PATCH 58/79] [PATCH] include mach_apic.h in smpboot_64.c and smpboot.c Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                     ` [PATCH 59/79] [PATCH] change wakeup_secondary name Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                       ` [PATCH 60/79] [PATCH] add callin tests to cpu_up Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                         ` [PATCH 61/79] [PATCH] move {un}map_cpu_to_logical_apicid to smpboot.c Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                           ` [PATCH 62/79] [PATCH] move stack_start to smp.h Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                             ` [PATCH 63/79] [PATCH] change boot_cpu_id to boot_cpu_physical_apicid Glauber de Oliveira Costa
2008-03-19 17:25                                                                                                                               ` [PATCH 64/79] [PATCH] integrate do_boot_cpu Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                 ` [PATCH 65/79] [PATCH] integrate start_secondary Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                   ` [PATCH 66/79] [PATCH] merge smp_prepare_boot_cpu Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                     ` [PATCH 67/79] [PATCH] merge native_smp_cpus_done Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                       ` [PATCH 68/79] [PATCH] use physical id when disabling smp Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                         ` [PATCH 69/79] [PATCH] get rid of smp_boot_cpus Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                           ` [PATCH 70/79] [PATCH] additions to i386 native_smp_prepare_cpus Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                             ` [PATCH 71/79] [PATCH] assign nr_ioapics = 0 in smpboot_hooks.h Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                               ` [PATCH 72/79] [PATCH] change x86_64 native_smp_prepare_cpus to match i386 Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                 ` [PATCH 73/79] [PATCH] add extra sanity check Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                   ` [PATCH 74/79] [PATCH] change x86_64 sanity checks to match i386 Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                     ` [PATCH 75/79] [PATCH] introduce smpboot_clear_io_apic Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                       ` [PATCH 76/79] [PATCH] merge native_smp_prepare_cpus Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                         ` [PATCH 77/79] [PATCH] merge cpu_exit_clear Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                           ` [PATCH 78/79] [PATCH] move apicid mappings to smpboot.c Glauber de Oliveira Costa
2008-03-19 17:26                                                                                                                                                             ` [PATCH 79/79] [PATCH] remove smpboot_32.c and smpboot_64.c Glauber de Oliveira Costa
2008-03-20  6:56                                                                                                                     ` [PATCH 58/79] [PATCH] include mach_apic.h in smpboot_64.c and smpboot.c Yinghai Lu
2008-03-20 14:25                                                                                                                       ` Glauber Costa
2008-03-20 18:00                                                                                                                         ` Yinghai Lu
2008-03-21 22:37                                                                                                                         ` Yinghai Lu
2008-03-20 10:28                                                                                           ` [PATCH 45/79] [PATCH] fix apic acking of irqs Maciej W. Rozycki
2008-03-20 15:04                                                                                             ` Glauber Costa
2008-03-20 22:27                                                                                               ` Maciej W. Rozycki
2008-03-24 14:51                                                                                                 ` Glauber Costa
2008-03-24 23:19                                                                                                   ` Maciej W. Rozycki
2008-03-25 12:40                                                                                                     ` Andi Kleen
2008-03-25 13:42                                                                                                     ` Glauber Costa
2008-03-25 15:48                                                                                                       ` Maciej W. Rozycki
2008-03-25 22:39                                                                                                         ` Glauber Costa
2008-03-19 17:35 ` [PATCH 0/79] smpboot integration Ingo Molnar
2008-03-20  2:18   ` Yinghai Lu
2008-03-20  3:00     ` Yinghai Lu
2008-03-20  3:32       ` Yinghai Lu
2008-03-20  4:40         ` Glauber Costa
2008-03-20  4:59           ` Yinghai Lu
     [not found]             ` <20080321133327.GN27245@elte.hu>
     [not found]               ` <86802c440803211218t5850ba52w78f8cb9849097ee0@mail.gmail.com>
     [not found]                 ` <20080321195506.GB16179@elte.hu>
     [not found]                   ` <86802c440803211303m50506ae5ta4c095e40fa1e40d@mail.gmail.com>
     [not found]                     ` <86802c440803211441v30840be4y76d63da567c9af40@mail.gmail.com>
2008-03-21 22:14                       ` Yinghai Lu
2008-03-21 22:18                         ` Ingo Molnar
2008-03-24 15:13                           ` Glauber Costa
2008-03-19 18:48 ` Ingo Molnar
2008-03-19 19:36   ` Ingo Molnar

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=12059478013647-git-send-email-gcosta@redhat.com \
    --to=gcosta@redhat.com \
    --cc=ak@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    /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.