[ovs-dev] [PATCH 2/3] vport: Make dp_port->vport always valid.

Jesse Gross jesse at nicira.com
Fri Jul 30 00:38:54 UTC 2010


When we detached a vport we would assign NULL to dp_port->vport
before calling synchronize_rcu().  However, since vports have a
longer lifetime than dp_ports there were no checks before
dereferencing dp_port->vport.  This changes the behavior to
match the assumption by not assigning NULL during detach.
---
 datapath/datapath.c |    1 +
 datapath/vport.c    |    5 -----
 2 files changed, 1 insertions(+), 5 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 0bd1513..520952e 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -377,6 +377,7 @@ static int new_dp_port(struct datapath *dp, struct odp_port *odp_port, int port_
 
 	p->port_no = port_no;
 	p->dp = dp;
+	p->vport = vport;
 	atomic_set(&p->sflow_pool, 0);
 
 	err = vport_attach(vport, p);
diff --git a/datapath/vport.c b/datapath/vport.c
index 712c26e..2438590 100644
--- a/datapath/vport.c
+++ b/datapath/vport.c
@@ -798,9 +798,6 @@ int vport_attach(struct vport *vport, struct dp_port *dp_port)
 {
 	ASSERT_RTNL();
 
-	if (dp_port->vport)
-		return -EBUSY;
-
 	if (vport_get_dp_port(vport))
 		return -EBUSY;
 
@@ -812,7 +809,6 @@ int vport_attach(struct vport *vport, struct dp_port *dp_port)
 			return err;
 	}
 
-	dp_port->vport = vport;
 	rcu_assign_pointer(vport->dp_port, dp_port);
 
 	return 0;
@@ -836,7 +832,6 @@ int vport_detach(struct vport *vport)
 	if (!dp_port)
 		return -EINVAL;
 
-	dp_port->vport = NULL;
 	rcu_assign_pointer(vport->dp_port, NULL);
 
 	if (vport->ops->detach)
-- 
1.7.0.4





More information about the dev mailing list