From: Lei Xia Date: Tue, 22 Nov 2011 19:10:26 +0000 (-0600) Subject: Fix bugs when deinit a list, use list_for_each_entry_safe instead of list_for_each_entry X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=0975ec64a5a81c1c51bc49791b40e785d1679d28 Fix bugs when deinit a list, use list_for_each_entry_safe instead of list_for_each_entry --- diff --git a/linux_module/iface-packet.c b/linux_module/iface-packet.c index 9df66bd..d55b854 100644 --- a/linux_module/iface-packet.c +++ b/linux_module/iface-packet.c @@ -215,13 +215,13 @@ init_raw_interface(struct raw_interface * iface, const char * eth_dev){ static void inline deinit_raw_interface(struct raw_interface * iface){ - struct v3_packet * recver_state; + struct v3_packet * recver_state, * tmp_state; kthread_stop(iface->recv_thread); sock_release(iface->raw_sock); palacios_free_htable(iface->mac_to_recver, 0, 0); - list_for_each_entry(recver_state, &(iface->brdcast_recvers), node) { + list_for_each_entry_safe(recver_state, tmp_state, &(iface->brdcast_recvers), node) { kfree(recver_state); } } @@ -351,9 +351,9 @@ static int packet_init( void ) { } static int packet_deinit( void ) { - struct raw_interface * iface; + struct raw_interface * iface, * tmp; - list_for_each_entry(iface, &(packet_state.open_interfaces), node) { + list_for_each_entry_safe(iface, tmp, &(packet_state.open_interfaces), node) { deinit_raw_interface(iface); kfree(iface); } diff --git a/linux_module/palacios-vnet-brg.c b/linux_module/palacios-vnet-brg.c index 7a605c7..7eee09c 100644 --- a/linux_module/palacios-vnet-brg.c +++ b/linux_module/palacios-vnet-brg.c @@ -118,9 +118,9 @@ void vnet_brg_delete_link(uint32_t idx){ } static void deinit_links_list(void){ - struct vnet_link * link; + struct vnet_link * link, * tmp_link; - list_for_each_entry(link, &(vnet_brg_s.link_list), node) { + list_for_each_entry_safe(link, tmp_link, &(vnet_brg_s.link_list), node) { _delete_link(link); } } diff --git a/linux_module/palacios-vnet-ctrl.c b/linux_module/palacios-vnet-ctrl.c index 429f79d..12dec1f 100644 --- a/linux_module/palacios-vnet-ctrl.c +++ b/linux_module/palacios-vnet-ctrl.c @@ -656,17 +656,17 @@ static void delete_link(struct vnet_link_iter * link){ static void deinit_links_list(void){ - struct vnet_link_iter * link; + struct vnet_link_iter * link, * tmp_link; - list_for_each_entry(link, &(vnet_ctrl_s.link_iter_list), node) { + list_for_each_entry_safe(link, tmp_link, &(vnet_ctrl_s.link_iter_list), node) { delete_link(link); } } static void deinit_routes_list(void){ - struct vnet_route_iter * route; + struct vnet_route_iter * route, * tmp_route; - list_for_each_entry(route, &(vnet_ctrl_s.route_list), node) { + list_for_each_entry_safe(route, tmp_route, &(vnet_ctrl_s.route_list), node) { delete_route(route); } } diff --git a/palacios/src/vnet/vnet_core.c b/palacios/src/vnet/vnet_core.c index 807708e..e7b37f9 100644 --- a/palacios/src/vnet/vnet_core.c +++ b/palacios/src/vnet/vnet_core.c @@ -213,10 +213,9 @@ static struct vnet_dev * dev_by_id(int idx) { struct vnet_dev * dev = NULL; list_for_each_entry(dev, &(vnet_state.devs), node) { - int dev_id = dev->dev_id; - - if (dev_id == idx) + if (dev->dev_id == idx) { return dev; + } } return NULL; @@ -322,12 +321,12 @@ void v3_vnet_del_route(uint32_t route_idx){ /* delete all route entries with specfied src or dst device id */ static void inline del_routes_by_dev(int dev_id){ - struct vnet_route_info * route = NULL; + struct vnet_route_info * route, *tmp_route; unsigned long flags; flags = vnet_lock_irqsave(vnet_state.lock); - list_for_each_entry(route, &(vnet_state.routes), node) { + list_for_each_entry_safe(route, tmp_route, &(vnet_state.routes), node) { if((route->route_def.dst_type == LINK_INTERFACE && route->route_def.dst_id == dev_id) || (route->route_def.src_type == LINK_INTERFACE && @@ -631,18 +630,18 @@ int v3_vnet_stat(struct vnet_stat * stats){ } static void deinit_devices_list(){ - struct vnet_dev * dev = NULL; + struct vnet_dev * dev, * tmp; - list_for_each_entry(dev, &(vnet_state.devs), node) { + list_for_each_entry_safe(dev, tmp, &(vnet_state.devs), node) { list_del(&(dev->node)); Vnet_Free(dev); } } static void deinit_routes_list(){ - struct vnet_route_info * route = NULL; + struct vnet_route_info * route, * tmp; - list_for_each_entry(route, &(vnet_state.routes), node) { + list_for_each_entry_safe(route, tmp, &(vnet_state.routes), node) { list_del(&(route->node)); list_del(&(route->match_node)); Vnet_Free(route);