datapath: Reduce locking requirements.
authorJarno Rajahalme <jrajahalme@nicira.com>
Wed, 2 Apr 2014 18:14:58 +0000 (11:14 -0700)
committerJarno Rajahalme <jrajahalme@nicira.com>
Wed, 2 Apr 2014 18:14:58 +0000 (11:14 -0700)
commitf71db6b17852d7e0d2ade9f60b7aec63cd584a82
treec6e277e3872b8237e7314ca8ed4f18cb4e3be3b4
parent4bb90bea0c4e725c4522f7de470a3b2f8251413a
datapath: Reduce locking requirements.

Reduce and clarify locking requirements for ovs_flow_cmd_alloc_info(),
ovs_flow_cmd_fill_info() and ovs_flow_cmd_build_info().

A datapath pointer is available only when holding a lock.  Change
ovs_flow_cmd_fill_info() and ovs_flow_cmd_build_info() to take a
dp_ifindex directly, rather than a datapath pointer that is then
(only) used to get the dp_ifindex.  This is useful, since the
dp_ifindex is available even when the datapath pointer is not, both
before and after taking a lock, which makes further critical section
reduction possible.

Make ovs_flow_cmd_alloc_info() take an 'acts' argument instead a
'flow' pointer.  This allows some future patches to do the allocation
before acquiring the flow pointer.

The locking requirements after this patch are:

ovs_flow_cmd_alloc_info(): May be called without locking, must not be
  called while holding the RCU read lock (due to memory allocation).
  If 'acts' belong to a flow in the flow table, however, then the
  caller must hold ovs_mutex.

ovs_flow_cmd_fill_info(): Either ovs_mutex or RCU read lock must be held.

ovs_flow_cmd_build_info(): This calls both of the above, so the caller
  must hold ovs_mutex.

Signed-off-by: Jarno Rajahalme <jrajahalme@nicira.com>
Signed-off-by: Pravin B Shelar <pshelar@nicira.com>
datapath/datapath.c