Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus-4.14b-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes from Juergen Gross:
"A fix for a missing __init annotation and two cleanup patches"

* tag 'for-linus-4.14b-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
xen, arm64: drop dummy lookup_address()
xen: don't compile pv-specific parts if XEN_PV isn't configured
xen: x86: mark xen_find_pt_base as __init

+68 -74
+1 -1
arch/x86/xen/mmu_pv.c
··· 2220 2220 * not the first page table in the page table pool. 2221 2221 * Iterate through the initial page tables to find the real page table base. 2222 2222 */ 2223 - static phys_addr_t xen_find_pt_base(pmd_t *pmd) 2223 + static phys_addr_t __init xen_find_pt_base(pmd_t *pmd) 2224 2224 { 2225 2225 phys_addr_t pt_base, paddr; 2226 2226 unsigned pmdidx;
+67 -63
drivers/xen/xenbus/xenbus_client.c
··· 519 519 return err; 520 520 } 521 521 522 - static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev, 523 - grant_ref_t *gnt_refs, 524 - unsigned int nr_grefs, 525 - void **vaddr) 526 - { 527 - struct xenbus_map_node *node; 528 - struct vm_struct *area; 529 - pte_t *ptes[XENBUS_MAX_RING_GRANTS]; 530 - phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS]; 531 - int err = GNTST_okay; 532 - int i; 533 - bool leaked; 534 - 535 - *vaddr = NULL; 536 - 537 - if (nr_grefs > XENBUS_MAX_RING_GRANTS) 538 - return -EINVAL; 539 - 540 - node = kzalloc(sizeof(*node), GFP_KERNEL); 541 - if (!node) 542 - return -ENOMEM; 543 - 544 - area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes); 545 - if (!area) { 546 - kfree(node); 547 - return -ENOMEM; 548 - } 549 - 550 - for (i = 0; i < nr_grefs; i++) 551 - phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr; 552 - 553 - err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles, 554 - phys_addrs, 555 - GNTMAP_host_map | GNTMAP_contains_pte, 556 - &leaked); 557 - if (err) 558 - goto failed; 559 - 560 - node->nr_handles = nr_grefs; 561 - node->pv.area = area; 562 - 563 - spin_lock(&xenbus_valloc_lock); 564 - list_add(&node->next, &xenbus_valloc_pages); 565 - spin_unlock(&xenbus_valloc_lock); 566 - 567 - *vaddr = area->addr; 568 - return 0; 569 - 570 - failed: 571 - if (!leaked) 572 - free_vm_area(area); 573 - else 574 - pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs); 575 - 576 - kfree(node); 577 - return err; 578 - } 579 - 580 522 struct map_ring_valloc_hvm 581 523 { 582 524 unsigned int idx; ··· 667 725 } 668 726 EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree); 669 727 728 + #ifdef CONFIG_XEN_PV 729 + static int xenbus_map_ring_valloc_pv(struct xenbus_device *dev, 730 + grant_ref_t *gnt_refs, 731 + unsigned int nr_grefs, 732 + void **vaddr) 733 + { 734 + struct xenbus_map_node *node; 735 + struct vm_struct *area; 736 + pte_t *ptes[XENBUS_MAX_RING_GRANTS]; 737 + phys_addr_t phys_addrs[XENBUS_MAX_RING_GRANTS]; 738 + int err = GNTST_okay; 739 + int i; 740 + bool leaked; 741 + 742 + *vaddr = NULL; 743 + 744 + if (nr_grefs > XENBUS_MAX_RING_GRANTS) 745 + return -EINVAL; 746 + 747 + node = kzalloc(sizeof(*node), GFP_KERNEL); 748 + if (!node) 749 + return -ENOMEM; 750 + 751 + area = alloc_vm_area(XEN_PAGE_SIZE * nr_grefs, ptes); 752 + if (!area) { 753 + kfree(node); 754 + return -ENOMEM; 755 + } 756 + 757 + for (i = 0; i < nr_grefs; i++) 758 + phys_addrs[i] = arbitrary_virt_to_machine(ptes[i]).maddr; 759 + 760 + err = __xenbus_map_ring(dev, gnt_refs, nr_grefs, node->handles, 761 + phys_addrs, 762 + GNTMAP_host_map | GNTMAP_contains_pte, 763 + &leaked); 764 + if (err) 765 + goto failed; 766 + 767 + node->nr_handles = nr_grefs; 768 + node->pv.area = area; 769 + 770 + spin_lock(&xenbus_valloc_lock); 771 + list_add(&node->next, &xenbus_valloc_pages); 772 + spin_unlock(&xenbus_valloc_lock); 773 + 774 + *vaddr = area->addr; 775 + return 0; 776 + 777 + failed: 778 + if (!leaked) 779 + free_vm_area(area); 780 + else 781 + pr_alert("leaking VM area %p size %u page(s)", area, nr_grefs); 782 + 783 + kfree(node); 784 + return err; 785 + } 786 + 670 787 static int xenbus_unmap_ring_vfree_pv(struct xenbus_device *dev, void *vaddr) 671 788 { 672 789 struct xenbus_map_node *node; ··· 788 787 kfree(node); 789 788 return err; 790 789 } 790 + 791 + static const struct xenbus_ring_ops ring_ops_pv = { 792 + .map = xenbus_map_ring_valloc_pv, 793 + .unmap = xenbus_unmap_ring_vfree_pv, 794 + }; 795 + #endif 791 796 792 797 struct unmap_ring_vfree_hvm 793 798 { ··· 923 916 } 924 917 EXPORT_SYMBOL_GPL(xenbus_read_driver_state); 925 918 926 - static const struct xenbus_ring_ops ring_ops_pv = { 927 - .map = xenbus_map_ring_valloc_pv, 928 - .unmap = xenbus_unmap_ring_vfree_pv, 929 - }; 930 - 931 919 static const struct xenbus_ring_ops ring_ops_hvm = { 932 920 .map = xenbus_map_ring_valloc_hvm, 933 921 .unmap = xenbus_unmap_ring_vfree_hvm, ··· 930 928 931 929 void __init xenbus_ring_ops_init(void) 932 930 { 931 + #ifdef CONFIG_XEN_PV 933 932 if (!xen_feature(XENFEAT_auto_translated_physmap)) 934 933 ring_ops = &ring_ops_pv; 935 934 else 935 + #endif 936 936 ring_ops = &ring_ops_hvm; 937 937 }
-10
include/xen/arm/page.h
··· 84 84 BUG(); 85 85 } 86 86 87 - /* TODO: this shouldn't be here but it is because the frontend drivers 88 - * are using it (its rolled in headers) even though we won't hit the code path. 89 - * So for right now just punt with this. 90 - */ 91 - static inline pte_t *lookup_address(unsigned long address, unsigned int *level) 92 - { 93 - BUG(); 94 - return NULL; 95 - } 96 - 97 87 extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, 98 88 struct gnttab_map_grant_ref *kmap_ops, 99 89 struct page **pages, unsigned int count);