[ovs-dev] [PATCH v4 4/9] ofproto-dpif: Add recirc_id field to struct rule_dpif
Ben Pfaff
blp at nicira.com
Fri May 2 14:34:58 UTC 2014
On Fri, May 02, 2014 at 05:41:35PM +0900, Simon Horman wrote:
> This is to allow a recirculation id to be associated with a rule
> in the case that its actions cause recirculation.
>
> In such a case if the recirc_id field is non-zero then that value should be
> used, otherwise a value should be obtained using
> ofproto_dpif_alloc_recirc_id and saved in recirc_id field.
>
> When destructing the rule if the recirc_id field is non-zero then
> the associated internal flow should be deleted.
>
> This is in preparation for using the same helper as part of support
> for using recirculation in conjunction series of actions including
> with MPLS actions that are currently not able to be translated.
>
> Signed-off-by: Simon Horman <horms at verge.net.au>
Has this been tested? It appears that rule_dpif_get_recirc_id()
requires rule->up.mutex:
> +uint32_t
> +rule_dpif_get_recirc_id(struct rule_dpif *rule)
> + OVS_REQUIRES(rule->up.mutex)
> +{
> + if (!rule->recirc_id) {
> + struct ofproto_dpif *ofproto = ofproto_dpif_cast(rule->up.ofproto);
> +
> + rule_dpif_set_recirc_id(rule, ofproto_dpif_alloc_recirc_id(ofproto));
> + }
> + return rule->recirc_id;
> +}
but that rule_dpif_get_recirc_id() sometimes calls rule_set_recirc_id(),
which attempts to acquire rule->up.mutex:
> +/* Sets 'rule''s recirculation id. */
> +void
> +rule_set_recirc_id(struct rule *rule_, uint32_t id)
> +{
> + struct rule_dpif *rule = rule_dpif_cast(rule_);
> +
> + ovs_mutex_lock(&rule->up.mutex);
> + rule_dpif_set_recirc_id(rule, id);
> + ovs_mutex_unlock(&rule->up.mutex);
> +}
More information about the dev
mailing list