[ovs-dev] [PATCH v2] netdev-dpdk: Remove use of rte_mempool_ops_get_count.

Stokes, Ian ian.stokes at intel.com
Wed May 23 15:56:19 UTC 2018


> rte_mempool_ops_get_count is not exported by DPDK so it means it cannot be
> used by OVS when using DPDK as a shared library.
> 
> Remove rte_mempool_ops_get_count but still use rte_mempool_full and
> document it's behavior.
> 

Thanks for the v2, I've merged this to dpdk_merge and backported it. It will be part of this weeks pull request.

Ian

> Fixes: 91fccdad72a2 ("netdev-dpdk: Free mempool only when no in-use
> mbufs.")
> Reported-by: Timothy Redaelli <tredaelli at redhat.com>
> Reported-by: Markos Chandras <mchandras at suse.de>
> Signed-off-by: Kevin Traynor <ktraynor at redhat.com>
> ---
>  lib/netdev-dpdk.c | 25 +++++++++++++------------
>  1 file changed, 13 insertions(+), 12 deletions(-)
> 
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 87152a7..719140f
> 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -530,17 +530,18 @@ static int
>  dpdk_mp_full(const struct rte_mempool *mp) OVS_REQUIRES(dpdk_mp_mutex)  {
> -    unsigned ring_count;
> -    /* This logic is needed because rte_mempool_full() is not guaranteed
> to
> -     * be atomic and mbufs could be moved from mempool cache --> mempool
> ring
> -     * during the call. However, as no mbufs will be taken from the
> mempool
> -     * at this time, we can work around it by also checking the ring
> entries
> -     * separately and ensuring that they have not changed.
> +    /* At this point we want to know if all the mbufs are back
> +     * in the mempool. rte_mempool_full() is not atomic but it's
> +     * the best available and as we are no longer requesting mbufs
> +     * from the mempool, it means mbufs will not move from
> +     * 'mempool ring' --> 'mempool cache'. In rte_mempool_full()
> +     * the ring is counted before caches, so we won't get false
> +     * positives in this use case and we handle false negatives.
> +     *
> +     * If future implementations of rte_mempool_full() were to change
> +     * it could be possible for a false positive. Even that would
> +     * likely be ok, as there are additional checks during mempool
> +     * freeing but it would make things racey.
>       */
> -    ring_count = rte_mempool_ops_get_count(mp);
> -    if (rte_mempool_full(mp) && rte_mempool_ops_get_count(mp) ==
> ring_count) {
> -        return 1;
> -    }
> -
> -    return 0;
> +    return rte_mempool_full(mp);
>  }
> 
> --
> 1.8.3.1



More information about the dev mailing list