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

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
...@@ -151,6 +151,8 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq); ...@@ -151,6 +151,8 @@ static DECLARE_WAIT_QUEUE_HEAD(balloon_wq);
static void balloon_process(struct work_struct *work); static void balloon_process(struct work_struct *work);
static DECLARE_DELAYED_WORK(balloon_worker, balloon_process); 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 /* 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. */ want the kernel to try too hard since that can trigger the oom killer. */
#define GFP_BALLOON \ #define GFP_BALLOON \
...@@ -267,6 +269,20 @@ static struct resource *additional_memory_resource(phys_addr_t size) ...@@ -267,6 +269,20 @@ static struct resource *additional_memory_resource(phys_addr_t size)
return NULL; 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; return res;
} }
......
...@@ -316,7 +316,6 @@ static int evtchn_resize_ring(struct per_user_data *u) ...@@ -316,7 +316,6 @@ static int evtchn_resize_ring(struct per_user_data *u)
{ {
unsigned int new_size; unsigned int new_size;
evtchn_port_t *new_ring, *old_ring; evtchn_port_t *new_ring, *old_ring;
unsigned int p, c;
/* /*
* Ensure the ring is large enough to capture all possible * Ensure the ring is large enough to capture all possible
...@@ -346,20 +345,17 @@ static int evtchn_resize_ring(struct per_user_data *u) ...@@ -346,20 +345,17 @@ static int evtchn_resize_ring(struct per_user_data *u)
/* /*
* Copy the old ring contents to the new ring. * Copy the old ring contents to the new ring.
* *
* If the ring contents crosses the end of the current ring, * To take care of wrapping, a full ring, and the new index
* it needs to be copied in two chunks. * pointing into the second half, simply copy the old contents
* twice.
* *
* +---------+ +------------------+ * +---------+ +------------------+
* |34567 12| -> | 1234567 | * |34567 12| -> |34567 1234567 12|
* +-----p-c-+ +------------------+ * +-----p-c-+ +-------c------p---+
*/ */
p = evtchn_ring_offset(u, u->ring_prod); memcpy(new_ring, old_ring, u->ring_size * sizeof(*u->ring));
c = evtchn_ring_offset(u, u->ring_cons); memcpy(new_ring + u->ring_size, old_ring,
if (p < c) { u->ring_size * sizeof(*u->ring));
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));
u->ring = new_ring; u->ring = new_ring;
u->ring_size = new_size; u->ring_size = new_size;
......
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
*/ */
#define xen_pfn_to_page(xen_pfn) \ #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) \ #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) #define XEN_PFN_PER_PAGE (PAGE_SIZE / XEN_PAGE_SIZE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment