aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2014-10-10 07:48:15 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-10 15:37:28 -0400
commit00cd5adb0313f540aa58672d14e764d164586a43 (patch)
treebdeeb422a5a8627d6da8a42499aeec2340cef437
parent42b0270b40e2ad692ef59e28233202ee6f293e1e (diff)
igb: fix race accessing page->_count
This is illegal to use atomic_set(&page->_count, 2) even if we 'own' the page. Other entities in the kernel need to use get_page_unless_zero() to get a reference to the page before testing page properties, so we could loose a refcount increment. Signed-off-by: Eric Dumazet <edumazet@google.com> Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index ae59c0b108c5..a21b14495ebd 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -6545,11 +6545,10 @@ static bool igb_can_reuse_rx_page(struct igb_rx_buffer *rx_buffer,
6545 /* flip page offset to other buffer */ 6545 /* flip page offset to other buffer */
6546 rx_buffer->page_offset ^= IGB_RX_BUFSZ; 6546 rx_buffer->page_offset ^= IGB_RX_BUFSZ;
6547 6547
6548 /* since we are the only owner of the page and we need to 6548 /* Even if we own the page, we are not allowed to use atomic_set()
6549 * increment it, just set the value to 2 in order to avoid 6549 * This would break get_page_unless_zero() users.
6550 * an unnecessary locked operation
6551 */ 6550 */
6552 atomic_set(&page->_count, 2); 6551 atomic_inc(&page->_count);
6553#else 6552#else
6554 /* move offset up to the next cache line */ 6553 /* move offset up to the next cache line */
6555 rx_buffer->page_offset += truesize; 6554 rx_buffer->page_offset += truesize;