Loading arch/x86/kernel/apic.c +5 −0 Original line number Diff line number Diff line Loading @@ -1833,6 +1833,11 @@ void __cpuinit generic_processor_info(int apicid, int version) num_processors++; cpu = cpumask_next_zero(-1, cpu_present_mask); if (version != apic_version[boot_cpu_physical_apicid]) WARN_ONCE(1, "ACPI: apic version mismatch, bootcpu: %x cpu %d: %x\n", apic_version[boot_cpu_physical_apicid], cpu, version); physid_set(apicid, phys_cpu_present_map); if (apicid == boot_cpu_physical_apicid) { /* Loading arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +9 −13 Original line number Diff line number Diff line Loading @@ -150,8 +150,9 @@ struct drv_cmd { u32 val; }; static void do_drv_read(struct drv_cmd *cmd) static long do_drv_read(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 h; switch (cmd->type) { Loading @@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd) default: break; } return 0; } static void do_drv_write(struct drv_cmd *cmd) static long do_drv_write(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 lo, hi; switch (cmd->type) { Loading @@ -186,30 +189,23 @@ static void do_drv_write(struct drv_cmd *cmd) default: break; } return 0; } static void drv_read(struct drv_cmd *cmd) { cpumask_t saved_mask = current->cpus_allowed; cmd->val = 0; set_cpus_allowed_ptr(current, cmd->mask); do_drv_read(cmd); set_cpus_allowed_ptr(current, &saved_mask); work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); } static void drv_write(struct drv_cmd *cmd) { cpumask_t saved_mask = current->cpus_allowed; unsigned int i; for_each_cpu(i, cmd->mask) { set_cpus_allowed_ptr(current, cpumask_of(i)); do_drv_write(cmd); work_on_cpu(i, do_drv_write, cmd); } set_cpus_allowed_ptr(current, &saved_mask); return; } static u32 get_cur_val(const struct cpumask *mask) Loading Loading @@ -367,7 +363,7 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu) return freq; } static unsigned int check_freqs(const cpumask_t *mask, unsigned int freq, static unsigned int check_freqs(const struct cpumask *mask, unsigned int freq, struct acpi_cpufreq_data *data) { unsigned int cur_freq; Loading kernel/workqueue.c +10 −10 Original line number Diff line number Diff line Loading @@ -971,6 +971,8 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, } #ifdef CONFIG_SMP static struct workqueue_struct *work_on_cpu_wq __read_mostly; struct work_for_cpu { struct work_struct work; long (*fn)(void *); Loading @@ -991,8 +993,8 @@ static void do_work_for_cpu(struct work_struct *w) * @fn: the function to run * @arg: the function arg * * This will return -EINVAL in the cpu is not online, or the return value * of @fn otherwise. * This will return the value @fn returns. * It is up to the caller to ensure that the cpu doesn't go offline. */ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) { Loading @@ -1001,14 +1003,8 @@ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) INIT_WORK(&wfc.work, do_work_for_cpu); wfc.fn = fn; wfc.arg = arg; get_online_cpus(); if (unlikely(!cpu_online(cpu))) wfc.ret = -EINVAL; else { schedule_work_on(cpu, &wfc.work); queue_work_on(cpu, work_on_cpu_wq, &wfc.work); flush_work(&wfc.work); } put_online_cpus(); return wfc.ret; } Loading @@ -1025,4 +1021,8 @@ void __init init_workqueues(void) hotcpu_notifier(workqueue_cpu_callback, 0); keventd_wq = create_workqueue("events"); BUG_ON(!keventd_wq); #ifdef CONFIG_SMP work_on_cpu_wq = create_workqueue("work_on_cpu"); BUG_ON(!work_on_cpu_wq); #endif } Loading
arch/x86/kernel/apic.c +5 −0 Original line number Diff line number Diff line Loading @@ -1833,6 +1833,11 @@ void __cpuinit generic_processor_info(int apicid, int version) num_processors++; cpu = cpumask_next_zero(-1, cpu_present_mask); if (version != apic_version[boot_cpu_physical_apicid]) WARN_ONCE(1, "ACPI: apic version mismatch, bootcpu: %x cpu %d: %x\n", apic_version[boot_cpu_physical_apicid], cpu, version); physid_set(apicid, phys_cpu_present_map); if (apicid == boot_cpu_physical_apicid) { /* Loading
arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c +9 −13 Original line number Diff line number Diff line Loading @@ -150,8 +150,9 @@ struct drv_cmd { u32 val; }; static void do_drv_read(struct drv_cmd *cmd) static long do_drv_read(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 h; switch (cmd->type) { Loading @@ -166,10 +167,12 @@ static void do_drv_read(struct drv_cmd *cmd) default: break; } return 0; } static void do_drv_write(struct drv_cmd *cmd) static long do_drv_write(void *_cmd) { struct drv_cmd *cmd = _cmd; u32 lo, hi; switch (cmd->type) { Loading @@ -186,30 +189,23 @@ static void do_drv_write(struct drv_cmd *cmd) default: break; } return 0; } static void drv_read(struct drv_cmd *cmd) { cpumask_t saved_mask = current->cpus_allowed; cmd->val = 0; set_cpus_allowed_ptr(current, cmd->mask); do_drv_read(cmd); set_cpus_allowed_ptr(current, &saved_mask); work_on_cpu(cpumask_any(cmd->mask), do_drv_read, cmd); } static void drv_write(struct drv_cmd *cmd) { cpumask_t saved_mask = current->cpus_allowed; unsigned int i; for_each_cpu(i, cmd->mask) { set_cpus_allowed_ptr(current, cpumask_of(i)); do_drv_write(cmd); work_on_cpu(i, do_drv_write, cmd); } set_cpus_allowed_ptr(current, &saved_mask); return; } static u32 get_cur_val(const struct cpumask *mask) Loading Loading @@ -367,7 +363,7 @@ static unsigned int get_cur_freq_on_cpu(unsigned int cpu) return freq; } static unsigned int check_freqs(const cpumask_t *mask, unsigned int freq, static unsigned int check_freqs(const struct cpumask *mask, unsigned int freq, struct acpi_cpufreq_data *data) { unsigned int cur_freq; Loading
kernel/workqueue.c +10 −10 Original line number Diff line number Diff line Loading @@ -971,6 +971,8 @@ static int __devinit workqueue_cpu_callback(struct notifier_block *nfb, } #ifdef CONFIG_SMP static struct workqueue_struct *work_on_cpu_wq __read_mostly; struct work_for_cpu { struct work_struct work; long (*fn)(void *); Loading @@ -991,8 +993,8 @@ static void do_work_for_cpu(struct work_struct *w) * @fn: the function to run * @arg: the function arg * * This will return -EINVAL in the cpu is not online, or the return value * of @fn otherwise. * This will return the value @fn returns. * It is up to the caller to ensure that the cpu doesn't go offline. */ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) { Loading @@ -1001,14 +1003,8 @@ long work_on_cpu(unsigned int cpu, long (*fn)(void *), void *arg) INIT_WORK(&wfc.work, do_work_for_cpu); wfc.fn = fn; wfc.arg = arg; get_online_cpus(); if (unlikely(!cpu_online(cpu))) wfc.ret = -EINVAL; else { schedule_work_on(cpu, &wfc.work); queue_work_on(cpu, work_on_cpu_wq, &wfc.work); flush_work(&wfc.work); } put_online_cpus(); return wfc.ret; } Loading @@ -1025,4 +1021,8 @@ void __init init_workqueues(void) hotcpu_notifier(workqueue_cpu_callback, 0); keventd_wq = create_workqueue("events"); BUG_ON(!keventd_wq); #ifdef CONFIG_SMP work_on_cpu_wq = create_workqueue("work_on_cpu"); BUG_ON(!work_on_cpu_wq); #endif }