* [PATCH v4 1/2] xen/mm: Introduce arch_free_heap_page()
@ 2016-03-09 13:12 Andrew Cooper
2016-03-09 13:13 ` [PATCH v4 2/2] xen/mm: Fix page_list_* helpers to evaluate all their arguments Andrew Cooper
0 siblings, 1 reply; 2+ messages in thread
From: Andrew Cooper @ 2016-03-09 13:12 UTC (permalink / raw)
To: Xen-devel
Cc: George Dunlap, Andrew Cooper, Julien Grall, Stefano Stabellini,
Jan Beulich
common/page_alloc.c references d->arch.relmem_list, which only exists on x86.
This only compiles on ARM because page_list_del2() discards its second
argument.
Introduce a new common arch_free_heap_page() which only uses common lists in
struct domain, and allow an architecture to override this with a custom
alternative. x86 then provides a custom arch_free_heap_page() which takes
care of managing d->arch.relmem_list.
No functional change.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Stefano Stabellini <stefano.stabellini@citrix.com>
CC: Julien Grall <julien.grall@arm.com>
CC: George Dunlap <george.dunlap@eu.citrix.com>
---
xen/common/page_alloc.c | 4 ++--
xen/include/asm-x86/mm.h | 5 +++++
xen/include/xen/mm.h | 6 ++++++
3 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c
index 7179d67..22e8feb 100644
--- a/xen/common/page_alloc.c
+++ b/xen/common/page_alloc.c
@@ -1837,7 +1837,7 @@ void free_domheap_pages(struct page_info *pg, unsigned int order)
spin_lock_recursive(&d->page_alloc_lock);
for ( i = 0; i < (1 << order); i++ )
- page_list_del2(&pg[i], &d->xenpage_list, &d->arch.relmem_list);
+ arch_free_heap_page(d, &pg[i]);
d->xenheap_pages -= 1 << order;
drop_dom_ref = (d->xenheap_pages == 0);
@@ -1856,7 +1856,7 @@ void free_domheap_pages(struct page_info *pg, unsigned int order)
for ( i = 0; i < (1 << order); i++ )
{
BUG_ON((pg[i].u.inuse.type_info & PGT_count_mask) != 0);
- page_list_del2(&pg[i], &d->page_list, &d->arch.relmem_list);
+ arch_free_heap_page(d, &pg[i]);
}
drop_dom_ref = !domain_adjust_tot_pages(d, -(1 << order));
diff --git a/xen/include/asm-x86/mm.h b/xen/include/asm-x86/mm.h
index 23a4092..195cbcb 100644
--- a/xen/include/asm-x86/mm.h
+++ b/xen/include/asm-x86/mm.h
@@ -590,4 +590,9 @@ typedef struct mm_rwlock {
const char *locker_function; /* func that took it */
} mm_rwlock_t;
+#define arch_free_heap_page(d, pg) \
+ page_list_del2(pg, is_xen_heap_page(pg) ? \
+ &(d)->xenpage_list : &(d)->page_list, \
+ &(d)->arch.relmem_list)
+
#endif /* __ASM_X86_MM_H__ */
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index a795dd6..681e6c1 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -443,6 +443,12 @@ static inline unsigned int get_order_from_pages(unsigned long nr_pages)
void scrub_one_page(struct page_info *);
+#ifndef arch_free_heap_page
+#define arch_free_heap_page(d, pg) \
+ page_list_del(pg, is_xen_heap_page(pg) ? \
+ &(d)->xenpage_list : &(d)->page_list)
+#endif
+
int xenmem_add_to_physmap_one(struct domain *d, unsigned int space,
domid_t foreign_domid,
unsigned long idx, xen_pfn_t gpfn);
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
* [PATCH v4 2/2] xen/mm: Fix page_list_* helpers to evaluate all their arguments
2016-03-09 13:12 [PATCH v4 1/2] xen/mm: Introduce arch_free_heap_page() Andrew Cooper
@ 2016-03-09 13:13 ` Andrew Cooper
0 siblings, 0 replies; 2+ messages in thread
From: Andrew Cooper @ 2016-03-09 13:13 UTC (permalink / raw)
To: Xen-devel
Cc: Andrew Cooper, Stefano Stabellini, Tim Deegan, Julien Grall, Jan Beulich
If an architecture does not provide a custom page_list_entry, default
page_list_* helpers are provided, wrapping list_head as an underlying type for
page_list_head.
The two declarations of the page_list_* helpers differ between defines and
static inline functions, where the defines discard some of their parameters.
This causes a compilation failure if CONFIG_BIGMEM and debug=n in p2m-pod.c:
p2m-pod.c: In function ‘p2m_pod_cache_add’:
p2m-pod.c:72:20: error: unused variable ‘d’ [-Werror=unused-variable]
struct domain *d = p2m->domain;
^
cc1: all warnings being treated as errors
because the use of d outside of the !NDEBUG section doesn't get evaluated as a
parameter by page_list_del().
Fix this by turning all #defines into static inline functions, so all
parameters are evaluated even if they are not used.
While editing this area, correct the return type of page_list_empty from int
to bool_t.
No functional change.
Reported-by: Doug Goldstein <cardoe@cardoe.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Doug Goldstein <cardoe@cardoe.com>
Acked-by: George Dunlap <george.dunlap@eu.citrix.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Tim Deegan <tim@xen.org>
CC: Stefano Stabellini <stefano.stabellini@citrix.com>
CC: Julien Grall <julien.grall@arm.com>
v2:
* Remove explicit casts, and missing !! in page_list_empty()
v3:
* Fix build on ARM. As it is referenced from common, relmem_list shouldn't
be an .arch variable. However, moving it would split it away from the
relmem enumeration, which is specific to the arch. (Basically - I lack
sufficient TUITs to disentagle this properly, and this is the most simple fix.)
v4:
* Split ARM build fix into the previous patch.
---
xen/include/xen/mm.h | 95 ++++++++++++++++++++++++++++++++++++++++------------
1 file changed, 74 insertions(+), 21 deletions(-)
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index 681e6c1..8d5490e 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -220,7 +220,7 @@ struct page_list_head
# define INIT_PAGE_LIST_HEAD(head) ((head)->tail = (head)->next = NULL)
# define INIT_PAGE_LIST_ENTRY(ent) ((ent)->prev = (ent)->next = PAGE_LIST_NULL)
-static inline int
+static inline bool_t
page_list_empty(const struct page_list_head *head)
{
return !head->next;
@@ -392,31 +392,84 @@ page_list_splice(struct page_list_head *list, struct page_list_head *head)
# define PAGE_LIST_HEAD LIST_HEAD
# define INIT_PAGE_LIST_HEAD INIT_LIST_HEAD
# define INIT_PAGE_LIST_ENTRY INIT_LIST_HEAD
-# define page_list_empty list_empty
-# define page_list_first(hd) \
- list_first_entry(hd, struct page_info, list)
-# define page_list_last(hd) \
- list_last_entry(hd, struct page_info, list)
-# define page_list_next(pg, hd) list_next_entry(pg, list)
-# define page_list_prev(pg, hd) list_prev_entry(pg, list)
-# define page_list_add(pg, hd) list_add(&(pg)->list, hd)
-# define page_list_add_tail(pg, hd) list_add_tail(&(pg)->list, hd)
-# define page_list_del(pg, hd) list_del(&(pg)->list)
-# define page_list_del2(pg, hd1, hd2) list_del(&(pg)->list)
-# define page_list_remove_head(hd) (!page_list_empty(hd) ? \
- ({ \
- struct page_info *__pg = page_list_first(hd); \
- list_del(&__pg->list); \
- __pg; \
- }) : NULL)
-# define page_list_move(dst, src) (!list_empty(src) ? \
- list_replace_init(src, dst) : (void)0)
+
+static inline bool_t
+page_list_empty(const struct page_list_head *head)
+{
+ return !!list_empty(head);
+}
+static inline struct page_info *
+page_list_first(const struct page_list_head *head)
+{
+ return list_first_entry(head, struct page_info, list);
+}
+static inline struct page_info *
+page_list_last(const struct page_list_head *head)
+{
+ return list_last_entry(head, struct page_info, list);
+}
+static inline struct page_info *
+page_list_next(const struct page_info *page,
+ const struct page_list_head *head)
+{
+ return list_entry(page->list.next, struct page_info, list);
+}
+static inline struct page_info *
+page_list_prev(const struct page_info *page,
+ const struct page_list_head *head)
+{
+ return list_entry(page->list.prev, struct page_info, list);
+}
+static inline void
+page_list_add(struct page_info *page, struct page_list_head *head)
+{
+ list_add(&page->list, head);
+}
+static inline void
+page_list_add_tail(struct page_info *page, struct page_list_head *head)
+{
+ list_add_tail(&page->list, head);
+}
+static inline void
+page_list_del(struct page_info *page, struct page_list_head *head)
+{
+ list_del(&page->list);
+}
+static inline void
+page_list_del2(struct page_info *page, struct page_list_head *head1,
+ struct page_list_head *head2)
+{
+ list_del(&page->list);
+}
+static inline struct page_info *
+page_list_remove_head(struct page_list_head *head)
+{
+ struct page_info *pg;
+
+ if ( page_list_empty(head) )
+ return NULL;
+
+ pg = page_list_first(head);
+ list_del(&pg->list);
+ return pg;
+}
+static inline void
+page_list_move(struct page_list_head *dst, struct page_list_head *src)
+{
+ if ( !list_empty(src) )
+ list_replace_init(src, dst);
+}
+static inline void
+page_list_splice(struct page_list_head *list, struct page_list_head *head)
+{
+ list_splice(list, head);
+}
+
# define page_list_for_each(pos, head) list_for_each_entry(pos, head, list)
# define page_list_for_each_safe(pos, tmp, head) \
list_for_each_entry_safe(pos, tmp, head, list)
# define page_list_for_each_safe_reverse(pos, tmp, head) \
list_for_each_entry_safe_reverse(pos, tmp, head, list)
-# define page_list_splice(list, hd) list_splice(list, hd)
#endif
static inline unsigned int get_order_from_bytes(paddr_t size)
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-03-09 13:13 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-03-09 13:12 [PATCH v4 1/2] xen/mm: Introduce arch_free_heap_page() Andrew Cooper
2016-03-09 13:13 ` [PATCH v4 2/2] xen/mm: Fix page_list_* helpers to evaluate all their arguments Andrew Cooper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).