|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/mem-sharing: mov {get,put}_two_gfns()
commit b8d27e5b3391f4f90744f6ce75c02bd2661f7788
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Jul 7 12:35:54 2021 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jul 7 12:35:54 2021 +0200
x86/mem-sharing: mov {get,put}_two_gfns()
There's no reason for every CU including p2m.h to have these two
functions compiled, when they're both mem-sharing specific right now and
for the foreseeable future.
Largely just code movement, with some style tweaks, the inline-s
dropped, and "put" being made consistent with "get" as to their NULL
checking of the passed in pointer to struct two_gfns.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Tamas K Lengyel <tamas@xxxxxxxxxxxxx>
---
xen/arch/x86/mm/mem_sharing.c | 60 +++++++++++++++++++++++++++++++++++++++++++
xen/include/asm-x86/p2m.h | 56 ----------------------------------------
2 files changed, 60 insertions(+), 56 deletions(-)
diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
index 98b14f7b0a..8d5d44bdbc 100644
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -432,6 +432,66 @@ static void mem_sharing_gfn_destroy(struct page_info
*page, struct domain *d,
xfree(gfn_info);
}
+/* Deadlock-avoidance scheme when calling get_gfn on different gfn's */
+struct two_gfns {
+ struct domain *first_domain, *second_domain;
+ gfn_t first_gfn, second_gfn;
+};
+
+/*
+ * Returns mfn, type and access for potential caller consumption, but any
+ * of those can be NULL.
+ */
+static void get_two_gfns(struct domain *rd, gfn_t rgfn, p2m_type_t *rt,
+ p2m_access_t *ra, mfn_t *rmfn,
+ struct domain *ld, gfn_t lgfn, p2m_type_t *lt,
+ p2m_access_t *la, mfn_t *lmfn,
+ p2m_query_t q, struct two_gfns *rval, bool lock)
+{
+ mfn_t *first_mfn, *second_mfn, scratch_mfn;
+ p2m_access_t *first_a, *second_a, scratch_a;
+ p2m_type_t *first_t, *second_t, scratch_t;
+
+ /* Sort by domain, if same domain by gfn */
+
+#define assign_pointers(dest, source) \
+do { \
+ rval-> dest ## _domain = source ## d; \
+ rval-> dest ## _gfn = source ## gfn; \
+ dest ## _mfn = (source ## mfn) ?: &scratch_mfn; \
+ dest ## _a = (source ## a) ?: &scratch_a; \
+ dest ## _t = (source ## t) ?: &scratch_t; \
+} while ( false )
+
+ if ( (rd->domain_id < ld->domain_id) ||
+ ((rd == ld) && (gfn_x(rgfn) <= gfn_x(lgfn))) )
+ {
+ assign_pointers(first, r);
+ assign_pointers(second, l);
+ }
+ else
+ {
+ assign_pointers(first, l);
+ assign_pointers(second, r);
+ }
+
+#undef assign_pointers
+
+ /* Now do the gets. */
+ *first_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->first_domain),
+ gfn_x(rval->first_gfn), first_t,
+ first_a, q, NULL, lock);
+ *second_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->second_domain),
+ gfn_x(rval->second_gfn), second_t,
+ second_a, q, NULL, lock);
+}
+
+static void put_two_gfns(const struct two_gfns *arg)
+{
+ put_gfn(arg->second_domain, gfn_x(arg->second_gfn));
+ put_gfn(arg->first_domain, gfn_x(arg->first_gfn));
+}
+
static struct page_info *mem_sharing_lookup(unsigned long mfn)
{
struct page_info *page;
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index e569471a2f..d2e7a8db85 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -559,62 +559,6 @@ int altp2m_get_effective_entry(struct p2m_domain *ap2m,
gfn_t gfn, mfn_t *mfn,
bool prepopulate);
#endif
-/* Deadlock-avoidance scheme when calling get_gfn on different gfn's */
-struct two_gfns {
- struct domain *first_domain, *second_domain;
- gfn_t first_gfn, second_gfn;
-};
-
-/* Returns mfn, type and access for potential caller consumption, but any
- * of those can be NULL */
-static inline void get_two_gfns(struct domain *rd, gfn_t rgfn,
- p2m_type_t *rt, p2m_access_t *ra, mfn_t *rmfn, struct domain *ld,
- gfn_t lgfn, p2m_type_t *lt, p2m_access_t *la, mfn_t *lmfn,
- p2m_query_t q, struct two_gfns *rval, bool lock)
-{
- mfn_t *first_mfn, *second_mfn, scratch_mfn;
- p2m_access_t *first_a, *second_a, scratch_a;
- p2m_type_t *first_t, *second_t, scratch_t;
-
- /* Sort by domain, if same domain by gfn */
-
-#define assign_pointers(dest, source) \
-do { \
- rval-> dest ## _domain = source ## d; \
- rval-> dest ## _gfn = source ## gfn; \
- dest ## _mfn = (source ## mfn) ?: &scratch_mfn; \
- dest ## _a = (source ## a) ?: &scratch_a; \
- dest ## _t = (source ## t) ?: &scratch_t; \
-} while (0)
-
- if ( (rd->domain_id < ld->domain_id) ||
- ((rd == ld) && (gfn_x(rgfn) <= gfn_x(lgfn))) )
- {
- assign_pointers(first, r);
- assign_pointers(second, l);
- } else {
- assign_pointers(first, l);
- assign_pointers(second, r);
- }
-
-#undef assign_pointers
-
- /* Now do the gets */
- *first_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->first_domain),
- gfn_x(rval->first_gfn), first_t,
first_a, q, NULL, lock);
- *second_mfn = __get_gfn_type_access(p2m_get_hostp2m(rval->second_domain),
- gfn_x(rval->second_gfn), second_t,
second_a, q, NULL, lock);
-}
-
-static inline void put_two_gfns(struct two_gfns *arg)
-{
- if ( !arg )
- return;
-
- put_gfn(arg->second_domain, gfn_x(arg->second_gfn));
- put_gfn(arg->first_domain, gfn_x(arg->first_gfn));
-}
-
/* Init the datastructures for later use by the p2m code */
int p2m_init(struct domain *d);
--
generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |