[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH net-next v5 4/9] xen-netback: Change RX path for mapped SKB fragments
On Mon, 2014-01-20 at 21:24 +0000, Zoltan Kiss wrote: Re the Subject: change how? Perhaps "handle foreign mapped pages on the guest RX path" would be clearer. > RX path need to know if the SKB fragments are stored on pages from another > domain. Does this not need to be done either before the mapping change or at the same time? -- otherwise you have a window of a couple of commits where things are broken, breaking bisectability. > > v4: > - indentation fixes > > Signed-off-by: Zoltan Kiss <zoltan.kiss@xxxxxxxxxx> > --- > drivers/net/xen-netback/netback.c | 46 > +++++++++++++++++++++++++++++++++---- > 1 file changed, 41 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/xen-netback/netback.c > b/drivers/net/xen-netback/netback.c > index f74fa92..d43444d 100644 > --- a/drivers/net/xen-netback/netback.c > +++ b/drivers/net/xen-netback/netback.c > @@ -226,7 +226,9 @@ static struct xenvif_rx_meta *get_next_rx_buffer(struct > xenvif *vif, > static void xenvif_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, > struct netrx_pending_operations *npo, > struct page *page, unsigned long size, > - unsigned long offset, int *head) > + unsigned long offset, int *head, > + struct xenvif *foreign_vif, > + grant_ref_t foreign_gref) > { > struct gnttab_copy *copy_gop; > struct xenvif_rx_meta *meta; > @@ -268,8 +270,15 @@ static void xenvif_gop_frag_copy(struct xenvif *vif, > struct sk_buff *skb, > copy_gop->flags = GNTCOPY_dest_gref; > copy_gop->len = bytes; > > - copy_gop->source.domid = DOMID_SELF; > - copy_gop->source.u.gmfn = virt_to_mfn(page_address(page)); > + if (foreign_vif) { > + copy_gop->source.domid = foreign_vif->domid; > + copy_gop->source.u.ref = foreign_gref; > + copy_gop->flags |= GNTCOPY_source_gref; > + } else { > + copy_gop->source.domid = DOMID_SELF; > + copy_gop->source.u.gmfn = > + virt_to_mfn(page_address(page)); > + } > copy_gop->source.offset = offset; > > copy_gop->dest.domid = vif->domid; > @@ -330,6 +339,9 @@ static int xenvif_gop_skb(struct sk_buff *skb, > int old_meta_prod; > int gso_type; > int gso_size; > + struct ubuf_info *ubuf = skb_shinfo(skb)->destructor_arg; > + grant_ref_t foreign_grefs[MAX_SKB_FRAGS]; > + struct xenvif *foreign_vif = NULL; > > old_meta_prod = npo->meta_prod; > > @@ -370,6 +382,26 @@ static int xenvif_gop_skb(struct sk_buff *skb, > npo->copy_off = 0; > npo->copy_gref = req->gref; > > + if ((skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) && > + (ubuf->callback == &xenvif_zerocopy_callback)) { > + u16 pending_idx = ubuf->desc; > + int i = 0; > + struct pending_tx_info *temp = > + container_of(ubuf, > + struct pending_tx_info, > + callback_struct); > + foreign_vif = > + container_of(temp - pending_idx, > + struct xenvif, > + pending_tx_info[0]); > + do { > + pending_idx = ubuf->desc; > + foreign_grefs[i++] = > + > foreign_vif->pending_tx_info[pending_idx].req.gref; > + ubuf = (struct ubuf_info *) ubuf->ctx; > + } while (ubuf); > + } > + > data = skb->data; > while (data < skb_tail_pointer(skb)) { > unsigned int offset = offset_in_page(data); > @@ -379,7 +411,9 @@ static int xenvif_gop_skb(struct sk_buff *skb, > len = skb_tail_pointer(skb) - data; > > xenvif_gop_frag_copy(vif, skb, npo, > - virt_to_page(data), len, offset, &head); > + virt_to_page(data), len, offset, &head, > + NULL, > + 0); > data += len; > } > > @@ -388,7 +422,9 @@ static int xenvif_gop_skb(struct sk_buff *skb, > skb_frag_page(&skb_shinfo(skb)->frags[i]), > skb_frag_size(&skb_shinfo(skb)->frags[i]), > skb_shinfo(skb)->frags[i].page_offset, > - &head); > + &head, > + foreign_vif, > + foreign_grefs[i]); > } > > return npo->meta_prod - old_meta_prod; _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |