[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