]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commitfd6415bf29696fc58ef9aff3ae9cf13ab8f15863
tree26fd99f00ba0c939dd4ecfb1a795e2158882f053
parent7154b1339eecfbe051c0eae7fddd04d715a2f42f
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