Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ecacc6c7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6:
  [IA64] Avoid array overflow if there are too many cpus in SRAT table
  [IA64] Remove unlikely from cpu_is_offline
  [IA64] irq_ia64, use set_irq_chip
  [IA64] perfmon: Change vmalloc to vzalloc and drop memset.
  [IA64] eliminate race condition in smp_flush_tlb_mm
parents e773202e 4bfc2b2e
Loading
Loading
Loading
Loading
+6 −0
Original line number Original line Diff line number Diff line
@@ -477,6 +477,12 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
	if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
	if (!(pa->flags & ACPI_SRAT_CPU_ENABLED))
		return;
		return;


	if (srat_num_cpus >= ARRAY_SIZE(node_cpuid)) {
		printk_once(KERN_WARNING
			    "node_cpuid[%d] is too small, may not be able to use all cpus\n",
			    ARRAY_SIZE(node_cpuid));
		return;
	}
	pxm = get_processor_proximity_domain(pa);
	pxm = get_processor_proximity_domain(pa);


	/* record this node in proximity bitmap */
	/* record this node in proximity bitmap */
+1 −1
Original line number Original line Diff line number Diff line
@@ -633,7 +633,7 @@ ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action)
	BUG_ON(bind_irq_vector(irq, vec, CPU_MASK_ALL));
	BUG_ON(bind_irq_vector(irq, vec, CPU_MASK_ALL));
	desc = irq_desc + irq;
	desc = irq_desc + irq;
	desc->status |= IRQ_PER_CPU;
	desc->status |= IRQ_PER_CPU;
	desc->chip = &irq_type_ia64_lsapic;
	set_irq_chip(irq, &irq_type_ia64_lsapic);
	if (action)
	if (action)
		setup_irq(irq, action);
		setup_irq(irq, action);
	set_irq_handler(irq, handle_percpu_irq);
	set_irq_handler(irq, handle_percpu_irq);
+1 −2
Original line number Original line Diff line number Diff line
@@ -829,10 +829,9 @@ pfm_rvmalloc(unsigned long size)
	unsigned long addr;
	unsigned long addr;


	size = PAGE_ALIGN(size);
	size = PAGE_ALIGN(size);
	mem  = vmalloc(size);
	mem  = vzalloc(size);
	if (mem) {
	if (mem) {
		//printk("perfmon: CPU%d pfm_rvmalloc(%ld)=%p\n", smp_processor_id(), size, mem);
		//printk("perfmon: CPU%d pfm_rvmalloc(%ld)=%p\n", smp_processor_id(), size, mem);
		memset(mem, 0, size);
		addr = (unsigned long)mem;
		addr = (unsigned long)mem;
		while (size > 0) {
		while (size > 0) {
			pfm_reserve_page(addr);
			pfm_reserve_page(addr);
+10 −3
Original line number Original line Diff line number Diff line
@@ -293,6 +293,7 @@ smp_flush_tlb_all (void)
void
void
smp_flush_tlb_mm (struct mm_struct *mm)
smp_flush_tlb_mm (struct mm_struct *mm)
{
{
	cpumask_var_t cpus;
	preempt_disable();
	preempt_disable();
	/* this happens for the common case of a single-threaded fork():  */
	/* this happens for the common case of a single-threaded fork():  */
	if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1))
	if (likely(mm == current->active_mm && atomic_read(&mm->mm_users) == 1))
@@ -301,9 +302,15 @@ smp_flush_tlb_mm (struct mm_struct *mm)
		preempt_enable();
		preempt_enable();
		return;
		return;
	}
	}

	if (!alloc_cpumask_var(&cpus, GFP_ATOMIC)) {
	smp_call_function_many(mm_cpumask(mm),
		smp_call_function((void (*)(void *))local_finish_flush_tlb_mm,
			mm, 1);
	} else {
		cpumask_copy(cpus, mm_cpumask(mm));
		smp_call_function_many(cpus,
			(void (*)(void *))local_finish_flush_tlb_mm, mm, 1);
			(void (*)(void *))local_finish_flush_tlb_mm, mm, 1);
		free_cpumask_var(cpus);
	}
	local_irq_disable();
	local_irq_disable();
	local_finish_flush_tlb_mm(mm);
	local_finish_flush_tlb_mm(mm);
	local_irq_enable();
	local_irq_enable();
+1 −1
Original line number Original line Diff line number Diff line
@@ -168,7 +168,7 @@ timer_interrupt (int irq, void *dev_id)
{
{
	unsigned long new_itm;
	unsigned long new_itm;


	if (unlikely(cpu_is_offline(smp_processor_id()))) {
	if (cpu_is_offline(smp_processor_id())) {
		return IRQ_HANDLED;
		return IRQ_HANDLED;
	}
	}