From: Andrew Cooper <andrew.cooper3@citrix.com>
To: Xen-devel <xen-devel@lists.xen.org>
Cc: George Dunlap <george.dunlap@eu.citrix.com>,
Andrew Cooper <andrew.cooper3@citrix.com>,
Tim Deegan <tim@xen.org>, Jan Beulich <JBeulich@suse.com>
Subject: [PATCH v2] xen/mm: Fix page_list_* helpers to evaluate all their arguments
Date: Mon, 7 Mar 2016 15:01:06 +0000 [thread overview]
Message-ID: <1457362866-21460-1-git-send-email-andrew.cooper3@citrix.com> (raw)
In-Reply-To: <56DD8D1702000078000D9FA9@prv-mh.provo.novell.com>
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.
Reported-by: Doug Goldstein <cardoe@cardoe.com>
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Doug Goldstein <cardoe@cardoe.com>
---
CC: Jan Beulich <JBeulich@suse.com>
CC: Tim Deegan <tim@xen.org>
CC: George Dunlap <george.dunlap@eu.citrix.com>
v2: Remove explicit casts, and missing !! in page_list_empty()
---
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 a795dd6..8600cf6 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
next prev parent reply other threads:[~2016-03-07 15:01 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-03-05 16:52 [PATCH] xen/mm: Fix page_list_* helpers to evaluate all their arguments Andrew Cooper
2016-03-05 23:42 ` Doug Goldstein
2016-03-07 13:15 ` Jan Beulich
2016-03-07 15:01 ` Andrew Cooper [this message]
2016-03-07 16:53 ` [PATCH v2] " Jan Beulich
2016-03-07 18:12 ` [PATCH v3] " Andrew Cooper
2016-03-08 9:57 ` Jan Beulich
2016-03-08 11:05 ` Andrew Cooper
2016-03-08 11:25 ` Jan Beulich
2016-03-09 12:12 ` George Dunlap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1457362866-21460-1-git-send-email-andrew.cooper3@citrix.com \
--to=andrew.cooper3@citrix.com \
--cc=JBeulich@suse.com \
--cc=george.dunlap@eu.citrix.com \
--cc=tim@xen.org \
--cc=xen-devel@lists.xen.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).