[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH 02/22] Use the foreign page tracking logic in netback.c. This isn't terribly useful, but will be necessary if anything else ever introduces mappings of foreign pages into the network stack.



Signed-off-by: Steven Smith <steven.smith@xxxxxxxxxx>
---
 drivers/xen/netback/netback.c |   31 ++++++++++++++++++++++++++-----
 1 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/drivers/xen/netback/netback.c b/drivers/xen/netback/netback.c
index fe6eff7..76641b1 100644
--- a/drivers/xen/netback/netback.c
+++ b/drivers/xen/netback/netback.c
@@ -37,6 +37,7 @@
 #include "common.h"
 #include <xen/balloon.h>
 #include <xen/interface/memory.h>
+#include <xen/live_maps.h>
 #include <linux/kthread.h>
 
 /*define NETBE_DEBUG_INTERRUPT*/
@@ -133,6 +134,8 @@ typedef unsigned int PEND_RING_IDX;
 static PEND_RING_IDX pending_prod, pending_cons;
 #define NR_PENDING_REQS (MAX_PENDING_REQS - pending_prod + pending_cons)
 
+static struct page_foreign_tracker *foreign_page_tracker;
+
 /* Freed TX SKBs get batched on this ring before return to pending_ring. */
 static u16 dealloc_ring[MAX_PENDING_REQS];
 static PEND_RING_IDX dealloc_prod, dealloc_cons;
@@ -438,16 +441,14 @@ static void netbk_gop_frag_copy(netif_t *netif,
 {
        gnttab_copy_t *copy_gop;
        struct netbk_rx_meta *meta;
-       int idx = netif_page_index(page);
 
        meta = npo->meta + npo->meta_prod - 1;
 
        copy_gop = npo->copy + npo->copy_prod++;
        copy_gop->flags = GNTCOPY_dest_gref;
-       if (idx > -1) {
-               struct pending_tx_info *src_pend = &pending_tx_info[idx];
-               copy_gop->source.domid = src_pend->netif->domid;
-               copy_gop->source.u.ref = src_pend->req.gref;
+       if (page_is_tracked(page)) {
+               lookup_tracker_page(page, &copy_gop->source.domid,
+                                   &copy_gop->source.u.ref);
                copy_gop->flags |= GNTCOPY_source_gref;
        } else {
                copy_gop->source.domid = DOMID_SELF;
@@ -1081,6 +1082,8 @@ inline static void net_tx_action_dealloc(void)
                        if (!phys_to_machine_mapping_valid(pfn))
                                continue;
 
+                       stop_tracking_page(mmap_pages[pending_idx]);
+
                        gnttab_set_unmap_op(gop, idx_to_kaddr(pending_idx),
                                            GNTMAP_host_map,
                                            grant_tx_handle[pending_idx]);
@@ -1219,6 +1222,13 @@ static gnttab_map_grant_ref_t 
*netbk_get_requests(netif_t *netif,
                netif_get(netif);
                pending_tx_info[pending_idx].netif = netif;
                frags[i].page = (void *)pending_idx;
+
+               start_tracking_page(foreign_page_tracker,
+                                   mmap_pages[pending_idx],
+                                   netif->domid,
+                                   pending_tx_info[pending_idx].req.gref,
+                                   pending_idx,
+                                   NULL);
        }
 
        return mop;
@@ -1526,6 +1536,13 @@ static void net_tx_action(void)
                                  txreq.gref, netif->domid);
                mop++;
 
+               start_tracking_page(foreign_page_tracker,
+                                   mmap_pages[pending_idx],
+                                   netif->domid,
+                                   txreq.gref,
+                                   pending_idx,
+                                   NULL);
+
                memcpy(&pending_tx_info[pending_idx].req,
                       &txreq, sizeof(txreq));
                pending_tx_info[pending_idx].netif = netif;
@@ -1804,9 +1821,13 @@ static int __init netback_init(void)
        netbk_tx_pending_timer.data = 0;
        netbk_tx_pending_timer.function = netbk_tx_pending_timeout;
 
+       foreign_page_tracker = alloc_page_foreign_tracker(MAX_PENDING_REQS);
+       if (!foreign_page_tracker)
+               return -ENOMEM;
        mmap_pages = alloc_empty_pages_and_pagevec(MAX_PENDING_REQS);
        if (mmap_pages == NULL) {
                printk("%s: out of memory\n", __FUNCTION__);
+               free_page_foreign_tracker(foreign_page_tracker);
                return -ENOMEM;
        }
 
-- 
1.6.3.1


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.