aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/xen
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-09-12 14:28:24 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-12 14:28:24 -0400
commitd5adf7e2db897f9d4a00be59262875ae5d9574f4 (patch)
treec6417bfea552f653d5639b4696a5ac987cd7bc40 /drivers/xen
parent02b9735c12892e04d3e101b06e4c6d64a814f566 (diff)
parent6a6f6e72eca5ed999689c69d1ac411fe319844a0 (diff)
Merge tag 'stable/for-linus-3.12-rc0-tag-three' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull Xen balloon driver bug-fixes from Stefano Stabellini: - fix a preemption bug in xen/balloon.c; - remove an harmful BUG_ON in xen/balloon.c that can trigger in non-erroneous situations. * tag 'stable/for-linus-3.12-rc0-tag-three' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: xen/balloon: remove BUG_ON in increase_reservation xen/balloon: ensure preemption is disabled when using a scratch page
Diffstat (limited to 'drivers/xen')
-rw-r--r--drivers/xen/balloon.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c
index 3101cf6daf56..a50c6e3a7cc4 100644
--- a/drivers/xen/balloon.c
+++ b/drivers/xen/balloon.c
@@ -349,8 +349,6 @@ static enum bp_state increase_reservation(unsigned long nr_pages)
349 BUG_ON(page == NULL); 349 BUG_ON(page == NULL);
350 350
351 pfn = page_to_pfn(page); 351 pfn = page_to_pfn(page);
352 BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) &&
353 phys_to_machine_mapping_valid(pfn));
354 352
355 set_phys_to_machine(pfn, frame_list[i]); 353 set_phys_to_machine(pfn, frame_list[i]);
356 354
@@ -380,6 +378,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
380 enum bp_state state = BP_DONE; 378 enum bp_state state = BP_DONE;
381 unsigned long pfn, i; 379 unsigned long pfn, i;
382 struct page *page; 380 struct page *page;
381 struct page *scratch_page;
383 int ret; 382 int ret;
384 struct xen_memory_reservation reservation = { 383 struct xen_memory_reservation reservation = {
385 .address_bits = 0, 384 .address_bits = 0,
@@ -399,6 +398,8 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
399 if (nr_pages > ARRAY_SIZE(frame_list)) 398 if (nr_pages > ARRAY_SIZE(frame_list))
400 nr_pages = ARRAY_SIZE(frame_list); 399 nr_pages = ARRAY_SIZE(frame_list);
401 400
401 scratch_page = get_balloon_scratch_page();
402
402 for (i = 0; i < nr_pages; i++) { 403 for (i = 0; i < nr_pages; i++) {
403 page = alloc_page(gfp); 404 page = alloc_page(gfp);
404 if (page == NULL) { 405 if (page == NULL) {
@@ -416,7 +417,7 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
416 if (xen_pv_domain() && !PageHighMem(page)) { 417 if (xen_pv_domain() && !PageHighMem(page)) {
417 ret = HYPERVISOR_update_va_mapping( 418 ret = HYPERVISOR_update_va_mapping(
418 (unsigned long)__va(pfn << PAGE_SHIFT), 419 (unsigned long)__va(pfn << PAGE_SHIFT),
419 pfn_pte(page_to_pfn(__get_cpu_var(balloon_scratch_page)), 420 pfn_pte(page_to_pfn(scratch_page),
420 PAGE_KERNEL_RO), 0); 421 PAGE_KERNEL_RO), 0);
421 BUG_ON(ret); 422 BUG_ON(ret);
422 } 423 }
@@ -432,14 +433,14 @@ static enum bp_state decrease_reservation(unsigned long nr_pages, gfp_t gfp)
432 pfn = mfn_to_pfn(frame_list[i]); 433 pfn = mfn_to_pfn(frame_list[i]);
433 if (!xen_feature(XENFEAT_auto_translated_physmap)) { 434 if (!xen_feature(XENFEAT_auto_translated_physmap)) {
434 unsigned long p; 435 unsigned long p;
435 struct page *pg; 436 p = page_to_pfn(scratch_page);
436 pg = __get_cpu_var(balloon_scratch_page);
437 p = page_to_pfn(pg);
438 __set_phys_to_machine(pfn, pfn_to_mfn(p)); 437 __set_phys_to_machine(pfn, pfn_to_mfn(p));
439 } 438 }
440 balloon_append(pfn_to_page(pfn)); 439 balloon_append(pfn_to_page(pfn));
441 } 440 }
442 441
442 put_balloon_scratch_page();
443
443 set_xen_guest_handle(reservation.extent_start, frame_list); 444 set_xen_guest_handle(reservation.extent_start, frame_list);
444 reservation.nr_extents = nr_pages; 445 reservation.nr_extents = nr_pages;
445 ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation); 446 ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);