From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753299AbbJMQvp (ORCPT ); Tue, 13 Oct 2015 12:51:45 -0400 Received: from smtp.citrix.com ([66.165.176.89]:12634 "EHLO SMTP.CITRIX.COM" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753122AbbJMQvo (ORCPT ); Tue, 13 Oct 2015 12:51:44 -0400 X-IronPort-AV: E=Sophos;i="5.17,678,1437436800"; d="scan'208";a="306175846" From: Julien Grall To: CC: , Julien Grall , Konrad Rzeszutek Wilk , Boris Ostrovsky , David Vrabel , "Stefano Stabellini" Subject: [PATCH 2/3] xen/grant-table: Add an helper to iterate over a specific number of grants Date: Tue, 13 Oct 2015 17:50:12 +0100 Message-ID: <1444755013-19238-3-git-send-email-julien.grall@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1444755013-19238-1-git-send-email-julien.grall@citrix.com> References: <1444755013-19238-1-git-send-email-julien.grall@citrix.com> MIME-Version: 1.0 Content-Type: text/plain X-DLP: MIA1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- Cc: Konrad Rzeszutek Wilk Cc: Boris Ostrovsky Cc: David Vrabel Cc: Stefano Stabellini --- 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