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 /include | |
| 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
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/linux/mm.h | 8 | ||||
| -rw-r--r-- | include/linux/page-flags.h | 5 | ||||
| -rw-r--r-- | include/xen/grant_table.h | 43 | ||||
| -rw-r--r-- | include/xen/interface/features.h | 6 | ||||
| -rw-r--r-- | include/xen/interface/grant_table.h | 7 |
5 files changed, 68 insertions, 1 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h index dd5ea3016fc4..237b3ba29225 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h | |||
| @@ -290,6 +290,14 @@ struct vm_operations_struct { | |||
| 290 | /* called by sys_remap_file_pages() to populate non-linear mapping */ | 290 | /* called by sys_remap_file_pages() to populate non-linear mapping */ |
| 291 | int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr, | 291 | int (*remap_pages)(struct vm_area_struct *vma, unsigned long addr, |
| 292 | unsigned long size, pgoff_t pgoff); | 292 | unsigned long size, pgoff_t pgoff); |
| 293 | |||
| 294 | /* | ||
| 295 | * Called by vm_normal_page() for special PTEs to find the | ||
| 296 | * page for @addr. This is useful if the default behavior | ||
| 297 | * (using pte_page()) would not find the correct page. | ||
| 298 | */ | ||
| 299 | struct page *(*find_special_page)(struct vm_area_struct *vma, | ||
| 300 | unsigned long addr); | ||
| 293 | }; | 301 | }; |
| 294 | 302 | ||
| 295 | struct mmu_gather; | 303 | struct mmu_gather; |
diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index e1f5fcd79792..5ed7bdaf22d5 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h | |||
| @@ -121,8 +121,12 @@ enum pageflags { | |||
| 121 | PG_fscache = PG_private_2, /* page backed by cache */ | 121 | PG_fscache = PG_private_2, /* page backed by cache */ |
| 122 | 122 | ||
| 123 | /* XEN */ | 123 | /* XEN */ |
| 124 | /* Pinned in Xen as a read-only pagetable page. */ | ||
| 124 | PG_pinned = PG_owner_priv_1, | 125 | PG_pinned = PG_owner_priv_1, |
| 126 | /* Pinned as part of domain save (see xen_mm_pin_all()). */ | ||
| 125 | PG_savepinned = PG_dirty, | 127 | PG_savepinned = PG_dirty, |
| 128 | /* Has a grant mapping of another (foreign) domain's page. */ | ||
| 129 | PG_foreign = PG_owner_priv_1, | ||
| 126 | 130 | ||
| 127 | /* SLOB */ | 131 | /* SLOB */ |
| 128 | PG_slob_free = PG_private, | 132 | PG_slob_free = PG_private, |
| @@ -215,6 +219,7 @@ __PAGEFLAG(Slab, slab) | |||
| 215 | PAGEFLAG(Checked, checked) /* Used by some filesystems */ | 219 | PAGEFLAG(Checked, checked) /* Used by some filesystems */ |
| 216 | PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */ | 220 | PAGEFLAG(Pinned, pinned) TESTSCFLAG(Pinned, pinned) /* Xen */ |
| 217 | PAGEFLAG(SavePinned, savepinned); /* Xen */ | 221 | PAGEFLAG(SavePinned, savepinned); /* Xen */ |
| 222 | PAGEFLAG(Foreign, foreign); /* Xen */ | ||
| 218 | PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved) | 223 | PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved) |
| 219 | PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked) | 224 | PAGEFLAG(SwapBacked, swapbacked) __CLEARPAGEFLAG(SwapBacked, swapbacked) |
| 220 | __SETPAGEFLAG(SwapBacked, swapbacked) | 225 | __SETPAGEFLAG(SwapBacked, swapbacked) |
diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index 3387465b9caa..143ca5ffab7a 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h | |||
| @@ -45,6 +45,8 @@ | |||
| 45 | #include <asm/xen/hypervisor.h> | 45 | #include <asm/xen/hypervisor.h> |
| 46 | 46 | ||
| 47 | #include <xen/features.h> | 47 | #include <xen/features.h> |
| 48 | #include <linux/mm_types.h> | ||
| 49 | #include <linux/page-flags.h> | ||
| 48 | 50 | ||
| 49 | #define GNTTAB_RESERVED_XENSTORE 1 | 51 | #define GNTTAB_RESERVED_XENSTORE 1 |
| 50 | 52 | ||
| @@ -58,6 +60,22 @@ struct gnttab_free_callback { | |||
| 58 | u16 count; | 60 | u16 count; |
| 59 | }; | 61 | }; |
| 60 | 62 | ||
| 63 | struct gntab_unmap_queue_data; | ||
| 64 | |||
| 65 | typedef void (*gnttab_unmap_refs_done)(int result, struct gntab_unmap_queue_data *data); | ||
| 66 | |||
| 67 | struct gntab_unmap_queue_data | ||
| 68 | { | ||
| 69 | struct delayed_work gnttab_work; | ||
| 70 | void *data; | ||
| 71 | gnttab_unmap_refs_done done; | ||
| 72 | struct gnttab_unmap_grant_ref *unmap_ops; | ||
| 73 | struct gnttab_unmap_grant_ref *kunmap_ops; | ||
| 74 | struct page **pages; | ||
| 75 | unsigned int count; | ||
| 76 | unsigned int age; | ||
| 77 | }; | ||
| 78 | |||
| 61 | int gnttab_init(void); | 79 | int gnttab_init(void); |
| 62 | int gnttab_suspend(void); | 80 | int gnttab_suspend(void); |
| 63 | int gnttab_resume(void); | 81 | int gnttab_resume(void); |
| @@ -163,12 +181,17 @@ void gnttab_free_auto_xlat_frames(void); | |||
| 163 | 181 | ||
| 164 | #define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr)) | 182 | #define gnttab_map_vaddr(map) ((void *)(map.host_virt_addr)) |
| 165 | 183 | ||
| 184 | int gnttab_alloc_pages(int nr_pages, struct page **pages); | ||
| 185 | void gnttab_free_pages(int nr_pages, struct page **pages); | ||
| 186 | |||
| 166 | int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, | 187 | int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops, |
| 167 | struct gnttab_map_grant_ref *kmap_ops, | 188 | struct gnttab_map_grant_ref *kmap_ops, |
| 168 | struct page **pages, unsigned int count); | 189 | struct page **pages, unsigned int count); |
| 169 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | 190 | int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, |
| 170 | struct gnttab_map_grant_ref *kunmap_ops, | 191 | struct gnttab_unmap_grant_ref *kunmap_ops, |
| 171 | struct page **pages, unsigned int count); | 192 | struct page **pages, unsigned int count); |
| 193 | void gnttab_unmap_refs_async(struct gntab_unmap_queue_data* item); | ||
| 194 | |||
| 172 | 195 | ||
| 173 | /* Perform a batch of grant map/copy operations. Retry every batch slot | 196 | /* Perform a batch of grant map/copy operations. Retry every batch slot |
| 174 | * for which the hypervisor returns GNTST_eagain. This is typically due | 197 | * for which the hypervisor returns GNTST_eagain. This is typically due |
| @@ -182,4 +205,22 @@ int gnttab_unmap_refs(struct gnttab_unmap_grant_ref *unmap_ops, | |||
| 182 | void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count); | 205 | void gnttab_batch_map(struct gnttab_map_grant_ref *batch, unsigned count); |
| 183 | void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count); | 206 | void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count); |
| 184 | 207 | ||
| 208 | |||
| 209 | struct xen_page_foreign { | ||
| 210 | domid_t domid; | ||
| 211 | grant_ref_t gref; | ||
| 212 | }; | ||
| 213 | |||
| 214 | static inline struct xen_page_foreign *xen_page_foreign(struct page *page) | ||
| 215 | { | ||
| 216 | if (!PageForeign(page)) | ||
| 217 | return NULL; | ||
| 218 | #if BITS_PER_LONG < 64 | ||
| 219 | return (struct xen_page_foreign *)page->private; | ||
| 220 | #else | ||
| 221 | BUILD_BUG_ON(sizeof(struct xen_page_foreign) > BITS_PER_LONG); | ||
| 222 | return (struct xen_page_foreign *)&page->private; | ||
| 223 | #endif | ||
| 224 | } | ||
| 225 | |||
| 185 | #endif /* __ASM_GNTTAB_H__ */ | 226 | #endif /* __ASM_GNTTAB_H__ */ |
diff --git a/include/xen/interface/features.h b/include/xen/interface/features.h index 131a6ccdba25..6ad3d110bb81 100644 --- a/include/xen/interface/features.h +++ b/include/xen/interface/features.h | |||
| @@ -41,6 +41,12 @@ | |||
| 41 | /* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */ | 41 | /* x86: Does this Xen host support the MMU_PT_UPDATE_PRESERVE_AD hypercall? */ |
| 42 | #define XENFEAT_mmu_pt_update_preserve_ad 5 | 42 | #define XENFEAT_mmu_pt_update_preserve_ad 5 |
| 43 | 43 | ||
| 44 | /* | ||
| 45 | * If set, GNTTABOP_map_grant_ref honors flags to be placed into guest kernel | ||
| 46 | * available pte bits. | ||
| 47 | */ | ||
| 48 | #define XENFEAT_gnttab_map_avail_bits 7 | ||
| 49 | |||
| 44 | /* x86: Does this Xen host support the HVM callback vector type? */ | 50 | /* x86: Does this Xen host support the HVM callback vector type? */ |
| 45 | #define XENFEAT_hvm_callback_vector 8 | 51 | #define XENFEAT_hvm_callback_vector 8 |
| 46 | 52 | ||
diff --git a/include/xen/interface/grant_table.h b/include/xen/interface/grant_table.h index bcce56439d64..56806bc90c2f 100644 --- a/include/xen/interface/grant_table.h +++ b/include/xen/interface/grant_table.h | |||
| @@ -526,6 +526,13 @@ DEFINE_GUEST_HANDLE_STRUCT(gnttab_cache_flush); | |||
| 526 | #define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) | 526 | #define GNTMAP_contains_pte (1<<_GNTMAP_contains_pte) |
| 527 | 527 | ||
| 528 | /* | 528 | /* |
| 529 | * Bits to be placed in guest kernel available PTE bits (architecture | ||
| 530 | * dependent; only supported when XENFEAT_gnttab_map_avail_bits is set). | ||
| 531 | */ | ||
| 532 | #define _GNTMAP_guest_avail0 (16) | ||
| 533 | #define GNTMAP_guest_avail_mask ((uint32_t)~0 << _GNTMAP_guest_avail0) | ||
| 534 | |||
| 535 | /* | ||
| 529 | * Values for error status returns. All errors are -ve. | 536 | * Values for error status returns. All errors are -ve. |
| 530 | */ | 537 | */ |
| 531 | #define GNTST_okay (0) /* Normal return. */ | 538 | #define GNTST_okay (0) /* Normal return. */ |
