vport->upcall_stats = netdev_alloc_pcpu_stats(struct vport_upcall_stats_percpu);
        if (!vport->upcall_stats) {
                err = -ENOMEM;
-               goto err_destroy_portids;
+               goto err_destroy_vport;
        }
 
        err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
        ovs_notify(&dp_datapath_genl_family, reply, info);
        return 0;
 
+err_destroy_vport:
+       ovs_dp_detach_port(vport);
 err_destroy_portids:
        kfree(rcu_dereference_raw(dp->upcall_portids));
 err_unlock_and_destroy_meters:
        vport->upcall_stats = netdev_alloc_pcpu_stats(struct vport_upcall_stats_percpu);
        if (!vport->upcall_stats) {
                err = -ENOMEM;
-               goto exit_unlock_free;
+               goto exit_unlock_free_vport;
        }
 
        err = ovs_vport_cmd_fill_info(vport, reply, genl_info_net(info),
        ovs_notify(&dp_vport_genl_family, reply, info);
        return 0;
 
+exit_unlock_free_vport:
+       ovs_dp_detach_port(vport);
 exit_unlock_free:
        ovs_unlock();
        kfree_skb(reply);