[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Allow use of grant tables for netdev tx+rx rings. Code is kinda
# HG changeset patch # User smh22@xxxxxxxxxxxxxxxxxxxx # Node ID e59f045986205ca5ce4b95e47ed4440e9ab47e67 # Parent da515995a281c2b6831ce4f1cee5ee4b10f24b31 Allow use of grant tables for netdev tx+rx rings. Code is kinda ugly due at least in part to the fact that we still have separate _TX and _RX grant config options - expect this to be unified soon. Signed-off-by: Steven Hand <steven@xxxxxxxxxxxxx> diff -r da515995a281 -r e59f04598620 linux-2.6-xen-sparse/drivers/xen/netback/common.h --- a/linux-2.6-xen-sparse/drivers/xen/netback/common.h Sun Aug 14 17:44:30 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/common.h Sun Aug 14 20:34:13 2005 @@ -20,6 +20,13 @@ #include <asm/io.h> #include <asm/pgalloc.h> +#if defined(CONFIG_XEN_NETDEV_GRANT_TX) || defined(CONFIG_XEN_NETDEV_GRANT_RX) +#include <asm-xen/xen-public/grant_table.h> +#include <asm-xen/gnttab.h> +#endif + + + #if 0 #define ASSERT(_p) \ if ( !(_p) ) { printk("Assertion '%s' failed, line %d, file %s", #_p , \ @@ -40,7 +47,17 @@ /* Physical parameters of the comms window. */ unsigned long tx_shmem_frame; +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + u16 tx_shmem_handle; + memory_t tx_shmem_vaddr; + grant_ref_t tx_shmem_ref; +#endif unsigned long rx_shmem_frame; +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + u16 rx_shmem_handle; + memory_t rx_shmem_vaddr; + grant_ref_t rx_shmem_ref; +#endif unsigned int evtchn; /* The shared rings and indexes. */ diff -r da515995a281 -r e59f04598620 linux-2.6-xen-sparse/drivers/xen/netback/interface.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Sun Aug 14 17:44:30 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/interface.c Sun Aug 14 20:34:13 2005 @@ -71,12 +71,31 @@ netif_t *netif = (netif_t *)arg; ctrl_msg_t cmsg; netif_be_disconnect_t disc; +#if defined(CONFIG_XEN_NETDEV_GRANT_RX) || defined(CONFIG_XEN_NETDEV_GRANT_TX) + struct gnttab_unmap_grant_ref op; +#endif /* * These can't be done in netif_disconnect() because at that point there * may be outstanding requests in the network stack whose asynchronous * responses must still be notified to the remote driver. */ + +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + op.host_addr = netif->tx_shmem_vaddr; + op.handle = netif->tx_shmem_handle; + op.dev_bus_addr = 0; + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); +#endif + +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + op.host_addr = netif->rx_shmem_vaddr; + op.handle = netif->rx_shmem_handle; + op.dev_bus_addr = 0; + BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1)); +#endif + + vfree(netif->tx); /* Frees netif->rx as well. */ /* Construct the deferred response message. */ @@ -275,40 +294,61 @@ unsigned long tx_shmem_frame = connect->tx_shmem_frame; unsigned long rx_shmem_frame = connect->rx_shmem_frame; struct vm_struct *vma; - pgprot_t prot; +#if !defined(CONFIG_XEN_NETDEV_GRANT_TX)||!defined(CONFIG_XEN_NETDEV_GRANT_RX) + pgprot_t prot = __pgprot(_KERNPG_TABLE); int error; +#endif netif_t *netif; netif = netif_find_by_handle(domid, handle); - if ( unlikely(netif == NULL) ) - { + if ( unlikely(netif == NULL) ) { DPRINTK("netif_connect attempted for non-existent netif (%u,%u)\n", connect->domid, connect->netif_handle); connect->status = NETIF_BE_STATUS_INTERFACE_NOT_FOUND; return; } - if ( netif->status != DISCONNECTED ) - { + if ( netif->status != DISCONNECTED ) { connect->status = NETIF_BE_STATUS_INTERFACE_CONNECTED; return; } - if ( (vma = get_vm_area(2*PAGE_SIZE, VM_IOREMAP)) == NULL ) - { + if ( (vma = get_vm_area(2*PAGE_SIZE, VM_IOREMAP)) == NULL ) { connect->status = NETIF_BE_STATUS_OUT_OF_MEMORY; return; } - prot = __pgprot(_KERNPG_TABLE); - error = direct_remap_area_pages(&init_mm, - VMALLOC_VMADDR(vma->addr), - tx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, - prot, domid); - error |= direct_remap_area_pages(&init_mm, - VMALLOC_VMADDR(vma->addr) + PAGE_SIZE, - rx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, - prot, domid); + +#if defined(CONFIG_XEN_NETDEV_GRANT_TX) + { + struct gnttab_map_grant_ref op; + int tx_ref = connect->tx_shmem_ref; + + /* Map: Use the Grant table reference */ + op.host_addr = VMALLOC_VMADDR(vma->addr); + op.flags = GNTMAP_host_map; + op.ref = tx_ref; + op.dom = domid; + + if ((HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) < 0) || + (op.handle < 0)) { + DPRINTK(" Grant table operation failure !\n"); + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + vfree(vma->addr); + return; + } + + netif->tx_shmem_ref = tx_ref; + netif->tx_shmem_handle = op.handle; + netif->tx_shmem_vaddr = VMALLOC_VMADDR(vma->addr); + } + + +#else + error = direct_remap_area_pages(&init_mm, + VMALLOC_VMADDR(vma->addr), + tx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, + prot, domid); if ( error != 0 ) { if ( error == -ENOMEM ) @@ -320,6 +360,57 @@ vfree(vma->addr); return; } +#endif + + +#if defined(CONFIG_XEN_NETDEV_GRANT_RX) + { + struct gnttab_map_grant_ref op; + int rx_ref = connect->rx_shmem_ref; + + + /* Map: Use the Grant table reference */ + op.host_addr = VMALLOC_VMADDR(vma->addr) + PAGE_SIZE; + op.flags = GNTMAP_host_map; + op.ref = rx_ref; + op.dom = domid; + + if ((HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1) < 0) || + (op.handle < 0)) { + DPRINTK(" Grant table operation failure !\n"); + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + vfree(vma->addr); + return; + } + + DPRINTK(" Grant table operation failure !\n"); + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + vfree(vma->addr); + return; + } + + netif->rx_shmem_ref = rx_ref; + netif->rx_shmem_handle = handle; + netif->rx_shmem_vaddr = VMALLOC_VMADDR(vma->addr) + PAGE_SIZE; + } +#else + error = direct_remap_area_pages(&init_mm, + VMALLOC_VMADDR(vma->addr) + PAGE_SIZE, + rx_shmem_frame<<PAGE_SHIFT, PAGE_SIZE, + prot, domid); + if ( error != 0 ) + { + if ( error == -ENOMEM ) + connect->status = NETIF_BE_STATUS_OUT_OF_MEMORY; + else if ( error == -EFAULT ) + connect->status = NETIF_BE_STATUS_MAPPING_ERROR; + else + connect->status = NETIF_BE_STATUS_ERROR; + vfree(vma->addr); + return; + } + +#endif netif->evtchn = evtchn; netif->tx_shmem_frame = tx_shmem_frame; diff -r da515995a281 -r e59f04598620 linux-2.6-xen-sparse/drivers/xen/netback/netback.c --- a/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Sun Aug 14 17:44:30 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netback/netback.c Sun Aug 14 20:34:13 2005 @@ -518,7 +518,7 @@ gop++; } BUG_ON(HYPERVISOR_grant_table_op( - GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops)); + GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops)); #else mcl = tx_mcl; while ( dc != dp ) @@ -697,9 +697,9 @@ skb_reserve(skb, 16); #ifdef CONFIG_XEN_NETDEV_GRANT_TX mop->host_addr = MMAP_VADDR(pending_idx); - mop->dom = netif->domid; - mop->ref = txreq.addr >> PAGE_SHIFT; - mop->flags = GNTMAP_host_map | GNTMAP_readonly; + mop->dom = netif->domid; + mop->ref = txreq.addr >> PAGE_SHIFT; + mop->flags = GNTMAP_host_map | GNTMAP_readonly; mop++; #else MULTI_update_va_mapping_otherdomain( @@ -752,7 +752,12 @@ /* Check the remap error code. */ #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if ( unlikely(mop->dev_bus_addr == 0) ) + /* + XXX SMH: error returns from grant operations are pretty poorly + specified/thought out, but the below at least conforms with + what the rest of the code uses. + */ + if ( unlikely(mop->handle < 0) ) { printk(KERN_ALERT "#### netback grant fails\n"); make_tx_response(netif, txreq.id, NETIF_RSP_ERROR); diff -r da515995a281 -r e59f04598620 linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c --- a/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Sun Aug 14 17:44:30 2005 +++ b/linux-2.6-xen-sparse/drivers/xen/netfront/netfront.c Sun Aug 14 20:34:13 2005 @@ -59,7 +59,7 @@ #include <asm-xen/gnttab.h> #ifdef GRANT_DEBUG static void -dump_packet(int tag, u32 addr, u32 ap) +dump_packet(int tag, void *addr, u32 ap) { unsigned char *p = (unsigned char *)ap; int i; @@ -200,7 +200,7 @@ [BEST_CONNECTED] = "connected", }; -#if DEBUG +#ifdef DEBUG #define DPRINTK(fmt, args...) \ printk(KERN_ALERT "xen_net (%s:%d) " fmt, __FUNCTION__, __LINE__, ##args) #else @@ -356,8 +356,12 @@ id = np->tx->ring[MASK_NETIF_TX_IDX(i)].resp.id; skb = np->tx_skbs[id]; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (gnttab_query_foreign_access(grant_tx_ref[id]) != 0) { - printk(KERN_ALERT "netfront: query foreign access\n"); + if (unlikey(gnttab_query_foreign_access(grant_tx_ref[id]) != 0)) { + /* other domain is still using this grant - shouldn't happen + but if it does, we'll try to reclaim the grant later */ + printk(KERN_ALERT "network_tx_buf_gc: warning -- grant " + "still in use by backend domain.\n"); + goto out; } gnttab_end_foreign_access(grant_tx_ref[id], GNTMAP_readonly); gnttab_release_grant_reference(&gref_tx_head, grant_tx_ref[id]); @@ -382,6 +386,7 @@ mb(); } while (prod != np->tx->resp_prod); + out: if (np->tx_full && ((np->tx->req_prod - prod) < NETIF_TX_RING_SIZE)) { np->tx_full = 0; if (np->user_state == UST_OPEN) @@ -433,13 +438,15 @@ np->rx->ring[MASK_NETIF_RX_IDX(req_prod + i)].req.id = id; #ifdef CONFIG_XEN_NETDEV_GRANT_RX - if ((ref = gnttab_claim_grant_reference(&gref_rx_head, gref_rx_terminal)) < 0) { + if (unlikely((ref = gnttab_claim_grant_reference(&gref_rx_head, + gref_rx_terminal)) < 0)) { printk(KERN_ALERT "#### netfront can't claim rx reference\n"); BUG(); } grant_rx_ref[id] = ref; gnttab_grant_foreign_transfer_ref(ref, rdomid, - virt_to_machine(skb->head) >> PAGE_SHIFT); + virt_to_machine( + skb->head) >> PAGE_SHIFT); np->rx->ring[MASK_NETIF_RX_IDX(req_prod + i)].req.gref = ref; #endif rx_pfn_array[i] = virt_to_machine(skb->head) >> PAGE_SHIFT; @@ -528,7 +535,8 @@ tx->id = id; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if ((ref = gnttab_claim_grant_reference(&gref_tx_head, gref_tx_terminal)) < 0) { + if (unlikely((ref = gnttab_claim_grant_reference(&gref_tx_head, + gref_tx_terminal)) < 0)) { printk(KERN_ALERT "#### netfront can't claim tx grant reference\n"); BUG(); } @@ -638,7 +646,6 @@ #ifdef CONFIG_XEN_NETDEV_GRANT_RX ref = grant_rx_ref[rx->id]; grant_rx_ref[rx->id] = GRANT_INVALID_REF; - mfn = gnttab_end_foreign_transfer(ref); gnttab_release_grant_reference(&gref_rx_head, ref); #endif @@ -674,18 +681,20 @@ pfn_pte_ma(mfn, PAGE_KERNEL), 0); #else MULTI_update_va_mapping(mcl, (unsigned long)skb->head, - pfn_pte_ma(rx->addr >> PAGE_SHIFT, PAGE_KERNEL), 0); + pfn_pte_ma(rx->addr >> PAGE_SHIFT, + PAGE_KERNEL), 0); #endif mcl++; +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = mfn; +#else phys_to_machine_mapping[__pa(skb->head) >> PAGE_SHIFT] = -#ifdef CONFIG_XEN_NETDEV_GRANT_RX - mfn; -#else rx->addr >> PAGE_SHIFT; #endif + #ifdef GRANT_DEBUG - printk(KERN_ALERT "#### rx_poll enqueue vdata=%08x mfn=%08x ref=%04x\n", + printk(KERN_ALERT "#### rx_poll enqueue vdata=%p mfn=%lu ref=%x\n", skb->data, mfn, ref); #endif __skb_queue_tail(&rxq, skb); @@ -707,9 +716,9 @@ while ((skb = __skb_dequeue(&rxq)) != NULL) { #ifdef GRANT_DEBUG - printk(KERN_ALERT "#### rx_poll dequeue vdata=%08x mfn=%08x\n", - skb->data, virt_to_machine(skb->data)>>PAGE_SHIFT); - dump_packet('d', skb->data, (unsigned long)skb->data); + printk(KERN_ALERT "#### rx_poll dequeue vdata=%p mfn=%lu\n", + skb->data, virt_to_machine(skb->data)>>PAGE_SHIFT); + dump_packet('d', skb->data, (unsigned long)skb->data); #endif /* * Enough room in skbuff for the data we were passed? Also, Linux @@ -884,7 +893,7 @@ static void vif_show(struct net_private *np) { -#if DEBUG +#ifdef DEBUG if (np) { IPRINTK("<vif handle=%u %s(%s) evtchn=%u tx=%p rx=%p>\n", np->handle, @@ -911,8 +920,29 @@ msg->handle = np->handle; msg->tx_shmem_frame = (virt_to_machine(np->tx) >> PAGE_SHIFT); +#ifdef CONFIG_XEN_NETDEV_GRANT_TX + msg->tx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_tx_head, + gref_tx_terminal); + if(msg->tx_shmem_ref < 0) { + printk(KERN_ALERT "#### netfront can't claim tx_shmem reference\n"); + BUG(); + } + gnttab_grant_foreign_access_ref (msg->tx_shmem_ref, rdomid, + msg->tx_shmem_frame, 0); +#endif + msg->rx_shmem_frame = (virt_to_machine(np->rx) >> PAGE_SHIFT); - +#ifdef CONFIG_XEN_NETDEV_GRANT_RX + msg->rx_shmem_ref = (u32)gnttab_claim_grant_reference(&gref_rx_head, + gref_rx_terminal); + if(msg->rx_shmem_ref < 0) { + printk(KERN_ALERT "#### netfront can't claim rx_shmem reference\n"); + BUG(); + } + gnttab_grant_foreign_access_ref (msg->rx_shmem_ref, rdomid, + msg->rx_shmem_frame, 0); +#endif + ctrl_if_send_message_block(&cmsg, NULL, 0, TASK_UNINTERRUPTIBLE); } @@ -1380,20 +1410,22 @@ if (xen_start_info.flags & SIF_INITDOMAIN) return 0; #ifdef CONFIG_XEN_NETDEV_GRANT_TX - if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE, + /* A grant for every ring slot, plus one for the ring itself */ + if (gnttab_alloc_grant_references(NETIF_TX_RING_SIZE + 1, &gref_tx_head, &gref_tx_terminal) < 0) { printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n"); return 1; } - printk(KERN_ALERT "#### netfront tx using grant tables\n"); + printk(KERN_ALERT "Netdev frontend (TX) is using grant tables.\n"); #endif #ifdef CONFIG_XEN_NETDEV_GRANT_RX - if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE, + /* A grant for every ring slot, plus one for the ring itself */ + if (gnttab_alloc_grant_references(NETIF_RX_RING_SIZE + 1, &gref_rx_head, &gref_rx_terminal) < 0) { printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n"); return 1; } - printk(KERN_ALERT "#### netfront rx using grant tables\n"); + printk(KERN_ALERT "Netdev frontend (RX) is using grant tables.\n"); #endif if ((err = xennet_proc_init()) != 0) diff -r da515995a281 -r e59f04598620 tools/python/xen/lowlevel/xu/xu.c --- a/tools/python/xen/lowlevel/xu/xu.c Sun Aug 14 17:44:30 2005 +++ b/tools/python/xen/lowlevel/xu/xu.c Sun Aug 14 20:34:13 2005 @@ -655,7 +655,9 @@ case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_CONNECT): C2P(netif_fe_interface_connect_t, handle, Int, Long); C2P(netif_fe_interface_connect_t, tx_shmem_frame, Int, Long); + C2P(netif_fe_interface_connect_t, tx_shmem_ref, Int, Long); C2P(netif_fe_interface_connect_t, rx_shmem_frame, Int, Long); + C2P(netif_fe_interface_connect_t, rx_shmem_ref, Int, Long); return dict; case TYPE(CMSG_NETIF_FE, CMSG_NETIF_FE_INTERFACE_DISCONNECT): C2P(netif_fe_interface_disconnect_t, handle, Int, Long); @@ -681,7 +683,9 @@ C2P(netif_be_connect_t, domid, Int, Long); C2P(netif_be_connect_t, netif_handle, Int, Long); C2P(netif_be_connect_t, tx_shmem_frame, Int, Long); + C2P(netif_be_connect_t, tx_shmem_ref, Int, Long); C2P(netif_be_connect_t, rx_shmem_frame, Int, Long); + C2P(netif_be_connect_t, rx_shmem_ref, Int, Long); C2P(netif_be_connect_t, evtchn, Int, Long); C2P(netif_be_connect_t, status, Int, Long); return dict; @@ -903,8 +907,10 @@ P2C(netif_be_connect_t, domid, u32); P2C(netif_be_connect_t, netif_handle, u32); P2C(netif_be_connect_t, tx_shmem_frame, memory_t); + P2C(netif_be_connect_t, tx_shmem_ref, u32); P2C(netif_be_connect_t, rx_shmem_frame, memory_t); - P2C(netif_be_connect_t, evtchn, u16); + P2C(netif_be_connect_t, rx_shmem_ref, u32); + P2C(netif_be_connect_t, evtchn, u16); break; case TYPE(CMSG_NETIF_BE, CMSG_NETIF_BE_DISCONNECT): P2C(netif_be_disconnect_t, domid, u32); diff -r da515995a281 -r e59f04598620 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Sun Aug 14 17:44:30 2005 +++ b/tools/python/xen/xend/XendDomainInfo.py Sun Aug 14 20:34:13 2005 @@ -593,7 +593,7 @@ def delete(self): """Delete the vm's db. """ - if self.dom_get(self.id): + if dom_get(self.id): return self.id = None self.saveToDB(sync=True) diff -r da515995a281 -r e59f04598620 tools/python/xen/xend/server/netif.py --- a/tools/python/xen/xend/server/netif.py Sun Aug 14 17:44:30 2005 +++ b/tools/python/xen/xend/server/netif.py Sun Aug 14 20:34:13 2005 @@ -421,7 +421,9 @@ 'netif_handle' : self.vif, 'evtchn' : self.getEventChannelBackend(), 'tx_shmem_frame' : val['tx_shmem_frame'], - 'rx_shmem_frame' : val['rx_shmem_frame'] }) + 'tx_shmem_ref' : val['tx_shmem_ref'], + 'rx_shmem_frame' : val['rx_shmem_frame'], + 'rx_shmem_ref' : val['rx_shmem_ref'] }) msg = self.backendChannel.requestResponse(msg) #todo: check return status self.status = NETIF_INTERFACE_STATUS_CONNECTED diff -r da515995a281 -r e59f04598620 xen/common/grant_table.c --- a/xen/common/grant_table.c Sun Aug 14 17:44:30 2005 +++ b/xen/common/grant_table.c Sun Aug 14 20:34:13 2005 @@ -771,9 +771,8 @@ if ( sha_copy.flags ) { DPRINTK("Grant: dom (%hu) SHARED (%d) flags:(%hx) " - "dom:(%hu) frame:(%lx)\n", - op.dom, i, sha_copy.flags, sha_copy.domid, - (unsigned long) sha_copy.frame); + "dom:(%hu) frame:(%x)\n", + op.dom, i, sha_copy.flags, sha_copy.domid, sha_copy.frame); } } @@ -826,8 +825,8 @@ for (i = 0; i < count; i++) { gnttab_donate_t *gop = &uop[i]; #if GRANT_DEBUG - printk("gnttab_donate: i=%d mfn=%08x domid=%d gref=%08x\n", - i, (unsigned int)gop->mfn, gop->domid, gop->handle); + printk("gnttab_donate: i=%d mfn=%lx domid=%d gref=%08x\n", + i, gop->mfn, gop->domid, gop->handle); #endif page = &frame_table[gop->mfn]; @@ -1033,8 +1032,8 @@ #if GRANT_DEBUG_VERBOSE if ( ld->domain_id != 0 ) { - DPRINTK("Foreign unref rd(%d) ld(%d) frm(%x) flgs(%x).\n", - rd->domain_id, ld->domain_id, (unsigned int)frame, readonly); + DPRINTK("Foreign unref rd(%d) ld(%d) frm(%lx) flgs(%x).\n", + rd->domain_id, ld->domain_id, frame, readonly); } #endif diff -r da515995a281 -r e59f04598620 xen/include/public/io/domain_controller.h --- a/xen/include/public/io/domain_controller.h Sun Aug 14 17:44:30 2005 +++ b/xen/include/public/io/domain_controller.h Sun Aug 14 20:34:13 2005 @@ -365,8 +365,10 @@ */ typedef struct netif_fe_interface_connect { u32 handle; - memory_t tx_shmem_frame; + memory_t tx_shmem_frame; + int tx_shmem_ref; memory_t rx_shmem_frame; + int rx_shmem_ref; } netif_fe_interface_connect_t; /* @@ -487,7 +489,9 @@ domid_t domid; /* Domain attached to new interface. */ u32 netif_handle; /* Domain-specific interface handle. */ memory_t tx_shmem_frame; /* Page cont. tx shared comms window. */ + int tx_shmem_ref; /* Grant reference for above */ memory_t rx_shmem_frame; /* Page cont. rx shared comms window. */ + int rx_shmem_ref; /* Grant reference for above */ u16 evtchn; /* Event channel for notifications. */ /* OUT */ u32 status; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |