diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-10 16:56:56 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-10 16:56:56 -0500 |
| commit | bdccc4edeb03ad68c55053b0260bdaaac547bbd9 (patch) | |
| tree | c9fdce7c6bb13632f5a64925a1fb3fa306b7cfe1 | |
| parent | 98368ab436538103a557fc1f15f54afd8aab6712 (diff) | |
| parent | 72978b2fe2f2cdf9f319c6c6dcdbe92b38de2be2 (diff) | |
Merge tag 'stable/for-linus-3.20-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip
Pull xen features and fixes from David Vrabel:
- Reworked handling for foreign (grant mapped) pages to simplify the
code, enable a number of additional use cases and fix a number of
long-standing bugs.
- Prefer the TSC over the Xen PV clock when dom0 (and the TSC is
stable).
- Assorted other cleanup and minor bug fixes.
* tag 'stable/for-linus-3.20-rc0-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: (25 commits)
xen/manage: Fix USB interaction issues when resuming
xenbus: Add proper handling of XS_ERROR from Xenbus for transactions.
xen/gntdev: provide find_special_page VMA operation
xen/gntdev: mark userspace PTEs as special on x86 PV guests
xen-blkback: safely unmap grants in case they are still in use
xen/gntdev: safely unmap grants in case they are still in use
xen/gntdev: convert priv->lock to a mutex
xen/grant-table: add a mechanism to safely unmap pages that are in use
xen-netback: use foreign page information from the pages themselves
xen: mark grant mapped pages as foreign
xen/grant-table: add helpers for allocating pages
x86/xen: require ballooned pages for grant maps
xen: remove scratch frames for ballooned pages and m2p override
xen/grant-table: pre-populate kernel unmap ops for xen_gnttab_unmap_refs()
mm: add 'foreign' alias for the 'pinned' page flag
mm: provide a find_special_page vma operation
x86/xen: cleanup arch/x86/xen/mmu.c
x86/xen: add some __init annotations in arch/x86/xen/mmu.c
x86/xen: add some __init and static annotations in arch/x86/xen/setup.c
x86/xen: use correct types for addresses in arch/x86/xen/setup.c
...
28 files changed, 509 insertions, 594 deletions
diff --git a/arch/arm/include/asm/xen/page.h b/arch/arm/include/asm/xen/page.h index 68c739b3fdf4..2f7e6ff67d51 100644 --- a/arch/arm/include/asm/xen/page.h +++ b/arch/arm/include/asm/xen/page.h | |||
| @@ -92,7 +92,7 @@ extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, | |||
| 92 | struct page **pages, unsigned int count); | 92 | struct page **pages, unsigned int count); |
| 93 | 93 | ||
| 94 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | 94 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, |
| 95 | struct gnttab_map_grant_ref *kmap_ops, | 95 | struct gnttab_unmap_grant_ref *kunmap_ops, |
| 96 | struct page **pages, unsigned int count); | 96 | struct page **pages, unsigned int count); |
| 97 | 97 | ||
| 98 | bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); | 98 | bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); |
diff --git a/arch/arm/xen/enlighten.c b/arch/arm/xen/enlighten.c index c7ca936ebd99..263a2044c65b 100644 --- a/arch/arm/xen/enlighten.c +++ b/arch/arm/xen/enlighten.c | |||
| @@ -29,10 +29,10 @@ | |||
| 29 | 29 | ||
| 30 | struct start_info _xen_start_info; | 30 | struct start_info _xen_start_info; |
| 31 | struct start_info *xen_start_info = &_xen_start_info; | 31 | struct start_info *xen_start_info = &_xen_start_info; |
| 32 | EXPORT_SYMBOL_GPL(xen_start_info); | 32 | EXPORT_SYMBOL(xen_start_info); |
| 33 | 33 | ||
| 34 | enum xen_domain_type xen_domain_type = XEN_NATIVE; | 34 | enum xen_domain_type xen_domain_type = XEN_NATIVE; |
| 35 | EXPORT_SYMBOL_GPL(xen_domain_type); | 35 | EXPORT_SYMBOL(xen_domain_type); |
| 36 | 36 | ||
| 37 | struct shared_info xen_dummy_shared_info; | 37 | struct shared_info xen_dummy_shared_info; |
| 38 | struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; | 38 | struct shared_info *HYPERVISOR_shared_info = (void *)&xen_dummy_shared_info; |
diff --git a/arch/arm/xen/mm.c b/arch/arm/xen/mm.c index 351b24a979d4..793551d15f1d 100644 --- a/arch/arm/xen/mm.c +++ b/arch/arm/xen/mm.c | |||
| @@ -149,7 +149,7 @@ void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order) | |||
| 149 | EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); | 149 | EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region); |
| 150 | 150 | ||
| 151 | struct dma_map_ops *xen_dma_ops; | 151 | struct dma_map_ops *xen_dma_ops; |
| 152 | EXPORT_SYMBOL_GPL(xen_dma_ops); | 152 | EXPORT_SYMBOL(xen_dma_ops); |
| 153 | 153 | ||
| 154 | static struct dma_map_ops xen_swiotlb_dma_ops = { | 154 | static struct dma_map_ops xen_swiotlb_dma_ops = { |
| 155 | .mapping_error = xen_swiotlb_dma_mapping_error, | 155 | .mapping_error = xen_swiotlb_dma_mapping_error, |
diff --git a/arch/arm/xen/p2m.c b/arch/arm/xen/p2m.c index 054857776254..cb7a14c5cd69 100644 --- a/arch/arm/xen/p2m.c +++ b/arch/arm/xen/p2m.c | |||
| @@ -102,7 +102,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, | |||
| 102 | EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping); | 102 | EXPORT_SYMBOL_GPL(set_foreign_p2m_mapping); |
| 103 | 103 | ||
| 104 | int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | 104 | int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, |
| 105 | struct gnttab_map_grant_ref *kmap_ops, | 105 | struct gnttab_unmap_grant_ref *kunmap_ops, |
| 106 | struct page **pages, unsigned int count) | 106 | struct page **pages, unsigned int count) |
| 107 | { | 107 | { |
| 108 | int i; | 108 | int i; |
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 5eea09915a15..358dcd338915 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h | |||
| @@ -55,9 +55,8 @@ extern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, | |||
| 55 | struct gnttab_map_grant_ref *kmap_ops, | 55 | struct gnttab_map_grant_ref *kmap_ops, |
| 56 | struct page **pages, unsigned int count); | 56 | struct page **pages, unsigned int count); |
| 57 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, | 57 | extern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, |
| 58 | struct gnttab_map_grant_ref *kmap_ops, | 58 | struct gnttab_unmap_grant_ref *kunmap_ops, |
| 59 | struct page **pages, unsigned int count); | 59 | struct page **pages, unsigned int count); |
| 60 | extern unsigned long m2p_find_override_pfn(unsigned long mfn, unsigned long pfn); | ||
| 61 | 60 | ||
| 62 | /* | 61 | /* |
| 63 | * Helper functions to write or read unsigned long values to/from | 62 | * Helper functions to write or read unsigned long values to/from |
| @@ -154,21 +153,12 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn) | |||
| 154 | return mfn; | 153 | return mfn; |
| 155 | 154 | ||
| 156 | pfn = mfn_to_pfn_no_overrides(mfn); | 155 | pfn = mfn_to_pfn_no_overrides(mfn); |
| 157 | if (__pfn_to_mfn(pfn) != mfn) { | 156 | if (__pfn_to_mfn(pfn) != mfn) |
| 158 | /* | 157 | pfn = ~0; |
| 159 | * If this appears to be a foreign mfn (because the pfn | ||
| 160 | * doesn't map back to the mfn), then check the local override | ||
| 161 | * table to see if there's a better pfn to use. | ||
| 162 | * | ||
| 163 | * m2p_find_override_pfn returns ~0 if it doesn't find anything. | ||
| 164 | */ | ||
| 165 | pfn = m2p_find_override_pfn(mfn, ~0); | ||
| 166 | } | ||
| 167 | 158 | ||
| 168 | /* | 159 | /* |
| 169 | * pfn is ~0 if there are no entries in the m2p for mfn or if the | 160 | * pfn is ~0 if there are no entries in the m2p for mfn or the |
| 170 | * entry doesn't map back to the mfn and m2p_override doesn't have a | 161 | * entry doesn't map back to the mfn. |
| 171 | * valid entry for it. | ||
| 172 | */ | 162 | */ |
| 173 | if (pfn == ~0 && __pfn_to_mfn(mfn) == IDENTITY_FRAME(mfn)) | 163 | if (pfn == ~0 && __pfn_to_mfn(mfn) == IDENTITY_FRAME(mfn)) |
| 174 | pfn = mfn; | 164 | pfn = mfn; |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 5c1f9ace7ae7..adca9e2b6553 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1489,7 +1489,7 @@ static void __init xen_set_pte_init(pte_t *ptep, pte_t pte) | |||
| 1489 | native_set_pte(ptep, pte); | 1489 | native_set_pte(ptep, pte); |
| 1490 | } | 1490 | } |
| 1491 | 1491 | ||
| 1492 | static void pin_pagetable_pfn(unsigned cmd, unsigned long pfn) | 1492 | static void __init pin_pagetable_pfn(unsigned cmd, unsigned long pfn) |
| 1493 | { | 1493 | { |
| 1494 | struct mmuext_op op; | 1494 | struct mmuext_op op; |
| 1495 | op.cmd = cmd; | 1495 | op.cmd = cmd; |
| @@ -1657,7 +1657,7 @@ void __init xen_reserve_top(void) | |||
| 1657 | * Like __va(), but returns address in the kernel mapping (which is | 1657 | * Like __va(), but returns address in the kernel mapping (which is |
| 1658 | * all we have until the physical memory mapping has been set up. | 1658 | * all we have until the physical memory mapping has been set up. |
| 1659 | */ | 1659 | */ |
| 1660 | static void *__ka(phys_addr_t paddr) | 1660 | static void * __init __ka(phys_addr_t paddr) |
| 1661 | { | 1661 | { |
| 1662 | #ifdef CONFIG_X86_64 | 1662 | #ifdef CONFIG_X86_64 |
| 1663 | return (void *)(paddr + __START_KERNEL_map); | 1663 | return (void *)(paddr + __START_KERNEL_map); |
| @@ -1667,7 +1667,7 @@ static void *__ka(phys_addr_t paddr) | |||
| 1667 | } | 1667 | } |
| 1668 | 1668 | ||
| 1669 | /* Convert a machine address to physical address */ | 1669 | /* Convert a machine address to physical address */ |
| 1670 | static unsigned long m2p(phys_addr_t maddr) | 1670 | static unsigned long __init m2p(phys_addr_t maddr) |
| 1671 | { | 1671 | { |
| 1672 | phys_addr_t paddr; | 1672 | phys_addr_t paddr; |
| 1673 | 1673 | ||
| @@ -1678,13 +1678,14 @@ static unsigned long m2p(phys_addr_t maddr) | |||
| 1678 | } | 1678 | } |
| 1679 | 1679 | ||
| 1680 | /* Convert a machine address to kernel virtual */ | 1680 | /* Convert a machine address to kernel virtual */ |
| 1681 | static void *m2v(phys_addr_t maddr) | 1681 | static void * __init m2v(phys_addr_t maddr) |
| 1682 | { | 1682 | { |
| 1683 | return __ka(m2p(maddr)); | 1683 | return __ka(m2p(maddr)); |
| 1684 | } | 1684 | } |
| 1685 | 1685 | ||
| 1686 | /* Set the page permissions on an identity-mapped pages */ | 1686 | /* Set the page permissions on an identity-mapped pages */ |
| 1687 | static void set_page_prot_flags(void *addr, pgprot_t prot, unsigned long flags) | 1687 | static void __init set_page_prot_flags(void *addr, pgprot_t prot, |
| 1688 | unsigned long flags) | ||
| 1688 | { | 1689 | { |
| 1689 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | 1690 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; |
| 1690 | pte_t pte = pfn_pte(pfn, prot); | 1691 | pte_t pte = pfn_pte(pfn, prot); |
| @@ -1696,7 +1697,7 @@ static void set_page_prot_flags(void *addr, pgprot_t prot, unsigned long flags) | |||
