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

Re: [Xen-devel] [PATCH 08/14] xen-netback: use foreign page information from the pages themselves



On 12/01/15 15:43, David Vrabel wrote:
> From: Jenny Herbert <jenny.herbert@xxxxxxxxxx>
> 
> Use the foreign page flag in netback to get the domid and grant ref
> needed for the grant copy.  This signficiantly simplifies the netback
> code and makes netback work with foreign pages from other backends
> (e.g., blkback).
> 
> This allows blkback to use iSCSI disks provided by domUs running on
> the same host.

Dave,

This depends on several xen changes.  It's been Acked-by: Ian Campbell
<ian.campbell@xxxxxxxxxx>

Are you happy for me to merge this via the xen tree in 3.20?

David

> Signed-off-by: Jenny Herbert <jennifer.herbert@xxxxxxxxxx>
> Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx>
> ---
>  drivers/net/xen-netback/netback.c |  100 
> ++++---------------------------------
>  1 file changed, 9 insertions(+), 91 deletions(-)
> 
> diff --git a/drivers/net/xen-netback/netback.c 
> b/drivers/net/xen-netback/netback.c
> index 6441318..ae3ab37 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -314,9 +314,7 @@ static struct xenvif_rx_meta *get_next_rx_buffer(struct 
> xenvif_queue *queue,
>  static void xenvif_gop_frag_copy(struct xenvif_queue *queue, struct sk_buff 
> *skb,
>                                struct netrx_pending_operations *npo,
>                                struct page *page, unsigned long size,
> -                              unsigned long offset, int *head,
> -                              struct xenvif_queue *foreign_queue,
> -                              grant_ref_t foreign_gref)
> +                              unsigned long offset, int *head)
>  {
>       struct gnttab_copy *copy_gop;
>       struct xenvif_rx_meta *meta;
> @@ -333,6 +331,8 @@ static void xenvif_gop_frag_copy(struct xenvif_queue 
> *queue, struct sk_buff *skb
>       offset &= ~PAGE_MASK;
>  
>       while (size > 0) {
> +             struct xen_page_foreign *foreign;
> +
>               BUG_ON(offset >= PAGE_SIZE);
>               BUG_ON(npo->copy_off > MAX_BUFFER_OFFSET);
>  
> @@ -361,9 +361,10 @@ static void xenvif_gop_frag_copy(struct xenvif_queue 
> *queue, struct sk_buff *skb
>               copy_gop->flags = GNTCOPY_dest_gref;
>               copy_gop->len = bytes;
>  
> -             if (foreign_queue) {
> -                     copy_gop->source.domid = foreign_queue->vif->domid;
> -                     copy_gop->source.u.ref = foreign_gref;
> +             foreign = xen_page_foreign(page);
> +             if (foreign) {
> +                     copy_gop->source.domid = foreign->domid;
> +                     copy_gop->source.u.ref = foreign->gref;
>                       copy_gop->flags |= GNTCOPY_source_gref;
>               } else {
>                       copy_gop->source.domid = DOMID_SELF;
> @@ -406,35 +407,6 @@ static void xenvif_gop_frag_copy(struct xenvif_queue 
> *queue, struct sk_buff *skb
>  }
>  
>  /*
> - * Find the grant ref for a given frag in a chain of struct ubuf_info's
> - * skb: the skb itself
> - * i: the frag's number
> - * ubuf: a pointer to an element in the chain. It should not be NULL
> - *
> - * Returns a pointer to the element in the chain where the page were found. 
> If
> - * not found, returns NULL.
> - * See the definition of callback_struct in common.h for more details about
> - * the chain.
> - */
> -static const struct ubuf_info *xenvif_find_gref(const struct sk_buff *const 
> skb,
> -                                             const int i,
> -                                             const struct ubuf_info *ubuf)
> -{
> -     struct xenvif_queue *foreign_queue = ubuf_to_queue(ubuf);
> -
> -     do {
> -             u16 pending_idx = ubuf->desc;
> -
> -             if (skb_shinfo(skb)->frags[i].page.p ==
> -                 foreign_queue->mmap_pages[pending_idx])
> -                     break;
> -             ubuf = (struct ubuf_info *) ubuf->ctx;
> -     } while (ubuf);
> -
> -     return ubuf;
> -}
> -
> -/*
>   * Prepare an SKB to be transmitted to the frontend.
>   *
>   * This function is responsible for allocating grant operations, meta
> @@ -459,8 +431,6 @@ static int xenvif_gop_skb(struct sk_buff *skb,
>       int head = 1;
>       int old_meta_prod;
>       int gso_type;
> -     const struct ubuf_info *ubuf = skb_shinfo(skb)->destructor_arg;
> -     const struct ubuf_info *const head_ubuf = ubuf;
>  
>       old_meta_prod = npo->meta_prod;
>  
> @@ -507,68 +477,16 @@ static int xenvif_gop_skb(struct sk_buff *skb,
>                       len = skb_tail_pointer(skb) - data;
>  
>               xenvif_gop_frag_copy(queue, skb, npo,
> -                                  virt_to_page(data), len, offset, &head,
> -                                  NULL,
> -                                  0);
> +                                  virt_to_page(data), len, offset, &head);
>               data += len;
>       }
>  
>       for (i = 0; i < nr_frags; i++) {
> -             /* This variable also signals whether foreign_gref has a real
> -              * value or not.
> -              */
> -             struct xenvif_queue *foreign_queue = NULL;
> -             grant_ref_t foreign_gref;
> -
> -             if ((skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) &&
> -                     (ubuf->callback == &xenvif_zerocopy_callback)) {
> -                     const struct ubuf_info *const startpoint = ubuf;
> -
> -                     /* Ideally ubuf points to the chain element which
> -                      * belongs to this frag. Or if frags were removed from
> -                      * the beginning, then shortly before it.
> -                      */
> -                     ubuf = xenvif_find_gref(skb, i, ubuf);
> -
> -                     /* Try again from the beginning of the list, if we
> -                      * haven't tried from there. This only makes sense in
> -                      * the unlikely event of reordering the original frags.
> -                      * For injected local pages it's an unnecessary second
> -                      * run.
> -                      */
> -                     if (unlikely(!ubuf) && startpoint != head_ubuf)
> -                             ubuf = xenvif_find_gref(skb, i, head_ubuf);
> -
> -                     if (likely(ubuf)) {
> -                             u16 pending_idx = ubuf->desc;
> -
> -                             foreign_queue = ubuf_to_queue(ubuf);
> -                             foreign_gref =
> -                                     
> foreign_queue->pending_tx_info[pending_idx].req.gref;
> -                             /* Just a safety measure. If this was the last
> -                              * element on the list, the for loop will
> -                              * iterate again if a local page were added to
> -                              * the end. Using head_ubuf here prevents the
> -                              * second search on the chain. Or the original
> -                              * frags changed order, but that's less likely.
> -                              * In any way, ubuf shouldn't be NULL.
> -                              */
> -                             ubuf = ubuf->ctx ?
> -                                     (struct ubuf_info *) ubuf->ctx :
> -                                     head_ubuf;
> -                     } else
> -                             /* This frag was a local page, added to the
> -                              * array after the skb left netback.
> -                              */
> -                             ubuf = head_ubuf;
> -             }
>               xenvif_gop_frag_copy(queue, skb, npo,
>                                    skb_frag_page(&skb_shinfo(skb)->frags[i]),
>                                    skb_frag_size(&skb_shinfo(skb)->frags[i]),
>                                    skb_shinfo(skb)->frags[i].page_offset,
> -                                  &head,
> -                                  foreign_queue,
> -                                  foreign_queue ? foreign_gref : UINT_MAX);
> +                                  &head);
>       }
>  
>       return npo->meta_prod - old_meta_prod;
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

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