[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