From: Peter Dinda Date: Thu, 10 Nov 2011 23:38:58 +0000 (-0600) Subject: More cleanup to avoid possible race X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?p=palacios.git;a=commitdiff_plain;h=1fc062adedda3f93f7f95395257a808c7b531fc9 More cleanup to avoid possible race --- diff --git a/linux_module/iface-packet.c b/linux_module/iface-packet.c index 3acb4bf..9df66bd 100644 --- a/linux_module/iface-packet.c +++ b/linux_module/iface-packet.c @@ -249,10 +249,11 @@ palacios_packet_connect(struct v3_packet * packet, unsigned long flags; spin_lock_irqsave(&(packet_state.lock), flags); - iface = find_interface(host_nic); + spin_unlock_irqrestore(&(packet_state.lock),flags); + if(iface == NULL){ - iface = (struct raw_interface *)kmalloc(sizeof(struct raw_interface), GFP_ATOMIC); + iface = (struct raw_interface *)kmalloc(sizeof(struct raw_interface), GFP_KERNEL); if (!iface) { printk("Palacios Packet Interface: Fails to allocate interface\n"); return -1; @@ -260,16 +261,13 @@ palacios_packet_connect(struct v3_packet * packet, if(init_raw_interface(iface, host_nic) != 0) { printk("Palacios Packet Interface: Fails to initiate an raw interface on device %s\n", host_nic); kfree(iface); - spin_unlock_irqrestore(&(packet_state.lock), flags); - return -1; } - + spin_lock_irqsave(&(packet_state.lock), flags); list_add(&(iface->node), &(packet_state.open_interfaces)); + spin_unlock_irqrestore(&(packet_state.lock),flags); } - spin_unlock_irqrestore(&(packet_state.lock), flags); - packet->host_packet_data = iface; list_add(&(packet->node), &(iface->brdcast_recvers));