From: Jarno Rajahalme <ja...@ovn.org>

Upstream commit:

    commit cb80d58fae76d8ea93555149b2b16e19b89a1f4f
    Author: Jarno Rajahalme <ja...@ovn.org>
    Date:   Thu Feb 9 11:21:55 2017 -0800

    openvswitch: Unionize ovs_key_ct_label with a u32 array.

    Make the array of labels in struct ovs_key_ct_label an union, adding a
    u32 array of the same byte size as the existing u8 array.  It is
    faster to loop through the labels 32 bits at the time, which is also
    the alignment of netlink attributes.

    Signed-off-by: Jarno Rajahalme <ja...@ovn.org>
    Acked-by: Joe Stringer <j...@ovn.org>
    Acked-by: Pravin B Shelar <pshe...@ovn.org>
    Signed-off-by: David S. Miller <da...@davemloft.net>

Signed-off-by: Jarno Rajahalme <ja...@ovn.org>
Acked-by: Joe Stringer <j...@ovn.org>
---
 datapath/conntrack.c                              | 15 ++++++++-------
 datapath/linux/compat/include/linux/openvswitch.h |  8 ++++++--
 2 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/datapath/conntrack.c b/datapath/conntrack.c
index a4f2549deff8..2286a6987052 100644
--- a/datapath/conntrack.c
+++ b/datapath/conntrack.c
@@ -298,20 +298,21 @@ static int ovs_ct_set_labels(struct sk_buff *skb, struct 
sw_flow_key *key,
                /* Triggers a change event, which makes sense only for
                 * confirmed connections.
                 */
-               int err = nf_connlabels_replace(ct, (u32 *)labels, (u32 *)mask,
-                                               OVS_CT_LABELS_LEN / 
sizeof(u32));
+               int err = nf_connlabels_replace(ct, labels->ct_labels_32,
+                                               mask->ct_labels_32,
+                                               OVS_CT_LABELS_LEN_32);
                if (err)
                        return err;
        } else {
                u32 *dst = (u32 *)cl->bits;
-               const u32 *msk = (const u32 *)mask->ct_labels;
-               const u32 *lbl = (const u32 *)labels->ct_labels;
+               const u32 *msk = mask->ct_labels_32;
+               const u32 *lbl = labels->ct_labels_32;
                int i;
 
                /* No-one else has access to the non-confirmed entry, copy
                 * labels over, keeping any bits we are not explicitly setting.
                 */
-               for (i = 0; i < OVS_CT_LABELS_LEN / sizeof(u32); i++)
+               for (i = 0; i < OVS_CT_LABELS_LEN_32; i++)
                        dst[i] = (dst[i] & ~msk[i]) | (lbl[i] & msk[i]);
 
                /* Labels are included in the IPCTNL_MSG_CT_NEW event only if
@@ -914,8 +915,8 @@ static bool labels_nonzero(const struct ovs_key_ct_labels 
*labels)
 {
        size_t i;
 
-       for (i = 0; i < sizeof(*labels); i++)
-               if (labels->ct_labels[i])
+       for (i = 0; i < OVS_CT_LABELS_LEN_32; i++)
+               if (labels->ct_labels_32[i])
                        return true;
 
        return false;
diff --git a/datapath/linux/compat/include/linux/openvswitch.h 
b/datapath/linux/compat/include/linux/openvswitch.h
index 12260d8bfd64..76a19ed3eb4e 100644
--- a/datapath/linux/compat/include/linux/openvswitch.h
+++ b/datapath/linux/compat/include/linux/openvswitch.h
@@ -472,9 +472,13 @@ struct ovs_key_nd {
        __u8    nd_tll[ETH_ALEN];
 };
 
-#define OVS_CT_LABELS_LEN      16
+#define OVS_CT_LABELS_LEN_32   4
+#define OVS_CT_LABELS_LEN      (OVS_CT_LABELS_LEN_32 * sizeof(__u32))
 struct ovs_key_ct_labels {
-       __u8    ct_labels[OVS_CT_LABELS_LEN];
+       union {
+               __u8    ct_labels[OVS_CT_LABELS_LEN];
+               __u32   ct_labels_32[OVS_CT_LABELS_LEN_32];
+       };
 };
 
 /* OVS_KEY_ATTR_CT_STATE flags */
-- 
2.11.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to