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

Re: [Xen-devel] [PATCH 1/5] xen/netback: Use xenballooned pages for comms



On 19/10/11 10:04, Ian Campbell wrote:
> On Tue, 2011-10-18 at 21:26 +0100, Daniel De Graaf wrote:
>> For proper grant mappings, HVM guests require pages allocated using
>> alloc_xenballooned_pages instead of alloc_vm_area.
>>
>> Signed-off-by: Daniel De Graaf <dgdegra@xxxxxxxxxxxxx>
>> ---
>>  drivers/net/xen-netback/common.h  |    4 ++--
>>  drivers/net/xen-netback/netback.c |   34 ++++++++++++++++++++--------------
>>  2 files changed, 22 insertions(+), 16 deletions(-)
>>
>> diff --git a/drivers/net/xen-netback/common.h 
>> b/drivers/net/xen-netback/common.h
>> index 161f207..d5ee9d1 100644
>> --- a/drivers/net/xen-netback/common.h
>> +++ b/drivers/net/xen-netback/common.h
>> @@ -70,8 +70,8 @@ struct xenvif {
>>      /* The shared rings and indexes. */
>>      struct xen_netif_tx_back_ring tx;
>>      struct xen_netif_rx_back_ring rx;
>> -    struct vm_struct *tx_comms_area;
>> -    struct vm_struct *rx_comms_area;
>> +    struct page *tx_comms_page;
>> +    struct page *rx_comms_page;
> 
> This will conflict with David Vrabel's patch "net: xen-netback: use API
> provided by xenbus module to map rings", which I've just noticed hasn't
> been committed anywhere.
> 
> I suspect that building on David's patches (that series does something
> similar to blkback too) will greatly simplify this one since you can
> just patch xenbus_map_ring_valloc and friends.
> 
> Could you also explain where the requirement to use xenballooned pages
> and not alloc_vm_area comes from in your commit message.
> 
> David, I guess you should resend your series now that everyone is happy
> with it. If you cc the netback one to netdev@ with my Ack then Dave
> Miller will pick it up into his tree (it stands alone, right?). The
> blkback and grant-table ones go via Konrad I think. I suspect the last
> one needs to go via akpm, or at least with his Ack.

I thought Konrad had picked them all up -- they were on his stuff queued
for 3.2 list.

> 
>>  
>>      /* Frontend feature information. */
>>      u8 can_sg:1;
>> diff --git a/drivers/net/xen-netback/netback.c 
>> b/drivers/net/xen-netback/netback.c
>> index fd00f25..f35e07c 100644
>> --- a/drivers/net/xen-netback/netback.c
>> +++ b/drivers/net/xen-netback/netback.c
>> @@ -42,6 +42,7 @@
>>  
>>  #include <xen/events.h>
>>  #include <xen/interface/memory.h>
>> +#include <xen/balloon.h>
>>  
>>  #include <asm/xen/hypercall.h>
>>  #include <asm/xen/page.h>
>> @@ -1578,9 +1579,11 @@ static int xen_netbk_kthread(void *data)
>>  void xen_netbk_unmap_frontend_rings(struct xenvif *vif)
>>  {
>>      struct gnttab_unmap_grant_ref op;
>> +    void *addr;
>>  
>>      if (vif->tx.sring) {
>> -            gnttab_set_unmap_op(&op, (unsigned 
>> long)vif->tx_comms_area->addr,
>> +            addr = pfn_to_kaddr(page_to_pfn(vif->tx_comms_page));
>> +            gnttab_set_unmap_op(&op, (unsigned long)addr,
>>                                  GNTMAP_host_map, vif->tx_shmem_handle);
>>  
>>              if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>> @@ -1588,16 +1591,17 @@ void xen_netbk_unmap_frontend_rings(struct xenvif 
>> *vif)
>>      }
>>  
>>      if (vif->rx.sring) {
>> -            gnttab_set_unmap_op(&op, (unsigned 
>> long)vif->rx_comms_area->addr,
>> +            addr = pfn_to_kaddr(page_to_pfn(vif->rx_comms_page));
>> +            gnttab_set_unmap_op(&op, (unsigned long)addr,
>>                                  GNTMAP_host_map, vif->rx_shmem_handle);
>>  
>>              if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
>>                      BUG();
>>      }
>> -    if (vif->rx_comms_area)
>> -            free_vm_area(vif->rx_comms_area);
>> -    if (vif->tx_comms_area)
>> -            free_vm_area(vif->tx_comms_area);
>> +    if (vif->rx_comms_page)
>> +            free_xenballooned_pages(1, &vif->rx_comms_page);
>> +    if (vif->tx_comms_page)
>> +            free_xenballooned_pages(1, &vif->tx_comms_page);
>>  }
>>  
>>  int xen_netbk_map_frontend_rings(struct xenvif *vif,
>> @@ -1610,15 +1614,19 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>  
>>      int err = -ENOMEM;
>>  
>> -    vif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -    if (vif->tx_comms_area == NULL)
>> +    if (alloc_xenballooned_pages(1, &vif->tx_comms_page))
>>              goto err;
>>  
>> -    vif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
>> -    if (vif->rx_comms_area == NULL)
>> +    txs = (struct xen_netif_tx_sring *)pfn_to_kaddr(page_to_pfn(
>> +                    vif->tx_comms_page));
>> +
>> +    if (alloc_xenballooned_pages(1, &vif->rx_comms_page))
>>              goto err;
>>  
>> -    gnttab_set_map_op(&op, (unsigned long)vif->tx_comms_area->addr,
>> +    rxs = (struct xen_netif_rx_sring *)pfn_to_kaddr(page_to_pfn(
>> +                    vif->rx_comms_page));
>> +
>> +    gnttab_set_map_op(&op, (unsigned long)txs,
>>                        GNTMAP_host_map, tx_ring_ref, vif->domid);
>>  
>>      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1635,10 +1643,9 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>      vif->tx_shmem_ref    = tx_ring_ref;
>>      vif->tx_shmem_handle = op.handle;
>>  
>> -    txs = (struct xen_netif_tx_sring *)vif->tx_comms_area->addr;
>>      BACK_RING_INIT(&vif->tx, txs, PAGE_SIZE);
>>  
>> -    gnttab_set_map_op(&op, (unsigned long)vif->rx_comms_area->addr,
>> +    gnttab_set_map_op(&op, (unsigned long)rxs,
>>                        GNTMAP_host_map, rx_ring_ref, vif->domid);
>>  
>>      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
>> @@ -1656,7 +1663,6 @@ int xen_netbk_map_frontend_rings(struct xenvif *vif,
>>      vif->rx_shmem_handle  = op.handle;
>>      vif->rx_req_cons_peek = 0;
>>  
>> -    rxs = (struct xen_netif_rx_sring *)vif->rx_comms_area->addr;
>>      BACK_RING_INIT(&vif->rx, rxs, PAGE_SIZE);
>>  
>>      return 0;
> 
> 


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


 


Rackspace

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