From b0fb95ac4b36de9b03405dfb0883e69cee8d2fb3 Mon Sep 17 00:00:00 2001 From: Jesse Gross Date: Wed, 29 Dec 2010 13:09:56 -0800 Subject: [PATCH] datapath: Acquire dp->mutex when deleting a datapath. It's possible that someone is using the datapath data structures when we attempt to delete the datapath. The first writer will only hold dp->mutex, which we don't currently acquire when deleting. This adds that lock to prevent a potential race (this can't currently happen because userspace is single threaded, as long as "ovs-dpctl del-dp" is not used at the same time). Signed-off-by: Jesse Gross Acked-by: Ben Pfaff --- datapath/datapath.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/datapath/datapath.c b/datapath/datapath.c index 87b2a058..1bf05206 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -318,9 +318,11 @@ static int destroy_dp(int dp_idx) dp = get_dp(dp_idx); if (!dp) { err = -ENODEV; - goto unlock; + goto out; } + mutex_lock(&dp->mutex); + list_for_each_entry_safe (p, n, &dp->port_list, node) if (p->port_no != ODPP_LOCAL) dp_detach_port(p); @@ -336,10 +338,11 @@ static int destroy_dp(int dp_idx) skb_queue_purge(&dp->queues[i]); free_percpu(dp->stats_percpu); + mutex_unlock(&dp->mutex); kobject_put(&dp->ifobj); module_put(THIS_MODULE); -unlock: +out: mutex_unlock(&dp_mutex); rtnl_unlock(); return err; -- 2.30.2