Jan Beulich
2009-Feb-04 10:32 UTC
[Xen-devel] [PATCH] eliminate some special page list accessors
Since page_list_move_tail(), page_list_splice_init(), and page_list_is_eol() are only used by relinquish_memory(), and that function can easily be changed to use more generic accessors, just eliminate them altogether. Signed-off-by: Jan Beulich <jbeulich@novell.com> --- 2009-01-30.orig/xen/arch/x86/domain.c 2009-01-30 10:22:31.000000000 +0100 +++ 2009-01-30/xen/arch/x86/domain.c 2009-02-04 11:19:13.000000000 +0100 @@ -1666,23 +1666,20 @@ int hypercall_xlat_continuation(unsigned static int relinquish_memory( struct domain *d, struct page_list_head *list, unsigned long type) { - struct page_info *page, *cur; + struct page_info *page; unsigned long x, y; int ret = 0; /* Use a recursive lock, as we may enter ''free_domheap_page''. */ spin_lock_recursive(&d->page_alloc_lock); - page = page_list_first(list); - while ( !page_list_is_eol(page, list) ) + while ( (page = page_list_remove_head(list)) ) { /* Grab a reference to the page so it won''t disappear from under us. */ if ( unlikely(!get_page(page, d)) ) { /* Couldn''t get a reference -- someone is freeing this page. */ - cur = page; - page = page_list_next(page, list); - page_list_move_tail(cur, list, &d->arch.relmem_list); + page_list_add_tail(page, &d->arch.relmem_list); continue; } @@ -1694,6 +1691,7 @@ static int relinquish_memory( break; case -EAGAIN: case -EINTR: + page_list_add(page, list); set_bit(_PGT_pinned, &page->u.inuse.type_info); put_page(page); goto out; @@ -1730,6 +1728,7 @@ static int relinquish_memory( case 0: break; case -EINTR: + page_list_add(page, list); page->u.inuse.type_info |= PGT_validated; if ( x & PGT_partial ) put_page(page); @@ -1737,6 +1736,7 @@ static int relinquish_memory( ret = -EAGAIN; goto out; case -EAGAIN: + page_list_add(page, list); page->u.inuse.type_info |= PGT_partial; if ( x & PGT_partial ) put_page(page); @@ -1753,11 +1753,9 @@ static int relinquish_memory( } } - /* Follow the list chain and /then/ potentially free the page. */ - cur = page; - page = page_list_next(page, list); - page_list_move_tail(cur, list, &d->arch.relmem_list); - put_page(cur); + /* Put the page on the list and /then/ potentially free it. */ + page_list_add_tail(page, &d->arch.relmem_list); + put_page(page); if ( hypercall_preempt_check() ) { @@ -1766,7 +1764,12 @@ static int relinquish_memory( } } - page_list_splice_init(&d->arch.relmem_list, list); + /* list is empty at this point. */ + if ( !page_list_empty(&d->arch.relmem_list) ) + { + *list = d->arch.relmem_list; + INIT_PAGE_LIST_HEAD(&d->arch.relmem_list); + } out: spin_unlock_recursive(&d->page_alloc_lock); --- 2009-01-30.orig/xen/include/xen/mm.h 2009-01-30 10:13:53.000000000 +0100 +++ 2009-01-30/xen/include/xen/mm.h 2009-02-04 10:59:39.000000000 +0100 @@ -125,12 +125,6 @@ page_list_prev(const struct page_info *p { return page != head->next ? mfn_to_page(page->list.prev) : NULL; } -static inline int -page_list_is_eol(const struct page_info *page, - const struct page_list_head *head) -{ - return !page; -} static inline void page_list_add(struct page_info *page, struct page_list_head *head) { @@ -214,13 +208,6 @@ page_list_del2(struct page_info *page, s prev->list.next = page->list.next; } } -static inline void -page_list_move_tail(struct page_info *page, struct page_list_head *list, - struct page_list_head *head) -{ - page_list_del(page, list); - page_list_add_tail(page, head); -} static inline struct page_info * page_list_remove_head(struct page_list_head *head) { @@ -231,19 +218,6 @@ page_list_remove_head(struct page_list_h return page; } -static inline void -page_list_splice_init(struct page_list_head *list, struct page_list_head *head) -{ - if ( !page_list_empty(list) ) - { - if ( head->next ) - head->tail->list.next = page_to_mfn(list->next); - else - head->next = list->next; - head->tail = list->tail; - INIT_PAGE_LIST_HEAD(list); - } -} #define page_list_for_each(pos, head) \ for ( pos = (head)->next; pos; pos = page_list_next(pos, head) ) @@ -266,19 +240,16 @@ page_list_splice_init(struct page_list_h struct page_info, list) # define page_list_next(pg, hd) list_entry((pg)->list.next, \ struct page_info, list) -# define page_list_is_eol(pg, hd) (&(pg)->list == (hd)) # 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_move_tail(pg, o, n) list_move_tail(&(pg)->list, n) # 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_splice_init list_splice_init # 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) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel