lkml.org 
[lkml]   [2009]   [Apr]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: [patch for 2.6.30 2/2] arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c: avoid cross-CPU interrupts
    Date
    On Wed, 15 Apr 2009 02:48:17 am Andrew Morton wrote:
    > On Tue, 14 Apr 2009 18:21:36 +0930 Rusty Russell <rusty@rustcorp.com.au> wrote:
    > > Subject: cpumask: cpumask_closest()
    ..
    > Should it be exported?

    Ah yes.

    > It looks all racy against hotplug. What are the caller's
    > responsibilities here?

    Kind of independent. There's no implied internal reference to online_mask.

    > any_online_cpu() could use cpumask_closest(), against (*mask & cpu_online_map).

    Note that I've been killing any_online_cpu(). It passes a cpumask on stack,
    and cpumask_any(cpu_online_mask) / cpumask_any_and(mask, cpu_online_mask) work
    just as well.

    > I think all cpumask_any() call sites can be migrated to
    > cpumask_closest() with, at worst, no benefit.

    OK, here's the updated patch.

    Rusty.

    Subject: cpumask: cpumask_closest() and cpumask_closest_and()

    Impact: new functions

    Andrew points out that acpi-cpufreq uses cpumask_any, when it really
    would prefer to use the same CPU if possible (to avoid an IPI). In
    general, this seems a good idea to offer.

    Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
    CC: Andrew Morton <akpm@linux-foundation.org>
    ---
    include/linux/cpumask.h | 4 +++
    lib/cpumask.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
    2 files changed, 58 insertions(+)

    diff --git a/include/linux/cpumask.h b/include/linux/cpumask.h
    --- a/include/linux/cpumask.h
    +++ b/include/linux/cpumask.h
    @@ -931,6 +931,10 @@ static inline void cpumask_copy(struct c
    */
    #define cpumask_of(cpu) (get_cpu_mask(cpu))

    +unsigned int cpumask_closest(const struct cpumask *mask);
    +unsigned int cpumask_closest_and(const struct cpumask *mask1,
    + const struct cpumask *mask2);
    +
    /**
    * cpumask_scnprintf - print a cpumask into a string as comma-separated hex
    * @buf: the buffer to sprintf into
    diff --git a/lib/cpumask.c b/lib/cpumask.c
    --- a/lib/cpumask.c
    +++ b/lib/cpumask.c
    @@ -170,3 +170,57 @@ void __init free_bootmem_cpumask_var(cpu
    free_bootmem((unsigned long)mask, cpumask_size());
    }
    #endif
    +
    +/**
    + * cpumask_closest - return the closest cpu in mask.
    + * @mask: the cpus to choose from.
    + *
    + * Returns >= nr_cpu_ids if no bits are set in @mask.
    + */
    +unsigned int cpumask_closest(const struct cpumask *mask)
    +{
    + unsigned int cpu = raw_smp_processor_id();
    +
    + /* Try for same CPU. */
    + if (cpumask_test_cpu(cpu, mask))
    + return cpu;
    +
    + /* Try for same node. */
    + cpu = cpumask_any_and(cpumask_of_node(cpu), mask);
    + if (cpu <= nr_cpu_ids)
    + return cpu;
    +
    + /* Anything will do. */
    + return cpumask_any(mask);
    +}
    +EXPORT_SYMBOL(cpumask_closest);
    +
    +/**
    + * cpumask_closest_and - return the closest cpu in both masks.
    + * @mask1: one set of cpus to choose from.
    + * @mask2: the other set of cpus to choose from.
    + *
    + * The same as cpumask_closest(@mask1 & @mask2).
    + * Returns >= nr_cpu_ids if no bits are set in both..
    + */
    +unsigned int cpumask_closest_and(const struct cpumask *mask1,
    + const struct cpumask *mask2)
    +{
    + unsigned int cpu = raw_smp_processor_id();
    + const struct cpumask *nodemask;
    +
    + /* Try for same CPU. */
    + if (cpumask_test_cpu(cpu, mask1) && cpumask_test_cpu(cpu, mask2))
    + return cpu;
    +
    + /* Try for same node. */
    + nodemask = cpumask_of_node(cpu);
    + for_each_cpu_and(cpu, nodemask, mask1) {
    + if (cpumask_test_cpu(cpu, mask2))
    + return cpu;
    + }
    +
    + /* Anything will do. */
    + return cpumask_any_and(mask1, mask2);
    +}
    +EXPORT_SYMBOL(cpumask_closest_and);


    \
     
     \ /
      Last update: 2009-04-15 08:37    [W:0.024 / U:2.344 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site