From patchwork Mon Apr 18 11:34:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Konstantin Khlebnikov X-Patchwork-Id: 611703 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3qpR8y2MTtz9sXR for ; Mon, 18 Apr 2016 21:42:58 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=yandex-team.ru header.i=@yandex-team.ru header.b=viPlVYoF; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753083AbcDRLl4 (ORCPT ); Mon, 18 Apr 2016 07:41:56 -0400 Received: from forward-corp1o.mail.yandex.net ([37.140.190.172]:48965 "EHLO forward-corp1o.mail.yandex.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752947AbcDRLly (ORCPT ); Mon, 18 Apr 2016 07:41:54 -0400 Received: from smtpcorp1m.mail.yandex.net (smtpcorp1m.mail.yandex.net [77.88.61.150]) by forward-corp1o.mail.yandex.net (Yandex) with ESMTP id 196E439206CC; Mon, 18 Apr 2016 14:34:08 +0300 (MSK) Received: from smtpcorp1m.mail.yandex.net (localhost [127.0.0.1]) by smtpcorp1m.mail.yandex.net (Yandex) with ESMTP id CC9832CA08C6; Mon, 18 Apr 2016 14:34:08 +0300 (MSK) Received: from unknown (unknown [2a02:6b8:0:408:eef4:bbff:fe5b:9a77]) by smtpcorp1m.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id a3rbcoyLoX-Y8WCnsqm; Mon, 18 Apr 2016 14:34:08 +0300 (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client certificate not present) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex-team.ru; s=default; t=1460979248; bh=9cJlK80kUruyWVLvsUHbU945UtllBn9rFQYQnzP05Sc=; h=Subject:From:To:Cc:Date:Message-ID:User-Agent:MIME-Version: Content-Type:Content-Transfer-Encoding; b=viPlVYoFExjvLdgw0yx2enwfowxcJSXjZizqdxo6UVPgxCM27gOkpRSzZvR6ZGYKh AaNRRwSd4li6OA6CKJGmcjgqyw/iUVlX88UkkyOV/CAIl7/Y/0ASGUJSN4QSZ9TkAB PrvmOQLrqS9tw9eGgt+7hshYZdCNzTGXsSBfq3II= Authentication-Results: smtpcorp1m.mail.yandex.net; dkim=pass header.i=@yandex-team.ru Subject: [PATCH] net/mlx4_en: do batched put_page using atomic_sub From: Konstantin Khlebnikov To: netdev@vger.kernel.org, Yishai Hadas , Eugenia Emantayev Cc: linux-kernel@vger.kernel.org Date: Mon, 18 Apr 2016 14:34:05 +0300 Message-ID: <146097924572.15144.10837875571142670008.stgit@buzz> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This patch fixes couple error paths after allocation failures. Atomic set of page reference counter is safe only if it is zero, otherwise set can race with any speculative get_page_unless_zero. Signed-off-by: Konstantin Khlebnikov --- drivers/net/ethernet/mellanox/mlx4/en_rx.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx4/en_rx.c b/drivers/net/ethernet/mellanox/mlx4/en_rx.c index 56d070d9cf01..7d25bc9c1b22 100644 --- a/drivers/net/ethernet/mellanox/mlx4/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx4/en_rx.c @@ -126,7 +126,9 @@ out: dma_unmap_page(priv->ddev, page_alloc[i].dma, page_alloc[i].page_size, PCI_DMA_FROMDEVICE); page = page_alloc[i].page; - set_page_count(page, 1); + /* Revert changes done by mlx4_alloc_pages */ + page_ref_sub(page, page_alloc[i].page_size / + priv->frag_info[i].frag_stride - 1); put_page(page); } } @@ -176,7 +178,9 @@ out: dma_unmap_page(priv->ddev, page_alloc->dma, page_alloc->page_size, PCI_DMA_FROMDEVICE); page = page_alloc->page; - set_page_count(page, 1); + /* Revert changes done by mlx4_alloc_pages */ + page_ref_sub(page, page_alloc->page_size / + priv->frag_info[i].frag_stride - 1); put_page(page); page_alloc->page = NULL; }