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

[Xen-changelog] [xen-unstable] [NET] front: Fix receive path for auto-translated guests, so that



# HG changeset patch
# User kaf24@xxxxxxxxxxxxxxxxxxxxx
# Node ID a629952ac766c781a71a310e5f8325c2b609f597
# Parent  03fd2accb4d9cbb50c69e6b183a76ac83fff0145
[NET] front: Fix receive path for auto-translated guests, so that
driver balloon allowance is properly accounted.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c |   59 ++++++++++---------
 1 files changed, 33 insertions(+), 26 deletions(-)

diff -r 03fd2accb4d9 -r a629952ac766 
linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c
--- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Sat Aug 19 
11:13:17 2006 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c      Sat Aug 19 
11:39:04 2006 +0100
@@ -1018,8 +1018,10 @@ int xennet_get_extras(struct netfront_in
                                WPRINTK("Invalid extra type: %d\n",
                                        extra->type);
                        err = -EINVAL;
-               } else
-                       memcpy(&extras[extra->type - 1], extra, sizeof(*extra));
+               } else {
+                       memcpy(&extras[extra->type - 1], extra,
+                              sizeof(*extra));
+               }
 
                skb = xennet_get_rx_skb(np, cons);
                ref = xennet_get_rx_ref(np, cons);
@@ -1032,9 +1034,10 @@ int xennet_get_extras(struct netfront_in
 
 static int xennet_get_responses(struct netfront_info *np,
                                struct netfront_rx_info *rinfo, RING_IDX rp,
-                               struct sk_buff_head *list, int *mcl_offset_p)
-{
-       int mcl_offset = *mcl_offset_p;
+                               struct sk_buff_head *list,
+                               int *pages_flipped_p)
+{
+       int pages_flipped = *pages_flipped_p;
        struct mmu_update *mmu;
        struct multicall_entry *mcl;
        struct netif_rx_response *rx = &rinfo->rx;
@@ -1080,7 +1083,8 @@ static int xennet_get_responses(struct n
                         * headroom, ... */
                        if (!(mfn = gnttab_end_foreign_transfer_ref(ref))) {
                                if (net_ratelimit())
-                                       WPRINTK("Unfulfilled rx req (id=%d, 
st=%d).\n",
+                                       WPRINTK("Unfulfilled rx req "
+                                               "(id=%d, st=%d).\n",
                                                rx->id, rx->status);
                                xennet_move_rx_slot(np, skb, ref);
                                err = -ENOMEM;
@@ -1094,8 +1098,8 @@ static int xennet_get_responses(struct n
                                unsigned long pfn = page_to_pfn(page);
                                void *vaddr = page_address(page);
 
-                               mcl = np->rx_mcl + mcl_offset;
-                               mmu = np->rx_mmu + mcl_offset;
+                               mcl = np->rx_mcl + pages_flipped;
+                               mmu = np->rx_mmu + pages_flipped;
 
                                MULTI_update_va_mapping(mcl,
                                                        (unsigned long)vaddr,
@@ -1106,10 +1110,9 @@ static int xennet_get_responses(struct n
                                        | MMU_MACHPHYS_UPDATE;
                                mmu->val = pfn;
 
-                               mcl_offset++;
-
                                set_phys_to_machine(pfn, mfn);
                        }
+                       pages_flipped++;
                } else {
                        ret = gnttab_end_foreign_access_ref(ref, 0);
                        BUG_ON(!ret);
@@ -1142,7 +1145,7 @@ next:
                err = -E2BIG;
        }
 
-       *mcl_offset_p = mcl_offset;
+       *pages_flipped_p = pages_flipped;
 
        return err;
 }
@@ -1225,7 +1228,7 @@ static int netif_poll(struct net_device 
        struct sk_buff_head tmpq;
        unsigned long flags;
        unsigned int len;
-       int pages_done;
+       int pages_flipped = 0;
        int err;
 
        spin_lock(&np->rx_lock);
@@ -1244,13 +1247,14 @@ static int netif_poll(struct net_device 
        rp = np->rx.sring->rsp_prod;
        rmb(); /* Ensure we see queued responses up to 'rp'. */
 
-       for (i = np->rx.rsp_cons, work_done = 0, pages_done = 0;
+       for (i = np->rx.rsp_cons, work_done = 0;
             (i != rp) && (work_done < budget);
             np->rx.rsp_cons = ++i, work_done++) {
                memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
                memset(extras, 0, sizeof(extras));
 
-               err = xennet_get_responses(np, &rinfo, rp, &tmpq, &pages_done);
+               err = xennet_get_responses(np, &rinfo, rp, &tmpq,
+                                          &pages_flipped);
 
                if (unlikely(err)) {
 err:
@@ -1335,18 +1339,21 @@ err:
                __skb_queue_tail(&rxq, skb);
        }
 
-       /* Some pages are no longer absent... */
-       balloon_update_driver_allowance(-pages_done);
-
-       /* Do all the remapping work, and M2P updates, in one big hypercall. */
-       if (likely(pages_done)) {
-               mcl = np->rx_mcl + pages_done;
-               mcl->op = __HYPERVISOR_mmu_update;
-               mcl->args[0] = (unsigned long)np->rx_mmu;
-               mcl->args[1] = pages_done;
-               mcl->args[2] = 0;
-               mcl->args[3] = DOMID_SELF;
-               (void)HYPERVISOR_multicall(np->rx_mcl, pages_done + 1);
+       if (pages_flipped) {
+               /* Some pages are no longer absent... */
+               balloon_update_driver_allowance(-pages_flipped);
+
+               /* Do all the remapping work and M2P updates. */
+               if (!xen_feature(XENFEAT_auto_translated_physmap)) {
+                       mcl = np->rx_mcl + pages_flipped;
+                       mcl->op = __HYPERVISOR_mmu_update;
+                       mcl->args[0] = (unsigned long)np->rx_mmu;
+                       mcl->args[1] = pages_flipped;
+                       mcl->args[2] = 0;
+                       mcl->args[3] = DOMID_SELF;
+                       (void)HYPERVISOR_multicall(np->rx_mcl,
+                                                  pages_flipped + 1);
+               }
        }
 
        while ((skb = __skb_dequeue(&errq)))

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


 


Rackspace

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