xen/grant-table: Make set/clear page private code shared
Make set/clear page private code shared and accessible to other kernel modules which can re-use these instead of open-coding. Signed-off-by: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> Reviewed-by: Boris Ostrovsky <boris.ostrovsky@oracle.com> Signed-off-by: Boris Ostrovsky <boris.ostrovsky@oracle.com>
This commit is contained in:
parent
d72e90f33a
commit
8c3799ee25
@ -769,29 +769,18 @@ void gnttab_free_auto_xlat_frames(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gnttab_free_auto_xlat_frames);
|
||||
|
||||
/**
|
||||
* gnttab_alloc_pages - alloc pages suitable for grant mapping into
|
||||
* @nr_pages: number of pages to alloc
|
||||
* @pages: returns the pages
|
||||
*/
|
||||
int gnttab_alloc_pages(int nr_pages, struct page **pages)
|
||||
int gnttab_pages_set_private(int nr_pages, struct page **pages)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
ret = alloc_xenballooned_pages(nr_pages, pages);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
#if BITS_PER_LONG < 64
|
||||
struct xen_page_foreign *foreign;
|
||||
|
||||
foreign = kzalloc(sizeof(*foreign), GFP_KERNEL);
|
||||
if (!foreign) {
|
||||
gnttab_free_pages(nr_pages, pages);
|
||||
if (!foreign)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
set_page_private(pages[i], (unsigned long)foreign);
|
||||
#endif
|
||||
SetPagePrivate(pages[i]);
|
||||
@ -799,14 +788,30 @@ int gnttab_alloc_pages(int nr_pages, struct page **pages)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
|
||||
EXPORT_SYMBOL_GPL(gnttab_pages_set_private);
|
||||
|
||||
/**
|
||||
* gnttab_free_pages - free pages allocated by gnttab_alloc_pages()
|
||||
* @nr_pages; number of pages to free
|
||||
* @pages: the pages
|
||||
* gnttab_alloc_pages - alloc pages suitable for grant mapping into
|
||||
* @nr_pages: number of pages to alloc
|
||||
* @pages: returns the pages
|
||||
*/
|
||||
void gnttab_free_pages(int nr_pages, struct page **pages)
|
||||
int gnttab_alloc_pages(int nr_pages, struct page **pages)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = alloc_xenballooned_pages(nr_pages, pages);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = gnttab_pages_set_private(nr_pages, pages);
|
||||
if (ret < 0)
|
||||
gnttab_free_pages(nr_pages, pages);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gnttab_alloc_pages);
|
||||
|
||||
void gnttab_pages_clear_private(int nr_pages, struct page **pages)
|
||||
{
|
||||
int i;
|
||||
|
||||
@ -818,6 +823,17 @@ void gnttab_free_pages(int nr_pages, struct page **pages)
|
||||
ClearPagePrivate(pages[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gnttab_pages_clear_private);
|
||||
|
||||
/**
|
||||
* gnttab_free_pages - free pages allocated by gnttab_alloc_pages()
|
||||
* @nr_pages; number of pages to free
|
||||
* @pages: the pages
|
||||
*/
|
||||
void gnttab_free_pages(int nr_pages, struct page **pages)
|
||||
{
|
||||
gnttab_pages_clear_private(nr_pages, pages);
|
||||
free_xenballooned_pages(nr_pages, pages);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(gnttab_free_pages);
|
||||
|
@ -198,6 +198,9 @@ void gnttab_free_auto_xlat_frames(void);
|
||||
int gnttab_alloc_pages(int nr_pages, struct page **pages);
|
||||
void gnttab_free_pages(int nr_pages, struct page **pages);
|
||||
|
||||
int gnttab_pages_set_private(int nr_pages, struct page **pages);
|
||||
void gnttab_pages_clear_private(int nr_pages, struct page **pages);
|
||||
|
||||
int gnttab_map_refs(struct gnttab_map_grant_ref *map_ops,
|
||||
struct gnttab_map_grant_ref *kmap_ops,
|
||||
struct page **pages, unsigned int count);
|
||||
|
Loading…
Reference in New Issue
Block a user