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

Re: [Xen-devel] [PATCH] grant-table, xen-netback: Introduce helper functions for grant copy operations



> -----Original Message-----
> From: Zoltan Kiss
> Sent: 02 April 2014 18:06
> To: Ian Campbell; Wei Liu; xen-devel@xxxxxxxxxxxxxxxxxxxx;
> konrad.wilk@xxxxxxxxxx; boris.ostrovsky@xxxxxxxxxx; David Vrabel
> Cc: Stefano Stabellini; Paul Durrant; netdev@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Jonathan Davies; Zoltan Kiss
> Subject: [PATCH] grant-table, xen-netback: Introduce helper functions for
> grant copy operations
> 
> Create helper functions for grant copy operations and use them in netback.
> 
> Signed-off-by: Zoltan Kiss <zoltan.kiss@xxxxxxxxxx>
> ---
> diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-
> netback/netback.c
> index 8d3bb4a..874df60 100644
> --- a/drivers/net/xen-netback/netback.c
> +++ b/drivers/net/xen-netback/netback.c
> @@ -275,23 +275,29 @@ static void xenvif_gop_frag_copy(struct xenvif *vif,
> struct sk_buff *skb,
>                       bytes = MAX_BUFFER_OFFSET - npo->copy_off;
> 
>               copy_gop = npo->copy + npo->copy_prod++;
> -             copy_gop->flags = GNTCOPY_dest_gref;
> -             copy_gop->len = bytes;
> 
>               if (foreign_vif) {
> -                     copy_gop->source.domid = foreign_vif->domid;
> -                     copy_gop->source.u.ref = foreign_gref;
> -                     copy_gop->flags |= GNTCOPY_source_gref;
> +                     gnttab_set_copy_op_ref_to_ref(copy_gop,
> +                                                   foreign_gref,
> +                                                   npo->copy_gref,
> +                                                   foreign_vif->domid,
> +                                                   offset,
> +                                                   vif->domid,
> +                                                   npo->copy_off,
> +                                                   bytes,
> +                                                   GNTCOPY_dest_gref |
> +                                                   GNTCOPY_source_gref);

Can't you lose the flags here (and in the other variants)? Since they are 
implied by the variant of the function they could just be hardcoded there, 
couldn't they?

  Paul

>               } else {
> -                     copy_gop->source.domid = DOMID_SELF;
> -                     copy_gop->source.u.gmfn =
> -                             virt_to_mfn(page_address(page));
> +                     gnttab_set_copy_op_gmfn_to_ref(copy_gop,
> +
> virt_to_mfn(page_address(page)),
> +                                                    npo->copy_gref,
> +                                                    DOMID_SELF,
> +                                                    offset,
> +                                                    vif->domid,
> +                                                    npo->copy_off,
> +                                                    bytes,
> +                                                    GNTCOPY_dest_gref);
>               }
> -             copy_gop->source.offset = offset;
> -
> -             copy_gop->dest.domid = vif->domid;
> -             copy_gop->dest.offset = npo->copy_off;
> -             copy_gop->dest.u.ref = npo->copy_gref;
> 
>               npo->copy_off += bytes;
>               meta->size += bytes;
> @@ -1297,18 +1303,16 @@ static void xenvif_tx_build_gops(struct xenvif
> *vif,
>               XENVIF_TX_CB(skb)->pending_idx = pending_idx;
> 
>               __skb_put(skb, data_len);
> -             vif->tx_copy_ops[*copy_ops].source.u.ref = txreq.gref;
> -             vif->tx_copy_ops[*copy_ops].source.domid = vif->domid;
> -             vif->tx_copy_ops[*copy_ops].source.offset = txreq.offset;
> -
> -             vif->tx_copy_ops[*copy_ops].dest.u.gmfn =
> -                     virt_to_mfn(skb->data);
> -             vif->tx_copy_ops[*copy_ops].dest.domid = DOMID_SELF;
> -             vif->tx_copy_ops[*copy_ops].dest.offset =
> -                     offset_in_page(skb->data);
> -
> -             vif->tx_copy_ops[*copy_ops].len = data_len;
> -             vif->tx_copy_ops[*copy_ops].flags =
> GNTCOPY_source_gref;
> +
> +             gnttab_set_copy_op_ref_to_gmfn(&vif-
> >tx_copy_ops[*copy_ops],
> +                                            txreq.gref,
> +                                            virt_to_mfn(skb->data),
> +                                            vif->domid,
> +                                            txreq.offset,
> +                                            DOMID_SELF,
> +                                            offset_in_page(skb->data),
> +                                            data_len,
> +                                            GNTCOPY_source_gref);
> 
>               (*copy_ops)++;
> 
> diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
> index a5af2a2..90a2f4c 100644
> --- a/include/xen/grant_table.h
> +++ b/include/xen/grant_table.h
> @@ -140,6 +140,59 @@ void
> gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
>                                      unsigned long pfn);
> 
>  static inline void
> +gnttab_set_copy_op_common(struct gnttab_copy *copy,
> +                       domid_t src_domid, uint16_t src_offset,
> +                       domid_t dst_domid, uint16_t dst_offset,
> +                       uint16_t len, uint16_t flags)
> +{
> +     copy->source.domid = src_domid;
> +     copy->source.offset = src_offset;
> +     copy->dest.domid = dst_domid;
> +     copy->dest.offset = dst_offset;
> +     copy->len = len;
> +     copy->flags = flags;
> +}
> +
> +static inline void
> +gnttab_set_copy_op_gmfn_to_ref(struct gnttab_copy *copy,
> +                            xen_pfn_t src_gmfn, grant_ref_t dst_ref,
> +                            domid_t src_domid, uint16_t src_offset,
> +                            domid_t dst_domid, uint16_t dst_offset,
> +                            uint16_t len, uint16_t flags)
> +{
> +     copy->source.u.gmfn = src_gmfn;
> +     copy->dest.u.ref = dst_ref;
> +     gnttab_set_copy_op_common(copy, src_domid, src_offset,
> dst_domid,
> +                               dst_offset, len, flags);
> +}
> +
> +static inline void
> +gnttab_set_copy_op_ref_to_ref(struct gnttab_copy *copy,
> +                           grant_ref_t src_ref, grant_ref_t dst_ref,
> +                           domid_t src_domid, uint16_t src_offset,
> +                           domid_t dst_domid, uint16_t dst_offset,
> +                           uint16_t len, uint16_t flags)
> +{
> +     copy->source.u.ref = src_ref;
> +     copy->dest.u.ref = dst_ref;
> +     gnttab_set_copy_op_common(copy, src_domid, src_offset,
> dst_domid,
> +                               dst_offset, len, flags);
> +}
> +
> +static inline void
> +gnttab_set_copy_op_ref_to_gmfn(struct gnttab_copy *copy,
> +                            grant_ref_t src_ref, xen_pfn_t dst_gmfn,
> +                            domid_t src_domid, uint16_t src_offset,
> +                            domid_t dst_domid, uint16_t dst_offset,
> +                            uint16_t len, uint16_t flags)
> +{
> +     copy->source.u.ref = src_ref;
> +     copy->dest.u.gmfn = dst_gmfn;
> +     gnttab_set_copy_op_common(copy, src_domid, src_offset,
> dst_domid,
> +                               dst_offset, len, flags);
> +}
> +
> +static inline void
>  gnttab_set_map_op(struct gnttab_map_grant_ref *map, phys_addr_t
> addr,
>                 uint32_t flags, grant_ref_t ref, domid_t domid)
>  {

_______________________________________________
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®.