|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 9 of 9] x86/mm: Make debug_{gfn, mfn, gref} calls to sharing more useful and correct
xen/arch/x86/mm/mem_sharing.c | 224 +++++++++++++++++++++--------------------
1 files changed, 115 insertions(+), 109 deletions(-)
Have them used locked accesors to the gfn and the underlying shared mfn.
Have them return the number of shared refs to the underlying mfn.
Signed-off-by: Andres Lagar-Cavilla <andres@xxxxxxxxxxxxxxxx>
diff -r 12f7da67cefe -r 9a55109e4d7e xen/arch/x86/mm/mem_sharing.c
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -45,13 +45,13 @@ typedef struct pg_lock_data {
DEFINE_PER_CPU(pg_lock_data_t, __pld);
+#define MEM_SHARING_DEBUG(_f, _a...) \
+ debugtrace_printk("mem_sharing_debug: %s(): " _f, __func__, ##_a)
+
#if MEM_SHARING_AUDIT
static void mem_sharing_audit(void);
-#define MEM_SHARING_DEBUG(_f, _a...) \
- debugtrace_printk("mem_sharing_debug: %s(): " _f, __func__, ##_a)
-
static struct list_head shr_audit_list;
static spinlock_t shr_audit_lock;
DEFINE_RCU_READ_LOCK(shr_audit_read_lock);
@@ -400,111 +400,6 @@ int mem_sharing_sharing_resume(struct do
return 0;
}
-int mem_sharing_debug_mfn(unsigned long mfn)
-{
- struct page_info *page;
-
- if ( !mfn_valid(_mfn(mfn)) )
- {
- gdprintk(XENLOG_ERR, "Invalid MFN=%lx\n", mfn);
- return -1;
- }
- page = mfn_to_page(_mfn(mfn));
-
- gdprintk(XENLOG_DEBUG,
- "Debug page: MFN=%lx is ci=%lx, ti=%lx, owner_id=%d\n",
- mfn_x(page_to_mfn(page)),
- page->count_info,
- page->u.inuse.type_info,
- page_get_owner(page)->domain_id);
-
- return 0;
-}
-
-int mem_sharing_debug_gfn(struct domain *d, unsigned long gfn)
-{
- p2m_type_t p2mt;
- mfn_t mfn;
-
- mfn = get_gfn_query_unlocked(d, gfn, &p2mt);
-
- gdprintk(XENLOG_DEBUG, "Debug for domain=%d, gfn=%lx, ",
- d->domain_id,
- gfn);
- return mem_sharing_debug_mfn(mfn_x(mfn));
-}
-
-#define SHGNT_PER_PAGE_V1 (PAGE_SIZE / sizeof(grant_entry_v1_t))
-#define shared_entry_v1(t, e) \
- ((t)->shared_v1[(e)/SHGNT_PER_PAGE_V1][(e)%SHGNT_PER_PAGE_V1])
-#define SHGNT_PER_PAGE_V2 (PAGE_SIZE / sizeof(grant_entry_v2_t))
-#define shared_entry_v2(t, e) \
- ((t)->shared_v2[(e)/SHGNT_PER_PAGE_V2][(e)%SHGNT_PER_PAGE_V2])
-#define STGNT_PER_PAGE (PAGE_SIZE / sizeof(grant_status_t))
-#define status_entry(t, e) \
- ((t)->status[(e)/STGNT_PER_PAGE][(e)%STGNT_PER_PAGE])
-
-static grant_entry_header_t *
-shared_entry_header(struct grant_table *t, grant_ref_t ref)
-{
- ASSERT (t->gt_version != 0);
- if ( t->gt_version == 1 )
- return (grant_entry_header_t*)&shared_entry_v1(t, ref);
- else
- return &shared_entry_v2(t, ref).hdr;
-}
-
-static int mem_sharing_gref_to_gfn(struct domain *d,
- grant_ref_t ref,
- unsigned long *gfn)
-{
- if ( d->grant_table->gt_version < 1 )
- return -1;
-
- if ( d->grant_table->gt_version == 1 )
- {
- grant_entry_v1_t *sha1;
- sha1 = &shared_entry_v1(d->grant_table, ref);
- *gfn = sha1->frame;
- }
- else
- {
- grant_entry_v2_t *sha2;
- sha2 = &shared_entry_v2(d->grant_table, ref);
- *gfn = sha2->full_page.frame;
- }
-
- return 0;
-}
-
-
-int mem_sharing_debug_gref(struct domain *d, grant_ref_t ref)
-{
- grant_entry_header_t *shah;
- uint16_t status;
- unsigned long gfn;
-
- if ( d->grant_table->gt_version < 1 )
- {
- gdprintk(XENLOG_ERR,
- "Asked to debug [dom=%d,gref=%d], but not yet inited.\n",
- d->domain_id, ref);
- return -1;
- }
- (void)mem_sharing_gref_to_gfn(d, ref, &gfn);
- shah = shared_entry_header(d->grant_table, ref);
- if ( d->grant_table->gt_version == 1 )
- status = shah->flags;
- else
- status = status_entry(d->grant_table, ref);
-
- gdprintk(XENLOG_DEBUG,
- "==> Grant [dom=%d,ref=%d], status=%x. ",
- d->domain_id, ref, status);
-
- return mem_sharing_debug_gfn(d, gfn);
-}
-
/* Functions that change a page's type and ownership */
static int page_make_sharable(struct domain *d,
struct page_info *page,
@@ -606,6 +501,117 @@ static inline struct page_info *__grab_s
return pg;
}
+int mem_sharing_debug_mfn(mfn_t mfn)
+{
+ struct page_info *page;
+ int num_refs;
+
+ if ( (page = __grab_shared_page(mfn)) == NULL)
+ {
+ gdprintk(XENLOG_ERR, "Invalid MFN=%lx\n", mfn_x(mfn));
+ return -1;
+ }
+
+ MEM_SHARING_DEBUG(
+ "Debug page: MFN=%lx is ci=%lx, ti=%lx, owner_id=%d\n",
+ mfn_x(page_to_mfn(page)),
+ page->count_info,
+ page->u.inuse.type_info,
+ page_get_owner(page)->domain_id);
+
+ /* -1 because the page is locked and that's an additional type ref */
+ num_refs = ((int) (page->u.inuse.type_info & PGT_count_mask)) - 1;
+ mem_sharing_page_unlock(page);
+ return num_refs;
+}
+
+int mem_sharing_debug_gfn(struct domain *d, unsigned long gfn)
+{
+ p2m_type_t p2mt;
+ mfn_t mfn;
+ int num_refs;
+
+ mfn = get_gfn_query(d, gfn, &p2mt);
+
+ MEM_SHARING_DEBUG("Debug for domain=%d, gfn=%lx, ",
+ d->domain_id,
+ gfn);
+ num_refs = mem_sharing_debug_mfn(mfn);
+ put_gfn(d, gfn);
+ return num_refs;
+}
+
+#define SHGNT_PER_PAGE_V1 (PAGE_SIZE / sizeof(grant_entry_v1_t))
+#define shared_entry_v1(t, e) \
+ ((t)->shared_v1[(e)/SHGNT_PER_PAGE_V1][(e)%SHGNT_PER_PAGE_V1])
+#define SHGNT_PER_PAGE_V2 (PAGE_SIZE / sizeof(grant_entry_v2_t))
+#define shared_entry_v2(t, e) \
+ ((t)->shared_v2[(e)/SHGNT_PER_PAGE_V2][(e)%SHGNT_PER_PAGE_V2])
+#define STGNT_PER_PAGE (PAGE_SIZE / sizeof(grant_status_t))
+#define status_entry(t, e) \
+ ((t)->status[(e)/STGNT_PER_PAGE][(e)%STGNT_PER_PAGE])
+
+static grant_entry_header_t *
+shared_entry_header(struct grant_table *t, grant_ref_t ref)
+{
+ ASSERT (t->gt_version != 0);
+ if ( t->gt_version == 1 )
+ return (grant_entry_header_t*)&shared_entry_v1(t, ref);
+ else
+ return &shared_entry_v2(t, ref).hdr;
+}
+
+static int mem_sharing_gref_to_gfn(struct domain *d,
+ grant_ref_t ref,
+ unsigned long *gfn)
+{
+ if ( d->grant_table->gt_version < 1 )
+ return -1;
+
+ if ( d->grant_table->gt_version == 1 )
+ {
+ grant_entry_v1_t *sha1;
+ sha1 = &shared_entry_v1(d->grant_table, ref);
+ *gfn = sha1->frame;
+ }
+ else
+ {
+ grant_entry_v2_t *sha2;
+ sha2 = &shared_entry_v2(d->grant_table, ref);
+ *gfn = sha2->full_page.frame;
+ }
+
+ return 0;
+}
+
+
+int mem_sharing_debug_gref(struct domain *d, grant_ref_t ref)
+{
+ grant_entry_header_t *shah;
+ uint16_t status;
+ unsigned long gfn;
+
+ if ( d->grant_table->gt_version < 1 )
+ {
+ MEM_SHARING_DEBUG(
+ "Asked to debug [dom=%d,gref=%d], but not yet inited.\n",
+ d->domain_id, ref);
+ return -1;
+ }
+ (void)mem_sharing_gref_to_gfn(d, ref, &gfn);
+ shah = shared_entry_header(d->grant_table, ref);
+ if ( d->grant_table->gt_version == 1 )
+ status = shah->flags;
+ else
+ status = status_entry(d->grant_table, ref);
+
+ MEM_SHARING_DEBUG(
+ "==> Grant [dom=%d,ref=%d], status=%x. ",
+ d->domain_id, ref, status);
+
+ return mem_sharing_debug_gfn(d, gfn);
+}
+
int mem_sharing_nominate_page(struct domain *d,
unsigned long gfn,
int expected_refcnt,
@@ -1169,7 +1175,7 @@ int mem_sharing_domctl(struct domain *d,
case XEN_DOMCTL_MEM_EVENT_OP_SHARING_DEBUG_MFN:
{
unsigned long mfn = mec->u.debug.u.mfn;
- rc = mem_sharing_debug_mfn(mfn);
+ rc = mem_sharing_debug_mfn(_mfn(mfn));
}
break;
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |