On Thu, Sep 14, 2017 at 11:42:38PM +0000, Darrell Ball wrote:
> 
> 
> On 9/5/17, 2:23 AM, "Yuanhan Liu" <y...@fridaylinux.org> wrote:
> 
>     This patch associate a flow with a mark id (a uint32_t number) by CMAP.
>     
>     It re-uses the flow API (more precisely, the ->flow_put method) to setup
>     the hw flow. The flow_put implementation then is supposed to create a
>     flow with MARK action.
>     
>     Co-authored-by: Finn Christensen <f...@napatech.com>
>     Signed-off-by: Yuanhan Liu <y...@fridaylinux.org>
>     Signed-off-by: Finn Christensen <f...@napatech.com>
>     ---
>      lib/dpif-netdev.c | 85 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>      lib/netdev.h      |  6 ++++
>      2 files changed, 91 insertions(+)
>     
>     diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
>     index 071ec14..f3b7f25 100644
>     --- a/lib/dpif-netdev.c
>     +++ b/lib/dpif-netdev.c
>     @@ -446,6 +446,12 @@ struct dp_netdev_flow {
>          const unsigned pmd_id;       /* The 'core_id' of pmd thread owning 
> this */
>                                       /* flow. */
>      
>     +    const struct cmap_node mark_node;   /* In owning 
> dp_netdev_pmd_thread's */
>     +                                        /* 'mark_to_flow' */
>     +    bool has_mark;               /* A flag to tell whether this flow has 
> a
>     +                                    valid mark asscoiated with it. */
>     +    uint32_t mark;               /* Unique flow mark assiged to a flow */
> 
> 
> [Darrell] Since the PMD that receives a flow can change and multiple PMDs can 
> allocate
> the same mark value at the moment, it seems the mark allocation needs to 
> include the PMD ID or
> be from a global namespace to enforce uniqueness.
> Pls verify.

Yes, you are right. Let it be global then. Talking about that, one of my
colleague actually suggests to use an array to do the mapping. It's a
"number -> flow" mapping after all: using a hash map looks like an overkill.
Using array also would give us the best performance.

The reason I chose cmap in the beginning is we don't know how big the
array is. Also, it doesn't make sense to allocate a static array big
enough to hold the maximum entires (it's uint32_t after all).

So I'm now thinking:

- allocate a small array first, say with 1024 entries
- if there is no space, double the max (say, 2048) and re-allocate

I don't know the performance difference yet. I will get back to you
when I have the number. Besides that, what do you think.

        --yliu
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to