• Scott Feldman's avatar
    rocker: fix neigh tbl index increment race · 4d81db41
    Scott Feldman authored
    rocker->neigh_tbl_next_index is used to generate unique indices for neigh
    entries programmed into the device.  The way new indices were generated was
    racy with the new prepare-commit transaction model.  A simple fix here
    removes the race.  The race was with two processes getting the same index,
    one process using prepare-commit, the other not:
    
    Proc A					Proc B
    
    PREPARE phase
    get neigh_tbl_next_index
    
    					NONE phase
    					get neigh_tbl_next_index
    					neigh_tbl_next_index++
    
    COMMIT phase
    neigh_tbl_next_index++
    
    Both A and B got the same index.  The fix is to store and increment
    neigh_tbl_next_index in the PREPARE (or NONE) phase and use value in COMMIT
    phase:
    
    Proc A					Proc B
    
    PREPARE phase
    get neigh_tbl_next_index
    neigh_tbl_next_index++
    
    					NONE phase
    					get neigh_tbl_next_index
    					neigh_tbl_next_index++
    
    COMMIT phase
    // use value stashed in PREPARE phase
    Reported-by: default avatarSimon Horman <simon.horman@netronome.com>
    Signed-off-by: default avatarScott Feldman <sfeldma@gmail.com>
    Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    4d81db41
rocker.c 141 KB