[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |