lkml.org 
[lkml]   [2004]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [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/
    \
     
     \ /
      Last update: 2005-03-22 14:06    [W:4.349 / U:0.252 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site