rocker: fix neigh tbl index increment race
authorScott Feldman <sfeldma@gmail.com>
Sat, 13 Jun 2015 04:24:40 +0000 (21:24 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 15 Jun 2015 23:04:21 +0000 (16:04 -0700)
commit4d81db4156caef7b223dde07e50db0144d12a192
tree26fd99f00ba0c939dd4ecfb1a795e2158882f053
parenta07203108494d00efdd8f2fcbf9f2f4f63110e60
rocker: fix neigh tbl index increment race

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: Simon Horman <simon.horman@netronome.com>
Signed-off-by: Scott Feldman <sfeldma@gmail.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/rocker/rocker.c