--- src/sys/net/bridge/if_bridge.c 2008/06/19 15:51:57 1.41 +++ src/sys/net/bridge/if_bridge.c 2008/07/27 10:06:57 1.42 @@ -738,27 +738,28 @@ bridge_delete_member(struct bridge_softc ASSERT_SERIALIZED(bifp->if_serializer); ifs->if_bridge = NULL; -#ifdef notyet + + /* + * Release bridge interface's serializer: + * - To avoid possible dead lock. + * - netmsg_service_sync will block current thread. + */ + lwkt_serialize_exit(bifp->if_serializer); + + /* + * Make sure that all protocol threads see 'ifs' if_bridge change. + */ netmsg_service_sync(); -#endif if (!gone) { switch (ifs->if_type) { case IFT_ETHER: case IFT_L2VLAN: /* - * Release bridge interface's serializer to - * avoid possible dead lock. - */ - lwkt_serialize_exit(bifp->if_serializer); - - /* * Take the interface out of promiscuous mode. */ ifpromisc(ifs, 0); bridge_mutecaps(bif, 0); - - lwkt_serialize_enter(bifp->if_serializer); break; case IFT_GIF: @@ -770,6 +771,8 @@ bridge_delete_member(struct bridge_softc } } + lwkt_serialize_enter(bifp->if_serializer); + LIST_REMOVE(bif, bif_next); bridge_rtdelete(sc, ifs, IFBF_FLUSHALL);