With the 64KB page granularity support on ARM64, a Linux page may be split accross multiple grant.
Currently we have the helper gnttab_foreach_grant_in_grant to break a Linux page based on an offset and a len, but it doesn't fit when we only have a number of grants in hand. Introduce a new helper which take an array of Linux page and a number of grant and will figure out the address of each grant. Signed-off-by: Julien Grall <julien.gr...@citrix.com> --- Cc: Konrad Rzeszutek Wilk <konrad.w...@oracle.com> Cc: Boris Ostrovsky <boris.ostrov...@oracle.com> Cc: David Vrabel <david.vra...@citrix.com> Cc: Stefano Stabellini <stefano.stabell...@eu.citrix.com> --- drivers/xen/grant-table.c | 22 ++++++++++++++++++++++ include/xen/grant_table.h | 6 ++++++ 2 files changed, 28 insertions(+) diff --git a/drivers/xen/grant-table.c b/drivers/xen/grant-table.c index 72d6339..c49f79ed 100644 --- a/drivers/xen/grant-table.c +++ b/drivers/xen/grant-table.c @@ -802,6 +802,28 @@ void gnttab_foreach_grant_in_range(struct page *page, } 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) diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h index e17a4b3..34b1379 100644 --- a/include/xen/grant_table.h +++ b/include/xen/grant_table.h @@ -264,6 +264,12 @@ static inline void gnttab_for_one_grant(struct page *page, unsigned int offset, 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 -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/