• Jarno Rajahalme's avatar
    openvswitch: Reduce locking requirements. · 0e9796b4
    Jarno Rajahalme authored
    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: default avatarJarno Rajahalme <jrajahalme@nicira.com>
    Signed-off-by: default avatarPravin B Shelar <pshelar@nicira.com>
    0e9796b4
datapath.c 48.1 KB