diff options
Diffstat (limited to 'include/xen')
-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 | ||||
-rw-r--r-- | include/xen/page.h | 5 |
4 files changed, 60 insertions, 1 deletions
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. */ |
diff --git a/include/xen/page.h b/include/xen/page.h index 12765b6f9517..c5ed20bb3fe9 100644 --- a/include/xen/page.h +++ b/include/xen/page.h | |||
@@ -3,6 +3,11 @@ | |||
3 | 3 | ||
4 | #include <asm/xen/page.h> | 4 | #include <asm/xen/page.h> |
5 | 5 | ||
6 | static inline unsigned long page_to_mfn(struct page *page) | ||
7 | { | ||
8 | return pfn_to_mfn(page_to_pfn(page)); | ||
9 | } | ||
10 | |||
6 | struct xen_memory_region { | 11 | struct xen_memory_region { |
7 | phys_addr_t start; | 12 | phys_addr_t start; |
8 | phys_addr_t size; | 13 | phys_addr_t size; |