aboutsummaryrefslogtreecommitdiffstats
path: root/xenolinux-2.4.26-sparse
diff options
context:
space:
mode:
authoriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2004-05-13 16:48:30 +0000
committeriap10@labyrinth.cl.cam.ac.uk <iap10@labyrinth.cl.cam.ac.uk>2004-05-13 16:48:30 +0000
commit5a258f039214b3d6cc25477ba02a48ee3df14732 (patch)
treec4cc156ecd19c0e5bca7cfee069476113a50f6f6 /xenolinux-2.4.26-sparse
parent11c23eec7386c4c81ba99214006a0676d6b3372f (diff)
parent49c6b7cad5d16552fcc86a7aac8e2a505abd12a3 (diff)
downloadxen-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')
-rw-r--r--xenolinux-2.4.26-sparse/arch/xen/drivers/netif/backend/main.c74
-rw-r--r--xenolinux-2.4.26-sparse/arch/xen/drivers/netif/frontend/main.c36
-rw-r--r--xenolinux-2.4.26-sparse/include/asm-xen/hypervisor.h14
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__ */