From: Jesse Gross Date: Fri, 24 Dec 2010 00:47:45 +0000 (-0800) Subject: datapath: Use RCU dereference in vport_get_ifindex(). X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b02c20141e318bf95ecbd384c73bdf7f74920d3;p=openvswitch datapath: Use RCU dereference in vport_get_ifindex(). If we don't have an ifindex for a device (because it is a virtual port), we fall back to using the ifindex of the local port. However, we weren't properly dereferencing the vport from the ports array, so this adds that. This isn't a real problem though, because the local port always exists and never changes as long as the datapath exists. Found with sparse. Signed-off-by: Jesse Gross Acked-by: Ben Pfaff --- diff --git a/datapath/vport.c b/datapath/vport.c index 9e847e5a..6c053ac2 100644 --- a/datapath/vport.c +++ b/datapath/vport.c @@ -928,10 +928,10 @@ unsigned char vport_get_operstate(const struct vport *vport) * * @vport: vport from which to retrieve index * - * Retrieves the system interface index of the given device. Not all devices - * will have system indexes, in which case the index of the datapath local - * port is returned. Returns a negative index on error. Either RTNL lock or - * rcu_read_lock must be held. + * Retrieves the system interface index of the given device. Not all + * devices will have system indexes, in which case the index of the + * datapath local port is returned. Returns a negative index on error. + * Either RTNL lock or rcu_read_lock must be held. */ int vport_get_ifindex(const struct vport *vport) { @@ -940,7 +940,8 @@ int vport_get_ifindex(const struct vport *vport) /* If we don't actually have an ifindex, use the local port's. * Userspace doesn't check it anyways. */ - return vport_get_ifindex(vport->dp->ports[ODPP_LOCAL]); + return vport_get_ifindex(rcu_dereference_rtnl(vport->dp-> + ports[ODPP_LOCAL])); } /**