diff options
author | iap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk> | 2004-05-13 16:48:30 +0000 |
---|---|---|
committer | iap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk> | 2004-05-13 16:48:30 +0000 |
commit | 5a258f039214b3d6cc25477ba02a48ee3df14732 (patch) | |
tree | c4cc156ecd19c0e5bca7cfee069476113a50f6f6 /xenolinux-2.4.26-sparse | |
parent | 11c23eec7386c4c81ba99214006a0676d6b3372f (diff) | |
parent | 49c6b7cad5d16552fcc86a7aac8e2a505abd12a3 (diff) | |
download | xen-5a258f039214b3d6cc25477ba02a48ee3df14732.tar.gz xen-5a258f039214b3d6cc25477ba02a48ee3df14732.tar.bz2 xen-5a258f039214b3d6cc25477ba02a48ee3df14732.zip |
bitkeeper revision 1.905 (40a3a6de5FuSwJGHH_WcDAjtx8enEA)
Merge labyrinth.cl.cam.ac.uk:/auto/groups/xeno/BK/xeno.bk
into labyrinth.cl.cam.ac.uk:/auto/groups/xeno/users/iap10/xeno-clone/xeno.bk
Diffstat (limited to 'xenolinux-2.4.26-sparse')
3 files changed, 66 insertions, 58 deletions
diff --git a/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c b/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c index 8178608959..7a32149404 100644 --- a/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c +++ b/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c @@ -100,8 +100,8 @@ int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev) netif_t *netif = (netif_t *)dev->priv; s8 status = NETIF_RSP_OKAY; u16 size=0, id; - mmu_update_t mmu[6]; - pgd_t *pgd; pmd_t *pmd; pte_t *pte; + mmu_update_t mmu[4]; + multicall_entry_t mcl[2]; unsigned long vdata, mdata=0, new_mfn; /* Drop the packet if the target domain has no receive buffers. */ @@ -148,34 +148,37 @@ int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev) new_mfn = get_new_mfn(); - pgd = pgd_offset_k( (vdata & PAGE_MASK)); - pmd = pmd_offset(pgd, (vdata & PAGE_MASK)); - pte = pte_offset(pmd, (vdata & PAGE_MASK)); + mmu[0].ptr = (new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; + mmu[0].val = __pa(vdata) >> PAGE_SHIFT; - mmu[0].val = (unsigned long)(netif->domid<<16) & ~0xFFFFUL; - mmu[0].ptr = (unsigned long)(netif->domid<< 0) & ~0xFFFFUL; - mmu[1].val = (unsigned long)(netif->domid>>16) & ~0xFFFFUL; - mmu[1].ptr = (unsigned long)(netif->domid>>32) & ~0xFFFFUL; - mmu[0].ptr |= MMU_EXTENDED_COMMAND; - mmu[0].val |= MMUEXT_SET_SUBJECTDOM_L; + mmu[1].val = (unsigned long)(netif->domid<<16) & ~0xFFFFUL; + mmu[1].ptr = (unsigned long)(netif->domid<< 0) & ~0xFFFFUL; + mmu[2].val = (unsigned long)(netif->domid>>16) & ~0xFFFFUL; + mmu[2].ptr = (unsigned long)(netif->domid>>32) & ~0xFFFFUL; mmu[1].ptr |= MMU_EXTENDED_COMMAND; - mmu[1].val |= MMUEXT_SET_SUBJECTDOM_H; - - mmu[2].ptr = (mdata & PAGE_MASK) | MMU_EXTENDED_COMMAND; - mmu[2].val = MMUEXT_REASSIGN_PAGE; - - mmu[3].ptr = MMU_EXTENDED_COMMAND; - mmu[3].val = MMUEXT_RESET_SUBJECTDOM; - - mmu[4].ptr = virt_to_machine(pte); - mmu[4].val = (new_mfn << PAGE_SHIFT) | __PAGE_KERNEL; - - mmu[5].ptr = (new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE; - mmu[5].val = __pa(vdata) >> PAGE_SHIFT; - - if ( unlikely(HYPERVISOR_mmu_update(mmu, 6) < 0) ) + mmu[1].val |= MMUEXT_SET_SUBJECTDOM_L; + mmu[2].ptr |= MMU_EXTENDED_COMMAND; + mmu[2].val |= MMUEXT_SET_SUBJECTDOM_H; + + mmu[3].ptr = (mdata & PAGE_MASK) | MMU_EXTENDED_COMMAND; + mmu[3].val = MMUEXT_REASSIGN_PAGE; + + mcl[0].op = __HYPERVISOR_mmu_update; + mcl[0].args[0] = (unsigned long)mmu; + mcl[0].args[1] = 4; + mcl[1].op = __HYPERVISOR_update_va_mapping; + mcl[1].args[0] = vdata >> PAGE_SHIFT; + mcl[1].args[1] = (new_mfn << PAGE_SHIFT) | __PAGE_KERNEL; + mcl[1].args[2] = UVMF_INVLPG; + + (void)HYPERVISOR_multicall(mcl, 2); + if ( mcl[0].args[5] != 0 ) { DPRINTK("Failed MMU update transferring to DOM%llu\n", netif->domid); + (void)HYPERVISOR_update_va_mapping( + vdata >> PAGE_SHIFT, + (pte_t) { (mdata & PAGE_MASK) | __PAGE_KERNEL }, + UVMF_INVLPG); dealloc_mfn(new_mfn); status = NETIF_RSP_ERROR; goto out; @@ -183,6 +186,10 @@ int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev) phys_to_machine_mapping[__pa(vdata) >> PAGE_SHIFT] = new_mfn; + atomic_set(&(skb_shinfo(skb)->dataref), 1); + skb_shinfo(skb)->nr_frags = 0; + skb_shinfo(skb)->frag_list = NULL; + netif->stats.rx_bytes += size; netif->stats.rx_packets++; @@ -261,7 +268,6 @@ static void net_tx_action(unsigned long unused) netif_tx_request_t txreq; u16 pending_idx; NETIF_RING_IDX i; - pgprot_t prot = __pgprot(_PAGE_PRESENT|_PAGE_DIRTY|_PAGE_ACCESSED); struct page *page; while ( (NR_PENDING_REQS < MAX_PENDING_REQS) && @@ -334,10 +340,10 @@ static void net_tx_action(unsigned long unused) pending_idx = pending_ring[MASK_PEND_IDX(pending_cons)]; - if ( direct_remap_area_pages(&init_mm, - MMAP_VADDR(pending_idx), - txreq.addr & PAGE_MASK, - PAGE_SIZE, prot, netif->domid) != 0 ) + if ( HYPERVISOR_update_va_mapping_otherdomain( + MMAP_VADDR(pending_idx) >> PAGE_SHIFT, + (pte_t) { (txreq.addr & PAGE_MASK) | __PAGE_KERNEL }, + 0, netif->domid) != 0 ) { DPRINTK("Bad page frame\n"); make_tx_response(netif, txreq.id, NETIF_RSP_ERROR); @@ -352,7 +358,8 @@ static void net_tx_action(unsigned long unused) DPRINTK("Can't allocate a skb in start_xmit.\n"); make_tx_response(netif, txreq.id, NETIF_RSP_ERROR); netif_put(netif); - vmfree_area_pages(MMAP_VADDR(pending_idx), PAGE_SIZE); + HYPERVISOR_update_va_mapping(MMAP_VADDR(pending_idx) >> PAGE_SHIFT, + (pte_t) { 0 }, UVMF_INVLPG); break; } @@ -401,7 +408,8 @@ static void netif_page_release(struct page *page) netif = pending_netif[pending_idx]; - vmfree_area_pages(MMAP_VADDR(pending_idx), PAGE_SIZE); + HYPERVISOR_update_va_mapping(MMAP_VADDR(pending_idx) >> PAGE_SHIFT, + (pte_t) { 0 }, UVMF_INVLPG); spin_lock(&netif->tx_lock); make_tx_response(netif, pending_id[pending_idx], NETIF_RSP_OKAY); diff --git a/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c b/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c index cc5ac31e82..ff73952e88 100644 --- a/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c +++ b/xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c @@ -171,16 +171,6 @@ static void network_tx_buf_gc(struct net_device *dev) } -static inline pte_t *get_ppte(void *addr) -{ - pgd_t *pgd; pmd_t *pmd; pte_t *pte; - pgd = pgd_offset_k( (unsigned long)addr); - pmd = pmd_offset(pgd, (unsigned long)addr); - pte = pte_offset(pmd, (unsigned long)addr); - return pte; -} - - static void network_alloc_rx_buffers(struct net_device *dev) { unsigned short id; @@ -190,7 +180,6 @@ static void network_alloc_rx_buffers(struct net_device *dev) dom_mem_op_t op; unsigned long pfn_array[NETIF_RX_RING_SIZE]; int ret, nr_pfns = 0; - pte_t *pte; /* Make sure the batch is large enough to be worthwhile (1/2 ring). */ if ( unlikely((i - np->rx_resp_cons) > (NETIF_RX_RING_SIZE/2)) || @@ -212,9 +201,9 @@ static void network_alloc_rx_buffers(struct net_device *dev) np->rx->ring[MASK_NET_RX_IDX(i)].req.id = id; - pte = get_ppte(skb->head); - pfn_array[nr_pfns++] = pte->pte_low >> PAGE_SHIFT; - queue_l1_entry_update(pte, 0); + pfn_array[nr_pfns++] = virt_to_machine(skb->head) >> PAGE_SHIFT; + HYPERVISOR_update_va_mapping((unsigned long)skb->head >> PAGE_SHIFT, + (pte_t) { 0 }, UVMF_INVLPG); } while ( (++i - np->rx_resp_cons) != NETIF_RX_RING_SIZE ); @@ -309,8 +298,7 @@ static void netif_int(int irq, void *dev_id, struct pt_regs *ptregs) struct sk_buff *skb; netif_rx_response_t *rx; NETIF_RING_IDX i; - mmu_update_t mmu[2]; - pte_t *pte; + mmu_update_t mmu; spin_lock_irqsave(&np->tx_lock, flags); network_tx_buf_gc(dev); @@ -334,13 +322,14 @@ static void netif_int(int irq, void *dev_id, struct pt_regs *ptregs) } /* Remap the page. */ - pte = get_ppte(skb->head); - mmu[0].ptr = virt_to_machine(pte); - mmu[0].val = (rx->addr & PAGE_MASK) | __PAGE_KERNEL; - mmu[1].ptr = (rx->addr & PAGE_MASK) | MMU_MACHPHYS_UPDATE; - mmu[1].val = __pa(skb->head) >> PAGE_SHIFT; - if ( HYPERVISOR_mmu_update(mmu, 2) != 0 ) + mmu.ptr = (rx->addr & PAGE_MASK) | MMU_MACHPHYS_UPDATE; + mmu.val = __pa(skb->head) >> PAGE_SHIFT; + if ( HYPERVISOR_mmu_update(&mmu, 1) != 0 ) BUG(); + HYPERVISOR_update_va_mapping((unsigned long)skb->head >> PAGE_SHIFT, + (pte_t) { (rx->addr & PAGE_MASK) | + __PAGE_KERNEL }, + 0); phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = rx->addr >> PAGE_SHIFT; @@ -352,9 +341,6 @@ static void netif_int(int irq, void *dev_id, struct pt_regs *ptregs) atomic_set(&(skb_shinfo(skb)->dataref), 1); skb_shinfo(skb)->nr_frags = 0; skb_shinfo(skb)->frag_list = NULL; - - phys_to_machine_mapping[virt_to_phys(skb->head) >> PAGE_SHIFT] = - (*(unsigned long *)get_ppte(skb->head)) >> PAGE_SHIFT; skb->data = skb->tail = skb->head + (rx->addr & ~PAGE_MASK); skb_put(skb, rx->status); diff --git a/xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h b/xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h index fbcf0672ec..dddfc25cc3 100644 --- a/xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h +++ b/xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h @@ -459,4 +459,18 @@ static inline int HYPERVISOR_physdev_op(void *physdev_op) return ret; } +static inline int HYPERVISOR_update_va_mapping_otherdomain( + unsigned long page_nr, pte_t new_val, unsigned long flags, domid_t domid) +{ + int ret; + __asm__ __volatile__ ( + TRAP_INSTR + : "=a" (ret) : "0" (__HYPERVISOR_update_va_mapping_otherdomain), + "b" (page_nr), "c" ((new_val).pte_low), "d" (flags), + "S" ((unsigned long)domid), "D" ((unsigned long)(domid>>32)) : + "memory" ); + + return ret; +} + #endif /* __HYPERVISOR_H__ */ |