On Wed, Apr 2, 2014 at 12:44 AM, YAMAMOTO Takashi
<yamam...@valinux.co.jp> wrote:
>> @@ -2021,6 +2025,17 @@ dp_netdev_port_input(struct dp_netdev *dp, struct
>> ofpbuf *packet,
>> }
>> }
>>
>> +static void
>> +dp_netdev_port_input(struct dp_netdev *dp, struct ofpbuf *packet,
>> + struct pkt_metadata *md)
>> + OVS_REQ_RDLOCK(dp->port_rwlock)
>> +{
>> + uint32_t *recirc_depth = recirc_depth_get();
>> +
>> + *recirc_depth = 0;
>> + dp_netdev_input(dp, packet, md);
>> +}
>> +
>> static int
>> dp_netdev_output_userspace(struct dp_netdev *dp, struct ofpbuf *packet,
>> int queue_no, int type, const struct flow *flow,
>> @@ -2089,6 +2104,7 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet,
>> struct dp_netdev_execute_aux *aux = aux_;
>> int type = nl_attr_type(a);
>> struct dp_netdev_port *p;
>> + uint32_t *depth = recirc_depth_get();
>>
>> switch ((enum ovs_action_attr)type) {
>> case OVS_ACTION_ATTR_OUTPUT:
>> @@ -2115,23 +2131,38 @@ dp_execute_cb(void *aux_, struct ofpbuf *packet,
>> break;
>> }
>>
>> - case OVS_ACTION_ATTR_RECIRC: {
>> - const struct ovs_action_recirc *act;
>> + case OVS_ACTION_ATTR_RECIRC:
>> + if (*depth < MAX_RECIRC_DEPTH) {
>
> can't this be called by other threads via dpif_execute()?
Yes. this is why it is a per-thread local variable.
>
> YAMAMOTO Takashi
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev