[ovs-dev] [PATCH] odp-util: Avoid branch in odp_actions_add().
Justin Pettit
jpettit at nicira.com
Thu Aug 12 21:52:30 UTC 2010
I feel like there's a race going on between the rate at which you can write code and the rate at which I can review it--and I'm losing badly. Other than depressing me, the code looks good.
--Justin
On Aug 12, 2010, at 2:28 PM, Ben Pfaff wrote:
> I have no idea why, but the test and branch in odp_actions_add() has always
> bugged me. This commit eliminates it.
> ---
> lib/odp-util.c | 11 ++++-------
> lib/odp-util.h | 4 ++++
> ofproto/ofproto.c | 1 +
> 3 files changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/lib/odp-util.c b/lib/odp-util.c
> index ccf05c6..442c939 100644
> --- a/lib/odp-util.c
> +++ b/lib/odp-util.c
> @@ -30,13 +30,10 @@ union odp_action *
> odp_actions_add(struct odp_actions *actions, uint16_t type)
> {
> union odp_action *a;
> - if (actions->n_actions < MAX_ODP_ACTIONS) {
> - a = &actions->actions[actions->n_actions++];
> - } else {
> - COVERAGE_INC(odp_overflow);
> - actions->n_actions = MAX_ODP_ACTIONS + 1;
> - a = &actions->actions[MAX_ODP_ACTIONS - 1];
> - }
> + size_t idx;
> +
> + idx = actions->n_actions++ & (MAX_ODP_ACTIONS - 1);
> + a = &actions->actions[idx];
> memset(a, 0, sizeof *a);
> a->type = type;
> return a;
> diff --git a/lib/odp-util.h b/lib/odp-util.h
> index dc9a43d..420bde5 100644
> --- a/lib/odp-util.h
> +++ b/lib/odp-util.h
> @@ -22,6 +22,7 @@
> #include <stdint.h>
> #include "openflow/openflow.h"
> #include "openvswitch/datapath-protocol.h"
> +#include "util.h"
>
> struct ds;
>
> @@ -29,6 +30,9 @@ struct ds;
> * memory, so there is no point in allocating more than that. */
> enum { MAX_ODP_ACTIONS = 4096 / sizeof(union odp_action) };
>
> +/* odp_actions_add() assumes that MAX_ODP_ACTIONS is a power of 2. */
> +BUILD_ASSERT_DECL(IS_POW2(MAX_ODP_ACTIONS));
> +
> struct odp_actions {
> size_t n_actions;
> union odp_action actions[MAX_ODP_ACTIONS];
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index a466c9c..130bc98 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -2776,6 +2776,7 @@ xlate_actions(const union ofp_action *in, size_t n_in,
> *nf_output_iface = ctx.nf_output_iface;
> }
> if (odp_actions_overflow(out)) {
> + COVERAGE_INC(odp_overflow);
> odp_actions_init(out);
> return ofp_mkerr(OFPET_BAD_ACTION, OFPBAC_TOO_MANY);
> }
> --
> 1.7.1
>
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev_openvswitch.org
More information about the dev
mailing list