These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / xen / grant-table.c
index b1c7170..c49f79e 100644 (file)
@@ -138,7 +138,6 @@ static struct gnttab_free_callback *gnttab_free_callback_list;
 static int gnttab_expand(unsigned int req_entries);
 
 #define RPP (PAGE_SIZE / sizeof(grant_ref_t))
-#define SPP (PAGE_SIZE / sizeof(grant_status_t))
 
 static inline grant_ref_t *__gnttab_entry(grant_ref_t entry)
 {
@@ -643,7 +642,7 @@ int gnttab_setup_auto_xlat_frames(phys_addr_t addr)
        if (xen_auto_xlat_grant_frames.count)
                return -EINVAL;
 
-       vaddr = xen_remap(addr, PAGE_SIZE * max_nr_gframes);
+       vaddr = xen_remap(addr, XEN_PAGE_SIZE * max_nr_gframes);
        if (vaddr == NULL) {
                pr_warn("Failed to ioremap gnttab share frames (addr=%pa)!\n",
                        &addr);
@@ -655,7 +654,7 @@ int gnttab_setup_auto_xlat_frames(phys_addr_t addr)
                return -ENOMEM;
        }
        for (i = 0; i < max_nr_gframes; i++)
-               pfn[i] = PFN_DOWN(addr) + i;
+               pfn[i] = XEN_PFN_DOWN(addr) + i;
 
        xen_auto_xlat_grant_frames.vaddr = vaddr;
        xen_auto_xlat_grant_frames.pfn = pfn;
@@ -688,7 +687,7 @@ int gnttab_alloc_pages(int nr_pages, struct page **pages)
        int i;
        int ret;
 
-       ret = alloc_xenballooned_pages(nr_pages, pages, false);
+       ret = alloc_xenballooned_pages(nr_pages, pages);
        if (ret < 0)
                return ret;
 
@@ -777,6 +776,54 @@ void gnttab_batch_copy(struct gnttab_copy *batch, unsigned count)
 }
 EXPORT_SYMBOL_GPL(gnttab_batch_copy);
 
+void gnttab_foreach_grant_in_range(struct page *page,
+                                  unsigned int offset,
+                                  unsigned int len,
+                                  xen_grant_fn_t fn,
+                                  void *data)
+{
+       unsigned int goffset;
+       unsigned int glen;
+       unsigned long xen_pfn;
+
+       len = min_t(unsigned int, PAGE_SIZE - offset, len);
+       goffset = xen_offset_in_page(offset);
+
+       xen_pfn = page_to_xen_pfn(page) + XEN_PFN_DOWN(offset);
+
+       while (len) {
+               glen = min_t(unsigned int, XEN_PAGE_SIZE - goffset, len);
+               fn(pfn_to_gfn(xen_pfn), goffset, glen, data);
+
+               goffset = 0;
+               xen_pfn++;
+               len -= glen;
+       }
+}
+EXPORT_SYMBOL_GPL(gnttab_foreach_grant_in_range);
+
+void gnttab_foreach_grant(struct page **pages,
+                         unsigned int nr_grefs,
+                         xen_grant_fn_t fn,
+                         void *data)
+{
+       unsigned int goffset = 0;
+       unsigned long xen_pfn = 0;
+       unsigned int i;
+
+       for (i = 0; i < nr_grefs; i++) {
+               if ((i % XEN_PFN_PER_PAGE) == 0) {
+                       xen_pfn = page_to_xen_pfn(pages[i / XEN_PFN_PER_PAGE]);
+                       goffset = 0;
+               }
+
+               fn(pfn_to_gfn(xen_pfn), goffset, XEN_PAGE_SIZE, data);
+
+               goffset += XEN_PAGE_SIZE;
+               xen_pfn++;
+       }
+}
+
 int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
                    struct gnttab_map_grant_ref *kmap_ops,
                    struct page **pages, unsigned int count)
@@ -979,7 +1026,7 @@ static void gnttab_request_version(void)
 {
        /* Only version 1 is used, which will always be available. */
        grant_table_version = 1;
-       grefs_per_grant_frame = PAGE_SIZE / sizeof(struct grant_entry_v1);
+       grefs_per_grant_frame = XEN_PAGE_SIZE / sizeof(struct grant_entry_v1);
        gnttab_interface = &gnttab_v1_ops;
 
        pr_info("Grant tables using version %d layout\n", grant_table_version);