Re: [profile] amortize atomic hit count increments

From: William Lee Irwin III
Date: Tue Sep 14 2004 - 15:18:45 EST


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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/