From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Dumazet Subject: [PATCH net 4/5] mlx4: fix race accessing page->_count Date: Thu, 9 Oct 2014 22:24:53 -0700 Message-ID: <1412918694-22882-5-git-send-email-edumazet@google.com> References: <1412918694-22882-1-git-send-email-edumazet@google.com> Cc: netdev@vger.kernel.org, Alexander Duyck , Andres Lagar-Cavilla , Greg Thelen , Hugh Dickins , David Rientjes , Eric Dumazet To: "David S. Miller" Return-path: Received: from mail-pd0-f202.google.com ([209.85.192.202]:42706 "EHLO mail-pd0-f202.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751663AbaJJFZG (ORCPT ); Fri, 10 Oct 2014 01:25:06 -0400 Received: by mail-pd0-f202.google.com with SMTP id fp1so237323pdb.1 for ; Thu, 09 Oct 2014 22:25:06 -0700 (PDT) In-Reply-To: <1412918694-22882-1-git-send-email-edumazet@google.com> Sender: netdev-owner@vger.kernel.org List-ID: This is illegal to use atomic_set(&page->_count, ...) 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 --- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index a33048ee9621..01660c595f5c 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c @@ -76,10 +76,10 @@ static int mlx4_alloc_pages(struct mlx4_en_priv *priv, page_alloc->dma = dma; page_alloc->page_offset = frag_info->frag_align; /* Not doing get_page() for each frag is a big win - * on asymetric workloads. + * on asymetric workloads. Note we can not use atomic_set(). */ - atomic_set(&page->_count, - page_alloc->page_size / frag_info->frag_stride); + atomic_add(page_alloc->page_size / frag_info->frag_stride - 1, + &page->_count); return 0; } -- 2.1.0.rc2.206.gedb03e5