-#include <xen/config.h>
#include <xen/lib.h>
#include <xen/domain_page.h>
+#include <xen/mm.h>
#include <xen/sched.h>
#include <asm/current.h>
-
-#include <asm/mm.h>
#include <asm/guest_access.h>
static unsigned long raw_copy_to_guest_helper(void *to, const void *from,
struct domain *page_get_owner_and_reference(struct page_info *page)
{
unsigned long x, y = page->count_info;
+ struct domain *owner;
do {
x = y;
}
while ( (y = cmpxchg(&page->count_info, x, x + 1)) != x );
- return page_get_owner(page);
+ owner = page_get_owner(page);
+ ASSERT(owner);
+
+ return owner;
}
void put_page(struct page_info *page)
struct domain *page_get_owner_and_reference(struct page_info *page)
{
unsigned long x, y = page->count_info;
+ struct domain *owner;
do {
x = y;
}
while ( (y = cmpxchg(&page->count_info, x, x + 1)) != x );
- return page_get_owner(page);
+ owner = page_get_owner(page);
+ ASSERT(owner);
+
+ return owner;
}
{
ASSERT(mfn_valid(act->frame));
*page = mfn_to_page(act->frame);
- (void)page_get_owner_and_reference(*page);
+ td = page_get_owner_and_reference(*page);
+ /*
+ * act->pin being non-zero should guarantee the page to have a
+ * non-zero refcount and hence a valid owner.
+ */
+ ASSERT(td);
}
act->pin += readonly ? GNTPIN_hstr_inc : GNTPIN_hstw_inc;
return mfn_to_virt(page_to_mfn(pg));
}
-struct domain *page_get_owner_and_reference(struct page_info *page);
-void put_page(struct page_info *page);
-int get_page(struct page_info *page, struct domain *domain);
-
struct page_info *get_page_from_gva(struct domain *d, vaddr_t va,
unsigned long flags);
int page_lock(struct page_info *page);
void page_unlock(struct page_info *page);
-struct domain *page_get_owner_and_reference(struct page_info *page);
-void put_page(struct page_info *page);
-int get_page(struct page_info *page, struct domain *domain);
void put_page_type(struct page_info *page);
int get_page_type(struct page_info *page, unsigned long type);
int put_page_type_preemptible(struct page_info *page);
#ifndef __XEN_MM_H__
#define __XEN_MM_H__
+#include <xen/compiler.h>
#include <xen/types.h>
#include <xen/list.h>
#include <xen/spinlock.h>
#undef pfn_t
#endif
-struct domain;
struct page_info;
+void put_page(struct page_info *);
+int get_page(struct page_info *, struct domain *);
+struct domain *__must_check page_get_owner_and_reference(struct page_info *);
+
/* Boot-time allocator. Turns into generic allocator after bootstrap. */
void init_boot_pages(paddr_t ps, paddr_t pe);
unsigned long alloc_boot_pages(