Messages in this thread Patch in this message | | | Date | Tue, 14 Sep 2004 13:04:53 -0700 | From | William Lee Irwin III <> | Subject | Re: [profile] amortize atomic hit count increments |
| |
On Tue, Sep 14, 2004 at 12:00:30PM -0700, William Lee Irwin III wrote: >> Goddamn fscking short-format VHPT crap. Rusty, how the hell do I >> hotplug-ize this?
On Tue, Sep 14, 2004 at 01:02:20PM -0700, William Lee Irwin III wrote: > Okay, here's an attempt to hotplug-ize it. I have no clue whether this > actually works, compiles, or follows whatever rules there are about > dynamically allocated data referenced by per_cpu areas.
Take 2: actually register the notifier I wrote.
Index: mm5-2.6.9-rc1/kernel/profile.c =================================================================== --- mm5-2.6.9-rc1.orig/kernel/profile.c 2004-09-14 10:20:43.000000000 -0700 +++ mm5-2.6.9-rc1/kernel/profile.c 2004-09-14 12:56:33.871160032 -0700 @@ -20,6 +20,7 @@ #include <linux/notifier.h> #include <linux/mm.h> #include <linux/cpumask.h> +#include <linux/cpu.h> #include <linux/profile.h> #include <asm/sections.h> #include <asm/semaphore.h> @@ -297,6 +298,44 @@ local_irq_restore(flags); put_cpu(); } + +#ifdef CONFIG_HOTPLUG_CPU +static int __devinit profile_cpu_callback(struct notifier_block *info, + unsigned long action, void *__cpu) +{ + int cpu = (unsigned long)__cpu; + + switch (action) { + case CPU_UP_PREPARE: + per_cpu(cpu_profile_flip, cpu) = 0; + if (!per_cpu(cpu_profile_hits, cpu)[1]) + per_cpu(cpu_profile_hits, cpu)[1] + = (void *)get_zeroed_page(GFP_KERNEL); + if (!per_cpu(cpu_profile_hits, cpu)[1]) + return NOTIFY_BAD; + if (!per_cpu(cpu_profile_hits, cpu)[0]) + per_cpu(cpu_profile_hits, cpu)[0] + = (void *)get_zeroed_page(GFP_KERNEL); + if (per_cpu(cpu_profile_hits, cpu)[0]) + break; + free_page((unsigned long)per_cpu(cpu_profile_hits, cpu)[1]); + return NOTIFY_BAD; + break; + case CPU_ONLINE: + cpu_set(cpu, prof_cpu_mask); + break; + case CPU_UP_CANCELED: + case CPU_DEAD: + cpu_clear(cpu, prof_cpu_mask); + free_page((unsigned long)per_cpu(cpu_profile_hits, cpu)[0]); + per_cpu(cpu_profile_hits, cpu)[0] = NULL; + free_page((unsigned long)per_cpu(cpu_profile_hits, cpu)[1]); + per_cpu(cpu_profile_hits, cpu)[1] = NULL; + break; + } + return NOTIFY_OK; +} +#endif /* CONFIG_HOTPLUG_CPU */ #else /* !CONFIG_SMP */ #define profile_flip_buffers() do { } while (0) @@ -459,6 +498,7 @@ return 0; entry->proc_fops = &proc_profile_operations; entry->size = (1+prof_len) * sizeof(atomic_t); + hotcpu_notifier(profile_cpu_callback, 0); return 0; #ifdef CONFIG_SMP out_cleanup: - 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/
| |