]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - include/xen/grant_table.h
Merge remote-tracking branch 'xen-tip/linux-next'
[karo-tx-linux.git] / include / xen / grant_table.h
index 4478f4b4aae2ff06473f2aff0e0100684f11c2bf..34b1379f9777d4e7969f3288a51305c0c8738c9d 100644 (file)
 #include <asm/xen/hypervisor.h>
 
 #include <xen/features.h>
+#include <xen/page.h>
 #include <linux/mm_types.h>
 #include <linux/page-flags.h>
+#include <linux/kernel.h>
 
 #define GNTTAB_RESERVED_XENSTORE 1
 
@@ -129,6 +131,15 @@ void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
 void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
                                     unsigned long frame, int readonly);
 
+/* Give access to the first 4K of the page */
+static inline void gnttab_page_grant_foreign_access_ref_one(
+       grant_ref_t ref, domid_t domid,
+       struct page *page, int readonly)
+{
+       gnttab_grant_foreign_access_ref(ref, domid, xen_page_to_gfn(page),
+                                       readonly);
+}
+
 void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
                                       unsigned long pfn);
 
@@ -224,4 +235,50 @@ static inline struct xen_page_foreign *xen_page_foreign(struct page *page)
 #endif
 }
 
+/* Split Linux page in chunk of the size of the grant and call fn
+ *
+ * Parameters of fn:
+ *     gfn: guest frame number
+ *     offset: offset in the grant
+ *     len: length of the data in the grant.
+ *     data: internal information
+ */
+typedef void (*xen_grant_fn_t)(unsigned long gfn, unsigned int offset,
+                              unsigned int len, void *data);
+
+void gnttab_foreach_grant_in_range(struct page *page,
+                                  unsigned int offset,
+                                  unsigned int len,
+                                  xen_grant_fn_t fn,
+                                  void *data);
+
+/* Helper to get to call fn only on the first "grant chunk" */
+static inline void gnttab_for_one_grant(struct page *page, unsigned int offset,
+                                       unsigned len, xen_grant_fn_t fn,
+                                       void *data)
+{
+       /* The first request is limited to the size of one grant */
+       len = min_t(unsigned int, XEN_PAGE_SIZE - (offset & ~XEN_PAGE_MASK),
+                   len);
+
+       gnttab_foreach_grant_in_range(page, offset, len, fn, data);
+}
+
+/* Get @nr_grefs grants from an array of page and call fn for each grant */
+void gnttab_foreach_grant(struct page **pages,
+                         unsigned int nr_grefs,
+                         xen_grant_fn_t fn,
+                         void *data);
+
+/* Get the number of grant in a specified region
+ *
+ * start: Offset from the beginning of the first page
+ * len: total length of data (can cross multiple page)
+ */
+static inline unsigned int gnttab_count_grant(unsigned int start,
+                                             unsigned int len)
+{
+       return XEN_PFN_UP(xen_offset_in_page(start) + len);
+}
+
 #endif /* __ASM_GNTTAB_H__ */