[ovs-dev] [megaflow bond rebase] ofproto/bond: Implement bond megaflow using recirculation

Andy Zhou azhou at nicira.com
Wed Apr 2 19:17:23 UTC 2014


On Wed, Apr 2, 2014 at 12:44 AM, YAMAMOTO Takashi
<yamamoto at 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



More information about the dev mailing list