diff options
author | Ben Pfaff <blp@nicira.com> | 2015-07-24 15:30:58 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2015-07-27 15:13:45 -0700 |
commit | a45475400a44065efb8667f0ef2e3de91ed31ca0 (patch) | |
tree | 94896ddcd3d5c8467f783f6e70f75bcb4432ac19 /ofproto/ofproto-dpif-mirror.c | |
parent | 980904823303ef02af605e62a30c9bebda25f1ef (diff) | |
download | openvswitch-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.c | 18 |
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; |