summaryrefslogtreecommitdiff
path: root/ofproto/ofproto-dpif-mirror.c
diff options
context:
space:
mode:
authorBen Pfaff <blp@nicira.com>2015-07-24 15:30:58 -0700
committerBen Pfaff <blp@nicira.com>2015-07-27 15:13:45 -0700
commita45475400a44065efb8667f0ef2e3de91ed31ca0 (patch)
tree94896ddcd3d5c8467f783f6e70f75bcb4432ac19 /ofproto/ofproto-dpif-mirror.c
parent980904823303ef02af605e62a30c9bebda25f1ef (diff)
downloadopenvswitch-a45475400a44065efb8667f0ef2e3de91ed31ca0.tar.gz
ofproto-dpif-mirror: Fix insane waste of memory and time in checking VLANs.
When a mirror was restricted to particular VLANs, this code was allocating, copying, and freeing a 512-byte block of memory just to check the value of a single bit in the block. This fixes the problem. Found by inspection. Signed-off-by: Ben Pfaff <blp@nicira.com> Acked-by: Andy Zhou <azhou@nicira.com>
Diffstat (limited to 'ofproto/ofproto-dpif-mirror.c')
-rw-r--r--ofproto/ofproto-dpif-mirror.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/ofproto/ofproto-dpif-mirror.c b/ofproto/ofproto-dpif-mirror.c
index e0f3dcd49..f3ff5782c 100644
--- a/ofproto/ofproto-dpif-mirror.c
+++ b/ofproto/ofproto-dpif-mirror.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+/* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -375,11 +375,17 @@ mirror_update_stats(struct mbridge *mbridge, mirror_mask_t mirrors,
}
}
-/* Retrieves the mirror in 'mbridge' represented by the first bet set of
- * 'mirrors'. Returns true if such a mirror exists, false otherwise.
- * The caller takes ownership of, and is expected to deallocate, 'vlans' */
+/* Retrieves the mirror numbered 'index' in 'mbridge'. Returns true if such a
+ * mirror exists, false otherwise.
+ *
+ * If successful, '*vlans' receives the mirror's VLAN membership information,
+ * either a null pointer if the mirror includes all VLANs or a 4096-bit bitmap
+ * in which a 1-bit indicates that the mirror includes a particular VLAN,
+ * '*dup_mirrors' receives a bitmap of mirrors whose output duplicates mirror
+ * 'index', '*out' receives the output ofbundle (if any), and '*out_vlan'
+ * receives the output VLAN (if any). */
bool
-mirror_get(struct mbridge *mbridge, int index, unsigned long **vlans,
+mirror_get(struct mbridge *mbridge, int index, const unsigned long **vlans,
mirror_mask_t *dup_mirrors, struct ofbundle **out, int *out_vlan)
{
struct mirror *mirror;
@@ -393,7 +399,7 @@ mirror_get(struct mbridge *mbridge, int index, unsigned long **vlans,
return false;
}
- *vlans = vlan_bitmap_clone(mirror->vlans);
+ *vlans = mirror->vlans;
*dup_mirrors = mirror->dup_mirrors;
*out = mirror->out ? mirror->out->ofbundle : NULL;
*out_vlan = mirror->out_vlan;