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

Commit 8338fded authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branches 'upstream/core' and 'upstream/bugfix' of...

Merge branches 'upstream/core' and 'upstream/bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen

* 'upstream/core' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen:
  xen: allocate irq descs on any NUMA node
  xen: prevent crashes with non-HIGHMEM 32-bit kernels with largeish memory
  xen: use default_idle
  xen: clean up "extra" memory handling some more

* 'upstream/bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen:
  xen: x86/32: perform initial startup on initial_page_table
  xen: don't bother to stop other cpus on shutdown/reboot
Loading
Loading
Loading
Loading
+0 −4
Original line number Original line Diff line number Diff line
@@ -1021,10 +1021,6 @@ static void xen_reboot(int reason)
{
{
	struct sched_shutdown r = { .reason = reason };
	struct sched_shutdown r = { .reason = reason };


#ifdef CONFIG_SMP
	stop_other_cpus();
#endif

	if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
	if (HYPERVISOR_sched_op(SCHEDOP_shutdown, &r))
		BUG();
		BUG();
}
}
+14 −27
Original line number Original line Diff line number Diff line
@@ -181,24 +181,21 @@ char * __init xen_memory_setup(void)
	for (i = 0; i < memmap.nr_entries; i++) {
	for (i = 0; i < memmap.nr_entries; i++) {
		unsigned long long end = map[i].addr + map[i].size;
		unsigned long long end = map[i].addr + map[i].size;


		if (map[i].type == E820_RAM) {
		if (map[i].type == E820_RAM && end > mem_end) {
			if (map[i].addr < mem_end && end > mem_end) {
			/* RAM off the end - may be partially included */
				/* Truncate region to max_mem. */
			u64 delta = min(map[i].size, end - mem_end);
				u64 delta = end - mem_end;


			map[i].size -= delta;
			map[i].size -= delta;
				extra_pages += PFN_DOWN(delta);
			end -= delta;


				end = mem_end;
			extra_pages += PFN_DOWN(delta);
			}
		}
		}


		if (end > xen_extra_mem_start)
		if (map[i].size > 0 && end > xen_extra_mem_start)
			xen_extra_mem_start = end;
			xen_extra_mem_start = end;


		/* If region is non-RAM or below mem_end, add what remains */
		/* Add region if any remains */
		if ((map[i].type != E820_RAM || map[i].addr < mem_end) &&
		if (map[i].size > 0)
		    map[i].size > 0)
			e820_add_region(map[i].addr, map[i].size, map[i].type);
			e820_add_region(map[i].addr, map[i].size, map[i].type);
	}
	}


@@ -252,20 +249,6 @@ char * __init xen_memory_setup(void)
	return "Xen";
	return "Xen";
}
}


static void xen_idle(void)
{
	local_irq_disable();

	if (need_resched())
		local_irq_enable();
	else {
		current_thread_info()->status &= ~TS_POLLING;
		smp_mb__after_clear_bit();
		safe_halt();
		current_thread_info()->status |= TS_POLLING;
	}
}

/*
/*
 * Set the bit indicating "nosegneg" library variants should be used.
 * Set the bit indicating "nosegneg" library variants should be used.
 * We only need to bother in pure 32-bit mode; compat 32-bit processes
 * We only need to bother in pure 32-bit mode; compat 32-bit processes
@@ -362,7 +345,11 @@ void __init xen_arch_setup(void)
	       MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
	       MAX_GUEST_CMDLINE > COMMAND_LINE_SIZE ?
	       COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);
	       COMMAND_LINE_SIZE : MAX_GUEST_CMDLINE);


	pm_idle = xen_idle;
	/* Set up idle, making sure it calls safe_halt() pvop */
#ifdef CONFIG_X86_32
	boot_cpu_data.hlt_works_ok = 1;
#endif
	pm_idle = default_idle;


	fiddle_vdso();
	fiddle_vdso();
}
}
+10 −2
Original line number Original line Diff line number Diff line
@@ -412,8 +412,16 @@ static int __init balloon_init(void)


	register_balloon(&balloon_sysdev);
	register_balloon(&balloon_sysdev);


	/* Initialise the balloon with excess memory space. */
	/*
	extra_pfn_end = min(e820_end_of_ram_pfn(),
	 * Initialise the balloon with excess memory space.  We need
	 * to make sure we don't add memory which doesn't exist or
	 * logically exist.  The E820 map can be trimmed to be smaller
	 * than the amount of physical memory due to the mem= command
	 * line parameter.  And if this is a 32-bit non-HIGHMEM kernel
	 * on a system with memory which requires highmem to access,
	 * don't try to use it.
	 */
	extra_pfn_end = min(min(max_pfn, e820_end_of_ram_pfn()),
			    (unsigned long)PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size));
			    (unsigned long)PFN_DOWN(xen_extra_mem_start + xen_extra_mem_size));
	for (pfn = PFN_UP(xen_extra_mem_start);
	for (pfn = PFN_UP(xen_extra_mem_start);
	     pfn < extra_pfn_end;
	     pfn < extra_pfn_end;
+2 −2
Original line number Original line Diff line number Diff line
@@ -423,7 +423,7 @@ static int find_unbound_irq(void)
	if (irq == start)
	if (irq == start)
		goto no_irqs;
		goto no_irqs;


	res = irq_alloc_desc_at(irq, 0);
	res = irq_alloc_desc_at(irq, -1);


	if (WARN_ON(res != irq))
	if (WARN_ON(res != irq))
		return -1;
		return -1;
@@ -630,7 +630,7 @@ int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name)
	if (identity_mapped_irq(gsi) || (!xen_initial_domain() &&
	if (identity_mapped_irq(gsi) || (!xen_initial_domain() &&
				xen_pv_domain())) {
				xen_pv_domain())) {
		irq = gsi;
		irq = gsi;
		irq_alloc_desc_at(irq, 0);
		irq_alloc_desc_at(irq, -1);
	} else
	} else
		irq = find_unbound_irq();
		irq = find_unbound_irq();