From 0262d1a48280b2b3d11d74ccb0660a229894c4be Mon Sep 17 00:00:00 2001 From: Steven Smith Date: Tue, 30 Jun 2009 12:55:47 +0100 Subject: [PATCH] patch backend-track-pages-with-page-flags.patch --- drivers/xen/blkback/blkback.c | 3 +++ drivers/xen/blktap/blktap.c | 3 +++ drivers/xen/core/gnttab.c | 2 ++ drivers/xen/netback/netback.c | 10 ++++++++-- include/linux/page-flags.h | 4 ++++ 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/drivers/xen/blkback/blkback.c b/drivers/xen/blkback/blkback.c index 6e9ef7b7..612f7c9b 100644 --- a/drivers/xen/blkback/blkback.c +++ b/drivers/xen/blkback/blkback.c @@ -623,6 +623,9 @@ static int __init blkif_init(void) mmap_pages, GFP_KERNEL); pending_pages = alloc_empty_pages_and_pagevec(mmap_pages); + for(i = 0; i < mmap_pages; i++) + SetPageBlkback(pending_pages[i]); + if (!pending_reqs || !pending_grant_handles || !pending_pages) goto out_of_memory; diff --git a/drivers/xen/blktap/blktap.c b/drivers/xen/blktap/blktap.c index 752382a8..cd555a8e 100644 --- a/drivers/xen/blktap/blktap.c +++ b/drivers/xen/blktap/blktap.c @@ -876,6 +876,9 @@ static int req_increase(void) DPRINTK("%s: reqs=%d, pages=%d\n", __FUNCTION__, blkif_reqs, mmap_pages); + for (i = 0; i < mmap_pages; i++) + SetPageBlkback(foreign_pages[mmap_alloc][i]); + for (i = 0; i < MAX_PENDING_REQS; i++) { list_add_tail(&pending_reqs[mmap_alloc][i].free_list, &pending_free); diff --git a/drivers/xen/core/gnttab.c b/drivers/xen/core/gnttab.c index 82c2e644..e6b4917b 100644 --- a/drivers/xen/core/gnttab.c +++ b/drivers/xen/core/gnttab.c @@ -593,6 +593,8 @@ int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep) *pagep = new_page; SetPageForeign(page, gnttab_page_free); + ClearPageNetback(page); + ClearPageBlkback(page); page->mapping = NULL; out: diff --git a/drivers/xen/netback/netback.c b/drivers/xen/netback/netback.c index efa1d17d..cb2d5622 100644 --- a/drivers/xen/netback/netback.c +++ b/drivers/xen/netback/netback.c @@ -866,8 +866,13 @@ static void tx_credit_callback(unsigned long data) static inline int copy_pending_req(PEND_RING_IDX pending_idx) { - return gnttab_copy_grant_page(grant_tx_handle[pending_idx], - &mmap_pages[pending_idx]); + int err = gnttab_copy_grant_page(grant_tx_handle[pending_idx], + &mmap_pages[pending_idx]); + + if (!err) + SetPageNetback(mmap_pages[pending_idx]); + + return err; } inline static void net_tx_action_dealloc(void) @@ -1598,6 +1603,7 @@ static int __init netback_init(void) for (i = 0; i < MAX_PENDING_REQS; i++) { page = mmap_pages[i]; SetPageForeign(page, netif_page_release); + SetPageNetback(page); netif_set_page_index(page, i); INIT_LIST_HEAD(&pending_inuse[i].list); } diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index ef187aa8..1d4e02da 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -104,6 +104,8 @@ enum pageflags { * bad_page() checks include this bit. * Should not use PG_arch_1 as that may have * a different purpose elsewhere. */ + PG_netback, /* Page is owned by netback */ + PG_blkback, /* Page is owned by blkback */ #endif __NR_PAGEFLAGS, @@ -302,6 +304,8 @@ static inline void PageForeignDestructor(struct page *page, unsigned int order) { ((void (*)(struct page *, unsigned int))page->index)(page, order); } +PAGEFLAG(Blkback, blkback) +PAGEFLAG(Netback, netback) #endif extern void cancel_dirty_page(struct page *page, unsigned int account_size); -- 2.39.5