>
> 2. Use the reciprocal division. At time of setting the
>> 'upcall_portids', we compute the reciprocal_value of the 'n_ids'.
>> And the ovs_vport_find_portid() is changed to:
>>
>> """
>> @@ -445,13 +437,14 @@ int ovs_vport_get_upcall_portids(const struct
>> vport *vport,
>> u32 ovs_vport_find_portid(const struct vport *p, struct sk_buff *skb)
>> {
>> struct vport_portids *ids;
>> + u32 hash;
>> ids = rcu_dereference_ovsl(p->upcall_portids);
>> if (ids->n_ids == 1 && *ids->ids == 0)
>> return 0;
>> - return ids->ids[skb_get_rxhash(skb) % ids->n_ids];
>> + hash = skb_get_rxhash(skb);
>> + return ids->ids[hash - ids->n_ids * reciprocal_div(hash,
>> ids->rn_ids)];
>> }"""
>>
>> We tend to take the second one, in that, we want to allow user to
>> flexibly configure the number of threads in userspace,
>> and the change of division to "one subtract, two multiplication and one
>> shift" saves the cpu cycles. (There may be better
>> way of using reciprocal_div() than the one I gave)
>>
>
> I agree. If this was the fast path I would have suggested to go with
> (1) but given we only hit this frequently in exception cases the
> added flexibility in defining an arbitrary number of threads seems
> worth it.
>
Sounds great! I'll fold your suggestions in with the V4 series.
V4 will be sent after I implement the recv_set() in dpif-netdev.c
Thanks~,
Alex Wang,
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev