[ovs-dev] [cmap v2 2/2] dpif-netdev: Use cmap for ports.

Jarno Rajahalme jrajahalme at nicira.com
Tue May 20 23:03:20 UTC 2014


On May 8, 2014, at 4:50 PM, Ben Pfaff <blp at nicira.com> wrote:

> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/dpif-netdev.c |  163 +++++++++++++++++++++++++++--------------------------
> 1 file changed, 82 insertions(+), 81 deletions(-)
> 
> diff --git a/lib/dpif-netdev.c b/lib/dpif-netdev.c
> index 55712dd..b682876 100644
> --- a/lib/dpif-netdev.c
> +++ b/lib/dpif-netdev.c
> @@ -32,6 +32,7 @@
> 

(snip)

> static void
> -port_unref(struct dp_netdev_port *port)
> +port_destroy__(struct dp_netdev_port *port)
> {
> -    if (port && ovs_refcount_unref(&port->ref_cnt) == 1) {
> -        int i;
> +    int i;
> 
> -        netdev_close(port->netdev);
> -        netdev_restore_flags(port->sf);
> +    netdev_close(port->netdev);
> +    netdev_restore_flags(port->sf);
> 
> -        for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> -            netdev_rxq_close(port->rxq[i]);
> -        }
> -        free(port->type);
> -        free(port);
> +    for (i = 0; i < netdev_n_rxq(port->netdev); i++) {
> +        netdev_rxq_close(port->rxq[i]);

Running with the v1, I saw a core here. It appears that the port->netdev is freed before the postponed port_destroy__ is executed. Maybe the netdev deletion needs also be ovsrcu_postponed()?

  Jarno

> +    }
> +    free(port->type);
> +    free(port);
> +}
> +
> +static void
> +port_unref(struct dp_netdev_port *port)
> +{
> +    if (port && ovs_refcount_unref(&port->ref_cnt) == 1) {
> +        ovsrcu_postpone(port_destroy__, port);
>     }
> }


  Jarno




More information about the dev mailing list