diff options
Diffstat (limited to 'include/xen/grant_table.h')
-rw-r--r-- | include/xen/grant_table.h | 43 |
1 files changed, 42 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__ */ |