lkml.org 
[lkml]   [2002]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    From
    SubjectRe: [PATCH] Simplified scalable cpu bitmasks
    Date
    In message <Pine.LNX.4.44.0208121119010.2067-100000@localhost.localdomain> you 
    write:
    >
    > i'd suggest to introduce one more helper define:
    >
    > #define BITS_TO_LONG(bits) \
    > (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
    >
    > this IMO simplifies some of the initializers, eg. the all-1 cpu-mask:
    >
    > #define CPU_MASK_ALL \
    > { [0 ... BITS_TO_LONG(NR_CPUS)-1] = ~0UL }

    Yeah, that initializer was v. ugly. Much nicer now, thanks!

    Rusty.
    --
    Anyone who quotes me in their sig is an idiot. -- Rusty Russell.

    Name: Bitops Cleanup
    Author: Rusty Russell
    Status: Trivial

    D: This renames bitmap_member to DECLARE_BITMAP, and moves it to bitops.h.

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/drivers/zorro/zorro.c .7898-linux-2.5.31.updated/drivers/zorro/zorro.c
    --- .7898-linux-2.5.31/drivers/zorro/zorro.c 2002-07-25 10:13:15.000000000 +1000
    +++ .7898-linux-2.5.31.updated/drivers/zorro/zorro.c 2002-08-12 18:32:06.000000000 +1000
    @@ -80,7 +80,7 @@ struct zorro_dev *zorro_find_device(zorr
    * FIXME: use the normal resource management
    */

    -bitmap_member(zorro_unused_z2ram, 128);
    +DECLARE_BITMAP(zorro_unused_z2ram, 128);


    static void __init mark_region(unsigned long start, unsigned long end,
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/include/linux/bitops.h .7898-linux-2.5.31.updated/include/linux/bitops.h
    --- .7898-linux-2.5.31/include/linux/bitops.h 2002-06-24 00:53:24.000000000 +1000
    +++ .7898-linux-2.5.31.updated/include/linux/bitops.h 2002-08-12 18:33:56.000000000 +1000
    @@ -1,6 +1,11 @@
    #ifndef _LINUX_BITOPS_H
    #define _LINUX_BITOPS_H
    #include <asm/bitops.h>
    +#include <asm/types.h>
    +
    +#define BITS_TO_LONG(bits) (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
    +#define DECLARE_BITMAP(name,bits) \
    + unsigned long name[BITS_TO_LONG(bits)]

    /*
    * ffs: find first bit set. This is defined the same way as
    @@ -107,7 +112,4 @@ static inline unsigned int generic_hweig
    return (res & 0x0F) + ((res >> 4) & 0x0F);
    }

    -#include <asm/bitops.h>
    -
    -
    #endif
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/include/linux/types.h .7898-linux-2.5.31.updated/include/linux/types.h
    --- .7898-linux-2.5.31/include/linux/types.h 2002-06-17 23:19:25.000000000 +1000
    +++ .7898-linux-2.5.31.updated/include/linux/types.h 2002-08-12 18:32:06.000000000 +1000
    @@ -3,9 +3,6 @@

    #ifdef __KERNEL__
    #include <linux/config.h>
    -
    -#define bitmap_member(name,bits) \
    - unsigned long name[((bits)+BITS_PER_LONG-1)/BITS_PER_LONG]
    #endif

    #include <linux/posix_types.h>
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/include/linux/zorro.h .7898-linux-2.5.31.updated/include/linux/zorro.h
    --- .7898-linux-2.5.31/include/linux/zorro.h 2002-07-25 10:13:18.000000000 +1000
    +++ .7898-linux-2.5.31.updated/include/linux/zorro.h 2002-08-12 18:32:06.000000000 +1000
    @@ -10,6 +10,7 @@

    #ifndef _LINUX_ZORRO_H
    #define _LINUX_ZORRO_H
    +#include <linux/bitops.h>

    #ifndef __ASSEMBLY__

    @@ -199,7 +200,7 @@ extern struct zorro_dev *zorro_find_devi
    * the corresponding bits.
    */

    -extern bitmap_member(zorro_unused_z2ram, 128);
    +extern DECLARE_BITMAP(zorro_unused_z2ram, 128);

    #define Z2RAM_START (0x00200000)
    #define Z2RAM_END (0x00a00000)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/include/sound/ac97_codec.h .7898-linux-2.5.31.updated/include/sound/ac97_codec.h
    --- .7898-linux-2.5.31/include/sound/ac97_codec.h 2002-06-21 09:41:55.000000000 +1000
    +++ .7898-linux-2.5.31.updated/include/sound/ac97_codec.h 2002-08-12 18:32:06.000000000 +1000
    @@ -25,6 +25,7 @@
    *
    */

    +#include <linux/bitops.h>
    #include "control.h"
    #include "info.h"

    @@ -169,7 +170,7 @@ struct _snd_ac97 {
    unsigned int rates_mic_adc;
    unsigned int spdif_status;
    unsigned short regs[0x80]; /* register cache */
    - bitmap_member(reg_accessed,0x80); /* bit flags */
    + DECLARE_BITMAP(reg_accessed, 0x80); /* bit flags */
    union { /* vendor specific code */
    struct {
    unsigned short unchained[3]; // 0 = C34, 1 = C79, 2 = C69
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/sound/core/seq/seq_clientmgr.h .7898-linux-2.5.31.updated/sound/core/seq/seq_clientmgr.h
    --- .7898-linux-2.5.31/sound/core/seq/seq_clientmgr.h 2002-06-21 09:41:57.000000000 +1000
    +++ .7898-linux-2.5.31.updated/sound/core/seq/seq_clientmgr.h 2002-08-12 18:32:06.000000000 +1000
    @@ -53,7 +53,7 @@ struct _snd_seq_client {
    char name[64]; /* client name */
    int number; /* client number */
    unsigned int filter; /* filter flags */
    - bitmap_member(event_filter, 256);
    + DECLARE_BITMAP(event_filter, 256);
    snd_use_lock_t use_lock;
    int event_lost;
    /* ports */
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7898-linux-2.5.31/sound/core/seq/seq_queue.h .7898-linux-2.5.31.updated/sound/core/seq/seq_queue.h
    --- .7898-linux-2.5.31/sound/core/seq/seq_queue.h 2002-06-21 09:41:57.000000000 +1000
    +++ .7898-linux-2.5.31.updated/sound/core/seq/seq_queue.h 2002-08-12 18:32:06.000000000 +1000
    @@ -26,6 +26,7 @@
    #include "seq_lock.h"
    #include <linux/interrupt.h>
    #include <linux/list.h>
    +#include <linux/bitops.h>

    #define SEQ_QUEUE_NO_OWNER (-1)

    @@ -51,7 +52,7 @@ struct _snd_seq_queue {
    spinlock_t check_lock;

    /* clients which uses this queue (bitmap) */
    - bitmap_member(clients_bitmap, SNDRV_SEQ_MAX_CLIENTS);
    + DECLARE_BITMAP(clients_bitmap, SNDRV_SEQ_MAX_CLIENTS);
    unsigned int clients; /* users of this queue */
    struct semaphore timer_mutex;

    Name: CPU mask patch
    Author: Rusty Russell
    Status: Tested on 2.5.30 SMP
    Depends: Misc/bitops.patch.gz
    D: This patch changes cpu masks to a generic bitmap, and introduces
    D: migrate_to_cpu() as a convenience function.

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/cpu/proc.c .7993-linux-2.5.31.updated/arch/i386/kernel/cpu/proc.c
    --- .7993-linux-2.5.31/arch/i386/kernel/cpu/proc.c 2002-06-10 16:03:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/cpu/proc.c 2002-08-12 18:34:35.000000000 +1000
    @@ -47,7 +47,7 @@ static int show_cpuinfo(struct seq_file
    int fpu_exception;

    #ifdef CONFIG_SMP
    - if (!(cpu_online_map & (1<<n)))
    + if (!cpu_online(n))
    return 0;
    #endif
    seq_printf(m, "processor\t: %d\n"
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/cpuid.c .7993-linux-2.5.31.updated/arch/i386/kernel/cpuid.c
    --- .7993-linux-2.5.31/arch/i386/kernel/cpuid.c 2002-05-25 14:34:36.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/cpuid.c 2002-08-12 18:34:35.000000000 +1000
    @@ -134,7 +134,7 @@ static int cpuid_open(struct inode *inod
    int cpu = minor(file->f_dentry->d_inode->i_rdev);
    struct cpuinfo_x86 *c = &(cpu_data)[cpu];

    - if ( !(cpu_online_map & (1UL << cpu)) )
    + if ( !cpu_online(cpu) )
    return -ENXIO; /* No such CPU */
    if ( c->cpuid_level < 0 )
    return -EIO; /* CPUID not supported */
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/io_apic.c .7993-linux-2.5.31.updated/arch/i386/kernel/io_apic.c
    --- .7993-linux-2.5.31/arch/i386/kernel/io_apic.c 2002-08-02 11:15:05.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/io_apic.c 2002-08-12 18:34:35.000000000 +1000
    @@ -258,7 +258,7 @@ static inline void balance_irq(int irq)
    rdtscl(random_number);
    random_number &= 1;

    - allowed_mask = cpu_online_map & irq_affinity[irq];
    + allowed_mask = cpu_online_map[0] & irq_affinity[irq];
    entry->timestamp = now;
    entry->cpu = move(entry->cpu, allowed_mask, now, random_number);
    set_ioapic_affinity(irq, 1 << entry->cpu);
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/irq.c .7993-linux-2.5.31.updated/arch/i386/kernel/irq.c
    --- .7993-linux-2.5.31/arch/i386/kernel/irq.c 2002-08-02 11:15:05.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/irq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -849,7 +849,7 @@ static int irq_affinity_write_proc (stru
    * way to make the system unusable accidentally :-) At least
    * one online CPU still has to be targeted.
    */
    - if (!(new_value & cpu_online_map))
    + if (!(new_value & cpu_online_map[0]))
    return -EINVAL;

    irq_affinity[irq] = new_value;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/msr.c .7993-linux-2.5.31.updated/arch/i386/kernel/msr.c
    --- .7993-linux-2.5.31/arch/i386/kernel/msr.c 2002-05-25 14:34:36.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/msr.c 2002-08-12 18:34:35.000000000 +1000
    @@ -234,7 +234,7 @@ static int msr_open(struct inode *inode,
    int cpu = minor(file->f_dentry->d_inode->i_rdev);
    struct cpuinfo_x86 *c = &(cpu_data)[cpu];

    - if ( !(cpu_online_map & (1UL << cpu)) )
    + if ( !cpu_online(cpu) )
    return -ENXIO; /* No such CPU */
    if ( !cpu_has(c, X86_FEATURE_MSR) )
    return -EIO; /* MSR not supported */
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/smp.c .7993-linux-2.5.31.updated/arch/i386/kernel/smp.c
    --- .7993-linux-2.5.31/arch/i386/kernel/smp.c 2002-07-27 15:24:35.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -399,7 +399,7 @@ static void flush_tlb_others (unsigned l
    */
    if (!cpumask)
    BUG();
    - if ((cpumask & cpu_online_map) != cpumask)
    + if ((cpumask & cpu_online_map[0]) != cpumask)
    BUG();
    if (cpumask & (1 << smp_processor_id()))
    BUG();
    @@ -599,7 +599,7 @@ static void stop_this_cpu (void * dummy)
    /*
    * Remove this CPU:
    */
    - clear_bit(smp_processor_id(), &cpu_online_map);
    + clear_bit(smp_processor_id(), cpu_online_map);
    local_irq_disable();
    disable_local_APIC();
    if (cpu_data[smp_processor_id()].hlt_works_ok)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/i386/kernel/smpboot.c .7993-linux-2.5.31.updated/arch/i386/kernel/smpboot.c
    --- .7993-linux-2.5.31/arch/i386/kernel/smpboot.c 2002-07-27 15:24:35.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/i386/kernel/smpboot.c 2002-08-12 18:34:35.000000000 +1000
    @@ -58,7 +58,7 @@ int smp_num_siblings = 1;
    int __initdata phys_proc_id[NR_CPUS]; /* Package ID of each logical CPU */

    /* Bitmask of currently online CPUs */
    -unsigned long cpu_online_map;
    +unsigned long cpu_online_map[1];

    static volatile unsigned long cpu_callin_map;
    volatile unsigned long cpu_callout_map;
    @@ -458,7 +458,7 @@ int __init start_secondary(void *unused)
    * the local TLBs too.
    */
    local_flush_tlb();
    - set_bit(smp_processor_id(), &cpu_online_map);
    + set_bit(smp_processor_id(), cpu_online_map);
    wmb();
    return cpu_idle();
    }
    @@ -1005,7 +1005,7 @@ static void __init smp_boot_cpus(unsigne
    /*
    * We have the boot CPU online for sure.
    */
    - set_bit(0, &cpu_online_map);
    + set_bit(0, cpu_online_map);
    set_bit(0, &cpu_callout_map);
    boot_cpu_logical_apicid = logical_smp_processor_id();
    map_cpu_to_boot_apicid(0, boot_cpu_apicid);
    @@ -1217,7 +1217,7 @@ int __devinit __cpu_up(unsigned int cpu)

    /* Unleash the CPU! */
    set_bit(cpu, &smp_commenced_mask);
    - while (!test_bit(cpu, &cpu_online_map))
    + while (!test_bit(cpu, cpu_online_map))
    mb();
    return 0;
    }
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/iosapic.c .7993-linux-2.5.31.updated/arch/ia64/kernel/iosapic.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/iosapic.c 2002-06-20 01:28:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/iosapic.c 2002-08-12 18:34:35.000000000 +1000
    @@ -256,7 +256,7 @@ iosapic_set_affinity (unsigned int irq,
    char *addr;
    int redir = (irq & (1<<31)) ? 1 : 0;

    - mask &= cpu_online_map;
    + mask &= cpu_online_map[0];

    if (!mask || irq >= IA64_NUM_VECTORS)
    return;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/irq.c .7993-linux-2.5.31.updated/arch/ia64/kernel/irq.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/irq.c 2002-07-25 10:13:01.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/irq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -1159,7 +1159,7 @@ static int irq_affinity_write_proc (stru
    * way to make the system unusable accidentally :-) At least
    * one online CPU still has to be targeted.
    */
    - if (!(new_value & cpu_online_map))
    + if (!(new_value & cpu_online_map[0]))
    return -EINVAL;

    irq_desc(irq)->handler->set_affinity(irq | (redir?(1<<31):0), new_value);
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/perfmon.c .7993-linux-2.5.31.updated/arch/ia64/kernel/perfmon.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/perfmon.c 2002-06-20 01:28:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/perfmon.c 2002-08-12 18:34:35.000000000 +1000
    @@ -2954,7 +2954,7 @@ static int
    perfmon_proc_info(char *page)
    {
    #ifdef CONFIG_SMP
    -#define cpu_is_online(i) (cpu_online_map & (1UL << i))
    +#define cpu_is_online(i) (cpu_online_map[0] & (1UL << i))
    #else
    #define cpu_is_online(i) 1
    #endif
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/setup.c .7993-linux-2.5.31.updated/arch/ia64/kernel/setup.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/setup.c 2002-05-30 10:00:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/setup.c 2002-08-12 18:34:35.000000000 +1000
    @@ -436,7 +436,7 @@ static void *
    c_start (struct seq_file *m, loff_t *pos)
    {
    #ifdef CONFIG_SMP
    - while (*pos < NR_CPUS && !(cpu_online_map & (1 << *pos)))
    + while (*pos < NR_CPUS && !cpu_online(*pos))
    ++*pos;
    #endif
    return *pos < NR_CPUS ? cpu_data(*pos) : NULL;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/smp.c .7993-linux-2.5.31.updated/arch/ia64/kernel/smp.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/smp.c 2002-07-25 10:13:01.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -89,7 +89,7 @@ stop_this_cpu (void)
    /*
    * Remove this CPU:
    */
    - clear_bit(smp_processor_id(), &cpu_online_map);
    + clear_bit(smp_processor_id(), cpu_online_map);
    max_xtp();
    local_irq_disable();
    cpu_halt();
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/kernel/smpboot.c .7993-linux-2.5.31.updated/arch/ia64/kernel/smpboot.c
    --- .7993-linux-2.5.31/arch/ia64/kernel/smpboot.c 2002-06-20 01:28:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/kernel/smpboot.c 2002-08-12 18:34:35.000000000 +1000
    @@ -77,7 +77,7 @@ task_t *task_for_booting_cpu;
    static int max_cpus = -1;

    /* Bitmask of currently online CPUs */
    -volatile unsigned long cpu_online_map;
    +volatile unsigned long cpu_online_map[1];

    /* which logical CPU number maps to which CPU (physical APIC ID) */
    volatile int ia64_cpu_to_sapicid[NR_CPUS];
    @@ -325,7 +325,7 @@ smp_callin (void)
    cpuid = smp_processor_id();
    phys_id = hard_smp_processor_id();

    - if (test_and_set_bit(cpuid, &cpu_online_map)) {
    + if (test_and_set_bit(cpuid, cpu_online_map)) {
    printk("huh, phys CPU#0x%x, CPU#0x%x already present??\n", phys_id, cpuid);
    BUG();
    }
    @@ -484,7 +484,7 @@ smp_boot_cpus (void)
    /*
    * We have the boot CPU online for sure.
    */
    - set_bit(0, &cpu_online_map);
    + set_bit(0, cpu_online_map);
    set_bit(0, &cpu_callin_map);

    local_cpu_data->loops_per_jiffy = loops_per_jiffy;
    @@ -501,7 +501,7 @@ smp_boot_cpus (void)
    */
    if (!max_cpus || (max_cpus < -1)) {
    printk(KERN_INFO "SMP mode deactivated.\n");
    - cpu_online_map = 1;
    + cpu_online_map[0] = 1;
    goto smp_done;
    }
    if (max_cpus != -1)
    @@ -541,7 +541,7 @@ smp_boot_cpus (void)
    } else {
    unsigned long bogosum = 0;
    for (cpu = 0; cpu < NR_CPUS; cpu++)
    - if (cpu_online_map & (1<<cpu))
    + if (cpu_online_map[0] & (1<<cpu))
    bogosum += cpu_data(cpu)->loops_per_jiffy;

    printk(KERN_INFO"Total of %d processors activated (%lu.%02lu BogoMIPS).\n",
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/sn/io/sn1/ml_SN_intr.c .7993-linux-2.5.31.updated/arch/ia64/sn/io/sn1/ml_SN_intr.c
    --- .7993-linux-2.5.31/arch/ia64/sn/io/sn1/ml_SN_intr.c 2002-06-20 01:28:47.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/sn/io/sn1/ml_SN_intr.c 2002-08-12 18:34:35.000000000 +1000
    @@ -44,7 +44,7 @@ void spldebug_log_event(int);
    #endif

    #ifdef CONFIG_SMP
    -extern unsigned long cpu_online_map;
    +extern unsigned long cpu_online_map[1];
    #endif
    #define cpu_allows_intr(cpu) (1)
    // If I understand what's going on with this, 32 should work.
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ia64/sn/kernel/sn1/sn1_smp.c .7993-linux-2.5.31.updated/arch/ia64/sn/kernel/sn1/sn1_smp.c
    --- .7993-linux-2.5.31/arch/ia64/sn/kernel/sn1/sn1_smp.c 2002-06-20 01:28:48.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ia64/sn/kernel/sn1/sn1_smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -425,7 +425,7 @@ init_sn1_smp_config(void)
    {
    if (!ia64_ptc_domain_info) {
    printk("SMP: Can't find PTC domain info. Forcing UP mode\n");
    - cpu_online_map = 1;
    + cpu_online_map[0] = 1;
    return;
    }

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc/kernel/irq.c .7993-linux-2.5.31.updated/arch/ppc/kernel/irq.c
    --- .7993-linux-2.5.31/arch/ppc/kernel/irq.c 2002-08-11 15:31:31.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc/kernel/irq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -647,7 +647,7 @@ static int irq_affinity_write_proc (stru
    * are actually logical cpu #'s then we have no problem.
    * -- Cort <cort@fsmlabs.com>
    */
    - if (!(new_value & cpu_online_map))
    + if (!(new_value & cpu_online_map[0]))
    return -EINVAL;

    irq_affinity[irq] = new_value;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc/kernel/setup.c .7993-linux-2.5.31.updated/arch/ppc/kernel/setup.c
    --- .7993-linux-2.5.31/arch/ppc/kernel/setup.c 2002-08-11 15:31:31.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc/kernel/setup.c 2002-08-12 18:34:35.000000000 +1000
    @@ -160,7 +160,7 @@ int show_cpuinfo(struct seq_file *m, voi
    }

    #ifdef CONFIG_SMP
    - if (!(cpu_online_map & (1 << i)))
    + if (!cpu_online(i))
    return 0;
    pvr = cpu_data[i].pvr;
    lpj = cpu_data[i].loops_per_jiffy;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc/kernel/smp.c .7993-linux-2.5.31.updated/arch/ppc/kernel/smp.c
    --- .7993-linux-2.5.31/arch/ppc/kernel/smp.c 2002-08-11 15:31:31.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc/kernel/smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -51,7 +51,7 @@ spinlock_t kernel_flag __cacheline_align
    unsigned int prof_multiplier[NR_CPUS] = { [1 ... NR_CPUS-1] = 1 };
    unsigned int prof_counter[NR_CPUS] = { [1 ... NR_CPUS-1] = 1 };
    unsigned long cache_decay_ticks = HZ/100;
    -unsigned long cpu_online_map = 1UL;
    +unsigned long cpu_online_map[1] = { 1UL };
    unsigned long cpu_possible_map = 1UL;
    int smp_hw_index[NR_CPUS];
    struct thread_info *secondary_ti;
    @@ -433,7 +433,7 @@ int __cpu_up(unsigned int cpu)
    printk("Processor %d found.\n", cpu);

    smp_ops->give_timebase();
    - set_bit(cpu, &cpu_online_map);
    + set_bit(cpu, cpu_online_map);
    return 0;
    }

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/irq.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/irq.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/irq.c 2002-07-25 10:13:03.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/irq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -459,7 +459,7 @@ static inline void balance_irq(int irq)
    random_number = mftb();
    random_number &= 1;

    - allowed_mask = cpu_online_map & irq_affinity[irq];
    + allowed_mask = cpu_online_map[0] & irq_affinity[irq];
    entry->timestamp = now;
    entry->cpu = move(entry->cpu, allowed_mask, now, random_number);
    irq_desc[irq].handler->set_affinity(irq, 1 << entry->cpu);
    @@ -724,7 +724,7 @@ static int irq_affinity_write_proc (stru
    * way to make the system unusable accidentally :-) At least
    * one online CPU still has to be targeted.
    */
    - if (!(new_value & cpu_online_map))
    + if (!(new_value & cpu_online_map[0]))
    return -EINVAL;
    #endif

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/open_pic.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/open_pic.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/open_pic.c 2002-07-25 10:13:04.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/open_pic.c 2002-08-12 18:34:35.000000000 +1000
    @@ -506,7 +506,7 @@ static void openpic_set_spurious(u_int v
    void openpic_init_processor(u_int cpumask)
    {
    openpic_write(&OpenPIC->Global.Processor_Initialization,
    - cpumask & cpu_online_map);
    + cpumask & cpu_online_map[0]);
    }

    #ifdef CONFIG_SMP
    @@ -540,7 +540,7 @@ void openpic_cause_IPI(u_int ipi, u_int
    CHECK_THIS_CPU;
    check_arg_ipi(ipi);
    openpic_write(&OpenPIC->THIS_CPU.IPI_Dispatch(ipi),
    - cpumask & cpu_online_map);
    + cpumask & cpu_online_map[0]);
    }

    void openpic_request_IPIs(void)
    @@ -625,7 +625,7 @@ static void __init openpic_maptimer(u_in
    {
    check_arg_timer(timer);
    openpic_write(&OpenPIC->Global.Timer[timer].Destination,
    - cpumask & cpu_online_map);
    + cpumask & cpu_online_map[0]);
    }


    @@ -748,7 +748,7 @@ static void openpic_end_irq(unsigned int

    static void openpic_set_affinity(unsigned int irq_nr, unsigned long cpumask)
    {
    - openpic_mapirq(irq_nr - open_pic_irq_offset, cpumask & cpu_online_map);
    + openpic_mapirq(irq_nr - open_pic_irq_offset, cpumask & cpu_online_map[0]);
    }

    #ifdef CONFIG_SMP
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/prom.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/prom.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/prom.c 2002-07-25 10:13:04.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/prom.c 2002-08-12 18:34:35.000000000 +1000
    @@ -1349,7 +1349,7 @@ prom_init(unsigned long r3, unsigned lon
    &getprop_rval, sizeof(getprop_rval));
    _prom->cpu = (int)(unsigned long)getprop_rval;
    _xPaca[_prom->cpu].active = 1;
    - RELOC(cpu_online_map) = 1 << _prom->cpu;
    + RELOC(cpu_online_map[0]) = 1 << _prom->cpu;
    RELOC(boot_cpuid) = _prom->cpu;

    #ifdef DEBUG_PROM
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/setup.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/setup.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/setup.c 2002-07-25 10:13:04.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/setup.c 2002-08-12 18:34:35.000000000 +1000
    @@ -271,7 +271,7 @@ static int show_cpuinfo(struct seq_file
    return 0;
    }

    - if (!(cpu_online_map & (1<<cpu_id)))
    + if (!cpu_online(cpu_id))
    return 0;
    #endif

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/smp.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/smp.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/smp.c 2002-07-25 10:13:04.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -60,7 +60,7 @@ unsigned long cache_decay_ticks;
    static int max_cpus __initdata = NR_CPUS;

    /* initialised so it doesnt end up in bss */
    -unsigned long cpu_online_map = 0;
    +unsigned long cpu_online_map[1] = { 0 };
    int boot_cpuid = 0;
    int ppc64_is_smp = 0;

    @@ -693,7 +693,7 @@ void __init smp_callin(void)

    smp_store_cpu_info(cpu);
    set_dec(paca[cpu].default_decr);
    - set_bit(smp_processor_id(), &cpu_online_map);
    + set_bit(smp_processor_id(), cpu_online_map);
    smp_mb();
    cpu_callin_map[cpu] = 1;

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/ppc64/kernel/xics.c .7993-linux-2.5.31.updated/arch/ppc64/kernel/xics.c
    --- .7993-linux-2.5.31/arch/ppc64/kernel/xics.c 2002-07-25 10:13:04.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/ppc64/kernel/xics.c 2002-08-12 18:34:35.000000000 +1000
    @@ -451,7 +451,7 @@ void xics_set_affinity(unsigned int virq
    if (cpumask == 0xffffffff) {
    newmask = default_distrib_server;
    } else {
    - if (!(cpumask & cpu_online_map))
    + if (!(cpumask & cpu_online_map[0]))
    goto out;
    newmask = find_first_bit(&cpumask, 32);
    }
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/sparc64/kernel/irq.c .7993-linux-2.5.31.updated/arch/sparc64/kernel/irq.c
    --- .7993-linux-2.5.31/arch/sparc64/kernel/irq.c 2002-08-11 15:31:33.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/sparc64/kernel/irq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -662,9 +662,9 @@ static inline void redirect_intr(int cpu
    unsigned long cpu_mask = get_smpaff_in_irqaction(ap);
    unsigned int buddy, ticks;

    - cpu_mask &= cpu_online_map;
    + cpu_mask &= cpu_online_map[0];
    if (cpu_mask == 0)
    - cpu_mask = cpu_online_map;
    + cpu_mask = cpu_online_map[0];

    if (this_is_starfire != 0 ||
    bp->pil >= 10 || current->pid == 0)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/arch/sparc64/kernel/smp.c .7993-linux-2.5.31.updated/arch/sparc64/kernel/smp.c
    --- .7993-linux-2.5.31/arch/sparc64/kernel/smp.c 2002-08-11 15:31:33.000000000 +1000
    +++ .7993-linux-2.5.31.updated/arch/sparc64/kernel/smp.c 2002-08-12 18:34:35.000000000 +1000
    @@ -50,7 +50,7 @@ static unsigned char boot_cpu_id;
    spinlock_t kernel_flag __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED;

    atomic_t sparc64_num_cpus_online = ATOMIC_INIT(0);
    -unsigned long cpu_online_map = 0;
    +unsigned long cpu_online_map[1] = { 0 };
    atomic_t sparc64_num_cpus_possible = ATOMIC_INIT(0);
    unsigned long phys_cpu_present_map = 0;
    static unsigned long smp_commenced_mask;
    @@ -202,7 +202,7 @@ void __init smp_callin(void)
    while (!test_bit(cpuid, &smp_commenced_mask))
    membar("#LoadLoad");

    - set_bit(cpuid, &cpu_online_map);
    + set_bit(cpuid, cpu_online_map);
    atomic_inc(&sparc64_num_cpus_online);
    }

    @@ -463,7 +463,7 @@ static void smp_cross_call_masked(unsign
    {
    u64 data0 = (((u64)ctx)<<32 | (((u64)func) & 0xffffffff));

    - mask &= cpu_online_map;
    + mask &= cpu_online_map[0];
    mask &= ~(1UL<<smp_processor_id());

    if (tlb_type == spitfire)
    @@ -475,7 +475,7 @@ static void smp_cross_call_masked(unsign

    /* Send cross call to all processors except self. */
    #define smp_cross_call(func, ctx, data1, data2) \
    - smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map)
    + smp_cross_call_masked(func, ctx, data1, data2, cpu_online_map[0])

    struct call_data_struct {
    void (*func) (void *info);
    @@ -593,7 +593,7 @@ void smp_flush_dcache_page_impl(struct p
    #endif
    if (cpu == smp_processor_id()) {
    __local_flush_dcache_page(page);
    - } else if ((cpu_online_map & mask) != 0) {
    + } else if ((cpu_online_map[0] & mask) != 0) {
    u64 data0;

    if (tlb_type == spitfire) {
    @@ -620,7 +620,7 @@ void smp_flush_dcache_page_impl(struct p

    void flush_dcache_page_all(struct mm_struct *mm, struct page *page)
    {
    - unsigned long mask = cpu_online_map & ~(1UL << smp_processor_id());
    + unsigned long mask = cpu_online_map[0] & ~(1UL << smp_processor_id());
    u64 data0;

    #ifdef CONFIG_DEBUG_DCFLUSH
    @@ -653,7 +653,7 @@ void smp_receive_signal(int cpu)
    {
    unsigned long mask = 1UL << cpu;

    - if ((cpu_online_map & mask) != 0) {
    + if ((cpu_online_map[0] & mask) != 0) {
    u64 data0 = (((u64)&xcall_receive_signal) & 0xffffffff);

    if (tlb_type == spitfire)
    @@ -1088,7 +1088,7 @@ void __init smp_tick_init(void)
    }

    atomic_inc(&sparc64_num_cpus_online);
    - set_bit(boot_cpu_id, &cpu_online_map);
    + set_bit(boot_cpu_id, cpu_online_map);
    prom_cpu_nodes[boot_cpu_id] = linux_cpus[0].prom_node;
    prof_counter(boot_cpu_id) = prof_multiplier(boot_cpu_id) = 1;
    }
    @@ -1251,9 +1251,9 @@ int __devinit __cpu_up(unsigned int cpu)

    if (!ret) {
    set_bit(cpu, &smp_commenced_mask);
    - while (!test_bit(cpu, &cpu_online_map))
    + while (!test_bit(cpu, cpu_online_map))
    mb();
    - if (!test_bit(cpu, &cpu_online_map))
    + if (!test_bit(cpu, cpu_online_map))
    ret = -ENODEV;
    }
    return ret;
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/asm-i386/smp.h .7993-linux-2.5.31.updated/include/asm-i386/smp.h
    --- .7993-linux-2.5.31/include/asm-i386/smp.h 2002-08-02 11:15:10.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/asm-i386/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -27,7 +27,7 @@
    # define TARGET_CPUS 0xf /* all CPUs in *THIS* quad */
    # define INT_DELIVERY_MODE 0 /* physical delivery on LOCAL quad */
    # else
    -# define TARGET_CPUS cpu_online_map
    +# define TARGET_CPUS cpu_online_map[0]
    # define INT_DELIVERY_MODE 1 /* logical delivery broadcast to all procs */
    # endif
    #else
    @@ -54,7 +54,7 @@

    extern void smp_alloc_memory(void);
    extern unsigned long phys_cpu_present_map;
    -extern unsigned long cpu_online_map;
    +extern unsigned long cpu_online_map[1];
    extern volatile unsigned long smp_invalidate_needed;
    extern int pic_mode;
    extern int smp_num_siblings;
    @@ -87,20 +87,23 @@ extern volatile int logical_apicid_to_cp

    extern volatile unsigned long cpu_callout_map;

    +#if NR_CPUS > 32
    +#error asm/smp.h needs fixing for > 32 CPUS.
    +#endif
    +
    #define cpu_possible(cpu) (cpu_callout_map & (1<<(cpu)))
    -#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
    +#define cpu_online(cpu) (cpu_online_map[0] & (1<<(cpu)))

    extern inline unsigned int num_online_cpus(void)
    {
    - return hweight32(cpu_online_map);
    + return hweight32(cpu_online_map[0]);
    }

    -extern inline int any_online_cpu(unsigned int mask)
    +static inline int any_online_cpu(const unsigned long *mask)
    {
    - if (mask & cpu_online_map)
    - return __ffs(mask & cpu_online_map);
    -
    - return -1;
    + if ((mask[0] & cpu_online_map[0]) != 0UL)
    + return __ffs(mask[0] & cpu_online_map[0]);
    + return NR_CPUS;
    }

    static __inline int hard_smp_processor_id(void)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/asm-ia64/smp.h .7993-linux-2.5.31.updated/include/asm-ia64/smp.h
    --- .7993-linux-2.5.31/include/asm-ia64/smp.h 2002-06-20 01:28:51.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/asm-ia64/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -36,7 +36,7 @@ extern struct smp_boot_data {

    extern char no_int_routing __initdata;

    -extern volatile unsigned long cpu_online_map;
    +extern volatile unsigned long cpu_online_map[0];
    extern unsigned long ipi_base_addr;
    extern unsigned char smp_int_redirect;

    @@ -45,18 +45,22 @@ extern volatile int ia64_cpu_to_sapicid[

    extern unsigned long ap_wakeup_vector;

    -#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
    +#if NR_CPUS > 64
    +#error asm/smp.h needs fixing for > 64 CPUS.
    +#endif
    +
    +#define cpu_online(cpu) (cpu_online_map[0] & (1<<(cpu)))
    +
    extern inline unsigned int num_online_cpus(void)
    {
    - return hweight64(cpu_online_map);
    + return hweight64(cpu_online_map[0]);
    }

    -extern inline int any_online_cpu(unsigned int mask)
    +static inline int any_online_cpu(const unsigned long *mask)
    {
    - if (mask & cpu_online_map)
    - return __ffs(mask & cpu_online_map);
    -
    - return -1;
    + if ((mask[0] & cpu_online_map[0]) != 0UL)
    + return __ffs(mask[0] & cpu_online_map[0]);
    + return NR_CPUS;
    }

    /*
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/asm-ppc/smp.h .7993-linux-2.5.31.updated/include/asm-ppc/smp.h
    --- .7993-linux-2.5.31/include/asm-ppc/smp.h 2002-07-27 15:24:39.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/asm-ppc/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -31,7 +31,7 @@ struct cpuinfo_PPC {
    };

    extern struct cpuinfo_PPC cpu_data[];
    -extern unsigned long cpu_online_map;
    +extern unsigned long cpu_online_map[1];
    extern unsigned long cpu_possible_map;
    extern unsigned long smp_proc_in_lock[];
    extern volatile unsigned long cpu_callin_map[];
    @@ -48,20 +48,23 @@ extern void smp_local_timer_interrupt(st

    #define smp_processor_id() (current_thread_info()->cpu)

    -#define cpu_online(cpu) (cpu_online_map & (1<<(cpu)))
    +#if NR_CPUS > 32
    +#error asm/smp.h needs fixing for > 32 CPUS.
    +#endif
    +
    +#define cpu_online(cpu) (cpu_online_map[0] & (1<<(cpu)))
    #define cpu_possible(cpu) (cpu_possible_map & (1<<(cpu)))

    extern inline unsigned int num_online_cpus(void)
    {
    - return hweight32(cpu_online_map);
    + return hweight32(cpu_online_map[0]);
    }

    -extern inline int any_online_cpu(unsigned int mask)
    +static inline int any_online_cpu(const unsigned long *mask)
    {
    - if (mask & cpu_online_map)
    - return __ffs(mask & cpu_online_map);
    -
    - return -1;
    + if ((mask[0] & cpu_online_map[0]) != 0UL)
    + return __ffs(mask[0] & cpu_online_map[0]);
    + return NR_CPUS;
    }

    extern int __cpu_up(unsigned int cpu);
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/asm-ppc64/smp.h .7993-linux-2.5.31.updated/include/asm-ppc64/smp.h
    --- .7993-linux-2.5.31/include/asm-ppc64/smp.h 2002-07-25 10:13:17.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/asm-ppc64/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -27,7 +27,7 @@

    #include <asm/paca.h>

    -extern unsigned long cpu_online_map;
    +extern unsigned long cpu_online_map[1];

    extern void smp_message_pass(int target, int msg, unsigned long data, int wait);
    extern void smp_store_cpu_info(int id);
    @@ -39,7 +39,11 @@ extern void smp_send_reschedule_all(void

    #define NO_PROC_ID 0xFF /* No processor magic marker */

    -#define cpu_online(cpu) test_bit((cpu), &cpu_online_map)
    +#if NR_CPUS > 64
    +#error asm/smp.h needs fixing for > 64 CPUS.
    +#endif
    +
    +#define cpu_online(cpu) test_bit((cpu), cpu_online_map)

    #define cpu_possible(cpu) paca[cpu].active

    @@ -48,11 +52,18 @@ static inline int num_online_cpus(void)
    int i, nr = 0;

    for (i = 0; i < NR_CPUS; i++)
    - nr += test_bit(i, &cpu_online_map);
    + nr += test_bit(i, cpu_online_map);

    return nr;
    }

    +static inline int any_online_cpu(const unsigned long *mask)
    +{
    + if ((mask[0] & cpu_online_map[0]) != 0UL)
    + return __ffs(mask[0] & cpu_online_map[0]);
    + return NR_CPUS;
    +}
    +
    extern volatile unsigned long cpu_callin_map[NR_CPUS];

    #define smp_processor_id() (get_paca()->xPacaIndex)
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/asm-sparc64/smp.h .7993-linux-2.5.31.updated/include/asm-sparc64/smp.h
    --- .7993-linux-2.5.31/include/asm-sparc64/smp.h 2002-08-11 15:31:42.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/asm-sparc64/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -69,8 +69,8 @@ extern unsigned char boot_cpu_id;
    extern unsigned long phys_cpu_present_map;
    #define cpu_possible(cpu) (phys_cpu_present_map & (1UL << (cpu)))

    -extern unsigned long cpu_online_map;
    -#define cpu_online(cpu) (cpu_online_map & (1UL << (cpu)))
    +extern unsigned long cpu_online_map[1];
    +#define cpu_online(cpu) (cpu_online_map[0] & (1UL << (cpu)))

    extern atomic_t sparc64_num_cpus_online;
    #define num_online_cpus() (atomic_read(&sparc64_num_cpus_online))
    @@ -78,11 +78,11 @@ extern atomic_t sparc64_num_cpus_online;
    extern atomic_t sparc64_num_cpus_possible;
    #define num_possible_cpus() (atomic_read(&sparc64_num_cpus_possible))

    -static inline int any_online_cpu(unsigned long mask)
    +static inline int any_online_cpu(const unsigned long *mask)
    {
    - if ((mask &= cpu_online_map) != 0UL)
    - return __ffs(mask);
    - return -1;
    + if ((mask[0] & cpu_online_map[0]) != 0UL)
    + return __ffs(mask[0] & cpu_online_map[0]);
    + return NR_CPUS;
    }

    /*
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/linux/init_task.h .7993-linux-2.5.31.updated/include/linux/init_task.h
    --- .7993-linux-2.5.31/include/linux/init_task.h 2002-07-25 10:13:18.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/linux/init_task.h 2002-08-12 18:34:35.000000000 +1000
    @@ -48,7 +48,7 @@
    prio: MAX_PRIO-20, \
    static_prio: MAX_PRIO-20, \
    policy: SCHED_NORMAL, \
    - cpus_allowed: -1, \
    + cpus_allowed: CPU_MASK_ALL, \
    mm: NULL, \
    active_mm: &init_mm, \
    run_list: LIST_HEAD_INIT(tsk.run_list), \
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/linux/sched.h .7993-linux-2.5.31.updated/include/linux/sched.h
    --- .7993-linux-2.5.31/include/linux/sched.h 2002-08-02 11:15:10.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/linux/sched.h 2002-08-12 18:35:38.000000000 +1000
    @@ -14,12 +14,14 @@ extern unsigned long event;
    #include <linux/jiffies.h>
    #include <linux/rbtree.h>
    #include <linux/thread_info.h>
    +#include <linux/bitops.h>

    #include <asm/system.h>
    #include <asm/semaphore.h>
    #include <asm/page.h>
    #include <asm/ptrace.h>
    #include <asm/mmu.h>
    +#include <asm/current.h>

    #include <linux/smp.h>
    #include <linux/sem.h>
    @@ -262,7 +264,7 @@ struct task_struct {
    unsigned long sleep_timestamp;

    unsigned long policy;
    - unsigned long cpus_allowed;
    + DECLARE_BITMAP(cpus_allowed, NR_CPUS);
    unsigned int time_slice, first_time_slice;

    struct list_head tasks;
    @@ -410,10 +412,20 @@ do { if (atomic_dec_and_test(&(tsk)->usa
    #define _STK_LIM (8*1024*1024)

    #if CONFIG_SMP
    -extern void set_cpus_allowed(task_t *p, unsigned long new_mask);
    +extern void set_cpus_allowed(task_t *p, const unsigned long new_mask[]);
    #else
    # define set_cpus_allowed(p, new_mask) do { } while (0)
    #endif
    +#define CPU_MASK_NONE { 0 }
    +#define CPU_MASK_ALL { [0 ... BITS_TO_LONG(NR_CPUS)-1 = ~0UL }
    +
    +static inline void migrate_to_cpu(unsigned int cpu)
    +{
    + DECLARE_BITMAP(mask, NR_CPUS) = CPU_MASK_NONE;
    + BUG_ON(!cpu_online(cpu));
    + __set_bit(cpu, mask);
    + set_cpus_allowed(current, mask);
    +}

    extern void set_user_nice(task_t *p, long nice);
    extern int task_prio(task_t *p);
    @@ -479,8 +491,6 @@ static inline struct task_struct *find_t
    extern struct user_struct * alloc_uid(uid_t);
    extern void free_uid(struct user_struct *);

    -#include <asm/current.h>
    -
    extern unsigned long itimer_ticks;
    extern unsigned long itimer_next;
    extern void do_timer(struct pt_regs *);
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/include/linux/smp.h .7993-linux-2.5.31.updated/include/linux/smp.h
    --- .7993-linux-2.5.31/include/linux/smp.h 2002-08-11 15:31:43.000000000 +1000
    +++ .7993-linux-2.5.31.updated/include/linux/smp.h 2002-08-12 18:34:35.000000000 +1000
    @@ -93,12 +93,13 @@ int cpu_up(unsigned int cpu);
    #define smp_call_function(func,info,retry,wait) ({ 0; })
    static inline void smp_send_reschedule(int cpu) { }
    static inline void smp_send_reschedule_all(void) { }
    -#define cpu_online_map 1
    +#define cpu_online_map ((unsigned long[1]){ 1 })
    #define cpu_online(cpu) ({ cpu; 1; })
    #define num_online_cpus() 1
    #define __per_cpu_data
    #define per_cpu(var, cpu) var
    #define this_cpu(var) var
    +#define any_online_cpu(mask) ((*(mask) & 1) ? 0 : 1)

    struct notifier_block;

    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/kernel/sched.c .7993-linux-2.5.31.updated/kernel/sched.c
    --- .7993-linux-2.5.31/kernel/sched.c 2002-08-02 11:15:10.000000000 +1000
    +++ .7993-linux-2.5.31.updated/kernel/sched.c 2002-08-12 18:34:35.000000000 +1000
    @@ -29,6 +29,7 @@
    #include <linux/security.h>
    #include <linux/notifier.h>
    #include <linux/delay.h>
    +#include <linux/bitops.h>

    /*
    * Convert user-nice values [ -20 ... 0 ... 19 ]
    @@ -415,7 +416,7 @@ repeat_lock_task:
    */
    if (unlikely(sync && !task_running(rq, p) &&
    (task_cpu(p) != smp_processor_id()) &&
    - (p->cpus_allowed & (1UL << smp_processor_id())))) {
    + (test_bit(smp_processor_id(), p->cpus_allowed)))) {

    set_task_cpu(p, smp_processor_id());
    task_rq_unlock(rq, &flags);
    @@ -789,7 +790,7 @@ skip_queue:
    #define CAN_MIGRATE_TASK(p,rq,this_cpu) \
    ((jiffies - (p)->sleep_timestamp > cache_decay_ticks) && \
    !task_running(rq, p) && \
    - ((p)->cpus_allowed & (1UL << (this_cpu))))
    + (test_bit(smp_processor_id(), p->cpus_allowed)))

    curr = curr->prev;

    @@ -1542,7 +1543,7 @@ out_unlock:
    asmlinkage int sys_sched_setaffinity(pid_t pid, unsigned int len,
    unsigned long *user_mask_ptr)
    {
    - unsigned long new_mask;
    + DECLARE_BITMAP(new_mask, NR_CPUS);
    int retval;
    task_t *p;

    @@ -1552,8 +1553,7 @@ asmlinkage int sys_sched_setaffinity(pid
    if (copy_from_user(&new_mask, user_mask_ptr, sizeof(new_mask)))
    return -EFAULT;

    - new_mask &= cpu_online_map;
    - if (!new_mask)
    + if (any_online_cpu(new_mask) == NR_CPUS)
    return -EINVAL;

    read_lock(&tasklist_lock);
    @@ -1594,8 +1594,8 @@ out_unlock:
    asmlinkage int sys_sched_getaffinity(pid_t pid, unsigned int len,
    unsigned long *user_mask_ptr)
    {
    - unsigned int real_len;
    - unsigned long mask;
    + unsigned int real_len, i;
    + DECLARE_BITMAP(mask, NR_CPUS);
    int retval;
    task_t *p;

    @@ -1611,7 +1611,8 @@ asmlinkage int sys_sched_getaffinity(pid
    goto out_unlock;

    retval = 0;
    - mask = p->cpus_allowed & cpu_online_map;
    + for (i = 0; i < ARRAY_SIZE(mask); i++)
    + mask[i] = (p->cpus_allowed[i] & cpu_online_map[i]);

    out_unlock:
    read_unlock(&tasklist_lock);
    @@ -1914,7 +1915,7 @@ typedef struct {
    * task must not exit() & deallocate itself prematurely. The
    * call is not atomic; no spinlocks may be held.
    */
    -void set_cpus_allowed(task_t *p, unsigned long new_mask)
    +void set_cpus_allowed(task_t *p, const unsigned long new_mask[])
    {
    unsigned long flags;
    migration_req_t req;
    @@ -1928,12 +1929,12 @@ void set_cpus_allowed(task_t *p, unsigne

    preempt_disable();
    rq = task_rq_lock(p, &flags);
    - p->cpus_allowed = new_mask;
    + memcpy(p->cpus_allowed, new_mask, sizeof(p->cpus_allowed));
    /*
    * Can the task run on the task's current CPU? If not then
    * migrate the thread off to a proper CPU.
    */
    - if (new_mask & (1UL << task_cpu(p))) {
    + if (test_bit(task_cpu(p), new_mask)) {
    task_rq_unlock(rq, &flags);
    goto out;
    }
    @@ -1942,7 +1943,7 @@ void set_cpus_allowed(task_t *p, unsigne
    * it is sufficient to simply update the task's cpu field.
    */
    if (!p->array && !task_running(rq, p)) {
    - set_task_cpu(p, __ffs(p->cpus_allowed));
    + set_task_cpu(p, any_online_cpu(p->cpus_allowed));
    task_rq_unlock(rq, &flags);
    goto out;
    }
    @@ -1972,7 +1973,7 @@ static int migration_thread(void * data)
    sigfillset(&current->blocked);
    set_fs(KERNEL_DS);

    - set_cpus_allowed(current, 1UL << cpu);
    + migrate_to_cpu(cpu);

    /*
    * Migration can happen without a migration thread on the
    @@ -2010,7 +2011,7 @@ static int migration_thread(void * data)
    spin_unlock_irqrestore(&rq->lock, flags);

    p = req->task;
    - cpu_dest = __ffs(p->cpus_allowed);
    + cpu_dest = any_online_cpu(p->cpus_allowed);
    rq_dest = cpu_rq(cpu_dest);
    repeat:
    cpu_src = task_cpu(p);
    diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal .7993-linux-2.5.31/kernel/softirq.c .7993-linux-2.5.31.updated/kernel/softirq.c
    --- .7993-linux-2.5.31/kernel/softirq.c 2002-08-02 11:15:10.000000000 +1000
    +++ .7993-linux-2.5.31.updated/kernel/softirq.c 2002-08-12 18:34:35.000000000 +1000
    @@ -361,8 +361,7 @@ static int ksoftirqd(void * __bind_cpu)
    current->flags |= PF_IOTHREAD;
    sigfillset(&current->blocked);

    - /* Migrate to the right CPU */
    - set_cpus_allowed(current, 1UL << cpu);
    + migrate_to_cpu(cpu);
    if (smp_processor_id() != cpu)
    BUG();

    -
    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 13:27    [W:0.090 / U:29.900 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site