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

[Xen-devel] [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);
                } 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®.