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

Commit 41143b77 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'for-linus-4.6-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen regression fixes from David Vrabel:

 - Fix two regressions causing crashes in 32-bit PV guests

 - Fix a regression in the evtchn driver

* tag 'for-linus-4.6-rc6-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/evtchn: fix ring resize when binding new events
  xen/balloon: Fix crash when ballooning on x86 32 bit PAE
  xen: Fix page <-> pfn conversion on 32 bit systems
parents 83858a70 27e0e638
Loading
Loading
Loading
Loading
+16 −0
Original line number Diff line number Diff line
@@ -151,6 +151,8 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
static void balloon_process(struct work_struct *work);
static DECLARE_DELAYED_WORK(balloon_worker, balloon_process);

static void release_memory_resource(struct resource *resource);

/* When ballooning out (allocating memory to return to Xen) we don't really
   want the kernel to try too hard since that can trigger the oom killer. */
#define GFP_BALLOON \
@@ -267,6 +269,20 @@ static struct resource *additional_memory_resource(phys_addr_t size)
		return NULL;
	}

#ifdef CONFIG_SPARSEMEM
	{
		unsigned long limit = 1UL << (MAX_PHYSMEM_BITS - PAGE_SHIFT);
		unsigned long pfn = res->start >> PAGE_SHIFT;

		if (pfn > limit) {
			pr_err("New System RAM resource outside addressable RAM (%lu > %lu)\n",
			       pfn, limit);
			release_memory_resource(res);
			return NULL;
		}
	}
#endif

	return res;
}

+8 −12
Original line number Diff line number Diff line
@@ -316,7 +316,6 @@ static int evtchn_resize_ring(struct per_user_data *u)
{
	unsigned int new_size;
	evtchn_port_t *new_ring, *old_ring;
	unsigned int p, c;

	/*
	 * Ensure the ring is large enough to capture all possible
@@ -346,20 +345,17 @@ static int evtchn_resize_ring(struct per_user_data *u)
	/*
	 * Copy the old ring contents to the new ring.
	 *
	 * If the ring contents crosses the end of the current ring,
	 * it needs to be copied in two chunks.
	 * To take care of wrapping, a full ring, and the new index
	 * pointing into the second half, simply copy the old contents
	 * twice.
	 *
	 * +---------+    +------------------+
	 * |34567  12| -> |       1234567    |
	 * +-----p-c-+    +------------------+
	 * |34567  12| -> |34567  1234567  12|
	 * +-----p-c-+    +-------c------p---+
	 */
	p = evtchn_ring_offset(u, u->ring_prod);
	c = evtchn_ring_offset(u, u->ring_cons);
	if (p < c) {
		memcpy(new_ring + c, u->ring + c, (u->ring_size - c) * sizeof(*u->ring));
		memcpy(new_ring + u->ring_size, u->ring, p * sizeof(*u->ring));
	} else
		memcpy(new_ring + c, u->ring + c, (p - c) * sizeof(*u->ring));
	memcpy(new_ring, old_ring, u->ring_size * sizeof(*u->ring));
	memcpy(new_ring + u->ring_size, old_ring,
	       u->ring_size * sizeof(*u->ring));

	u->ring = new_ring;
	u->ring_size = new_size;
+2 −2
Original line number Diff line number Diff line
@@ -15,9 +15,9 @@
 */

#define xen_pfn_to_page(xen_pfn)	\
	((pfn_to_page(((unsigned long)(xen_pfn) << XEN_PAGE_SHIFT) >> PAGE_SHIFT)))
	(pfn_to_page((unsigned long)(xen_pfn) >> (PAGE_SHIFT - XEN_PAGE_SHIFT)))
#define page_to_xen_pfn(page)		\
	(((page_to_pfn(page)) << PAGE_SHIFT) >> XEN_PAGE_SHIFT)
	((page_to_pfn(page)) << (PAGE_SHIFT - XEN_PAGE_SHIFT))

#define XEN_PFN_PER_PAGE	(PAGE_SIZE / XEN_PAGE_SIZE)