From patchwork Wed May 9 19:36:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sebastian Andrzej Siewior X-Patchwork-Id: 10390669 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 228B360153 for ; Wed, 9 May 2018 19:38:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 11FD728469 for ; Wed, 9 May 2018 19:38:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 060ED284D4; Wed, 9 May 2018 19:38:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D929A28469 for ; Wed, 9 May 2018 19:38:45 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 15BBB6B056E; Wed, 9 May 2018 15:38:45 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 119AB6B0571; Wed, 9 May 2018 15:38:45 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F3AFC6B0570; Wed, 9 May 2018 15:38:44 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-wr0-f199.google.com (mail-wr0-f199.google.com [209.85.128.199]) by kanga.kvack.org (Postfix) with ESMTP id 965616B056E for ; Wed, 9 May 2018 15:38:44 -0400 (EDT) Received: by mail-wr0-f199.google.com with SMTP id k16-v6so24460921wrh.6 for ; Wed, 09 May 2018 12:38:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=pSSdiBG49kFS7rct1U+VK+URGnRSo9XvLSOyzh1Z/7I=; b=h+bVBE/W3ajxqT4J9Y77m9gbYq95OGHyULpryf6yVGK6zWUV5Du0WCa9oKupNUA9l6 DxZqTgkDkn+VGLygF/V69WY16TTxm0Vi5d1xGNNJwG68n8UXqYThoyL8tt9dQIBpVrG6 WVv6DZeE2XTJvSAQ1EQepOifuKVCU3jGDY3OwnLJBxQGDso8+cndUidhaEa/XqlqaEKy wkW4tbxsDu1Fd1zqtfIUoasaQ+PEXofrYTIVE2S13H85aTAipbBcK8f78RrO2LnIIaR9 MeE1fQy2Vx5KMakN4jZ88/gomc572B1pCtSGPLEd7xNuF/A9ACcVHXrMns9gtrZY5eGE ZkuQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of bigeasy@linutronix.de designates 2a01:7a0:2:106d:700::1 as permitted sender) smtp.mailfrom=bigeasy@linutronix.de X-Gm-Message-State: ALQs6tBW7JeP4t/mTPgQfeXi0CxQGwk0IBrz1Brj32N9W4n0CdflhqZa /ImYflbw+EPgo6SJAmiJRlvECYGMxNwx6zg4+MymXLhxBQlJrkzBBKWDyOBnVItIzmuTrAE4rkZ E8zP6zlnUVN49ml1FbW3rGdiWL9WHSypnPf0xm1xAwahjb5wRfHvgImPCbw0x+oho7A== X-Received: by 2002:adf:c3cd:: with SMTP id d13-v6mr33964219wrg.282.1525894724142; Wed, 09 May 2018 12:38:44 -0700 (PDT) X-Google-Smtp-Source: AB8JxZr0NYlAaS/by69Uq7368JC4vAhbFG1NfDpdL4OHSQAwMb0NNwfNZOA636sJYjXUugbF+tje X-Received: by 2002:adf:c3cd:: with SMTP id d13-v6mr33964192wrg.282.1525894723305; Wed, 09 May 2018 12:38:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525894723; cv=none; d=google.com; s=arc-20160816; b=rgmmDgeN36b157xE9laUK9WNUSxp64updu2Hw/4fCE6YiYXY4xwhV7BdVLIv4q13tk vgqAmE2Pgn9Ur6379HJP7m/naqUUhKzv4ZNjsjfur5LppIZWCsgroV4ttL7LLEhP39n+ tjWJkYZMzLtwcOEd5hcqhrdVkfHNP+4b/Oj/GE6oYq57uueQSr8CXQfvFT4eTUKNBGey c1KYYAJNuqshComP4TerXBV4kavzAGHWzlHc3IGSFIzZ8JmcKEVPg5pELBbJZkE0widc j5G8lUO0AI+sVnFkkvIQ0yIeKJn2McntOMjcMZfTHPRd3ko88W5aA4TdLOm3gu1jJKCO EYYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:arc-authentication-results; bh=pSSdiBG49kFS7rct1U+VK+URGnRSo9XvLSOyzh1Z/7I=; b=bzQmHAJRNiwtZsRvUs3/I9byG5kWEpo69gXL6c6BX1lX6uiKkAGMZ9RhszKVyZPMXw JrCc2ppei9ND31T7LG9spgd8uIfhEssoXS69lQcjMp4833MgbZtxp0wx4YXjF8B6kj1X RW8AABU1pLXI/QEB/2Oq76ylhiJrSjZ1jslpYkDyf//e9bPbIoZeYZikw544NzEZHRQG 1TleGnOmwZetKdSF6VB2HBrRe95mi4XRCOiKbgu1OZjwcsT+3R612/BGFWxQr+oihDT1 9ECvaVUtna+lqb0M7ysCYGcG2r7IhExi9p/PbAvyniBZIqoN7HWHxN8YK9bu+YD7MKkh K1aQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of bigeasy@linutronix.de designates 2a01:7a0:2:106d:700::1 as permitted sender) smtp.mailfrom=bigeasy@linutronix.de Received: from Galois.linutronix.de (Galois.linutronix.de. [2a01:7a0:2:106d:700::1]) by mx.google.com with ESMTPS id a5-v6si8074115wrf.92.2018.05.09.12.38.43 for (version=TLS1_2 cipher=AES128-SHA bits=128/128); Wed, 09 May 2018 12:38:43 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of bigeasy@linutronix.de designates 2a01:7a0:2:106d:700::1 as permitted sender) client-ip=2a01:7a0:2:106d:700::1; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of bigeasy@linutronix.de designates 2a01:7a0:2:106d:700::1 as permitted sender) smtp.mailfrom=bigeasy@linutronix.de Received: from localhost ([127.0.0.1] helo=bazinga.breakpoint.cc) by Galois.linutronix.de with esmtp (Exim 4.80) (envelope-from ) id 1fGUv9-0005v9-36; Wed, 09 May 2018 21:38:39 +0200 From: Sebastian Andrzej Siewior To: linux-kernel@vger.kernel.org Cc: tglx@linutronix.de, Peter Zijlstra , Ingo Molnar , linux-mm@kvack.org, Shaohua Li , linux-raid@vger.kernel.org, Anna-Maria Gleixner , Sebastian Andrzej Siewior Subject: [PATCH 1/8] bdi: use refcount_t for reference counting instead atomic_t Date: Wed, 9 May 2018 21:36:38 +0200 Message-Id: <20180509193645.830-2-bigeasy@linutronix.de> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180509193645.830-1-bigeasy@linutronix.de> References: <20180509193645.830-1-bigeasy@linutronix.de> MIME-Version: 1.0 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP refcount_t type and corresponding API should be used instead of atomic_t when the variable is used as a reference counter. This allows to avoid accidental refcounter overflows that might lead to use-after-free situations. Suggested-by: Peter Zijlstra Signed-off-by: Sebastian Andrzej Siewior --- include/linux/backing-dev-defs.h | 3 ++- include/linux/backing-dev.h | 4 ++-- mm/backing-dev.c | 12 ++++++------ 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/include/linux/backing-dev-defs.h b/include/linux/backing-dev-defs.h index 0bd432a4d7bd..81c75934ca5b 100644 --- a/include/linux/backing-dev-defs.h +++ b/include/linux/backing-dev-defs.h @@ -12,6 +12,7 @@ #include #include #include +#include struct page; struct device; @@ -76,7 +77,7 @@ enum wb_reason { */ struct bdi_writeback_congested { unsigned long state; /* WB_[a]sync_congested flags */ - atomic_t refcnt; /* nr of attached wb's and blkg */ + refcount_t refcnt; /* nr of attached wb's and blkg */ #ifdef CONFIG_CGROUP_WRITEBACK struct backing_dev_info *__bdi; /* the associated bdi, set to NULL diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 72ca0f3d39f3..c28a47cbe355 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -404,13 +404,13 @@ static inline bool inode_cgwb_enabled(struct inode *inode) static inline struct bdi_writeback_congested * wb_congested_get_create(struct backing_dev_info *bdi, int blkcg_id, gfp_t gfp) { - atomic_inc(&bdi->wb_congested->refcnt); + refcount_inc(&bdi->wb_congested->refcnt); return bdi->wb_congested; } static inline void wb_congested_put(struct bdi_writeback_congested *congested) { - if (atomic_dec_and_test(&congested->refcnt)) + if (refcount_dec_and_test(&congested->refcnt)) kfree(congested); } diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 7441bd93b732..7984a872073e 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -450,10 +450,10 @@ wb_congested_get_create(struct backing_dev_info *bdi, int blkcg_id, gfp_t gfp) if (new_congested) { /* !found and storage for new one already allocated, insert */ congested = new_congested; - new_congested = NULL; rb_link_node(&congested->rb_node, parent, node); rb_insert_color(&congested->rb_node, &bdi->cgwb_congested_tree); - goto found; + spin_unlock_irqrestore(&cgwb_lock, flags); + return congested; } spin_unlock_irqrestore(&cgwb_lock, flags); @@ -463,13 +463,13 @@ wb_congested_get_create(struct backing_dev_info *bdi, int blkcg_id, gfp_t gfp) if (!new_congested) return NULL; - atomic_set(&new_congested->refcnt, 0); + refcount_set(&new_congested->refcnt, 1); new_congested->__bdi = bdi; new_congested->blkcg_id = blkcg_id; goto retry; found: - atomic_inc(&congested->refcnt); + refcount_inc(&congested->refcnt); spin_unlock_irqrestore(&cgwb_lock, flags); kfree(new_congested); return congested; @@ -486,7 +486,7 @@ void wb_congested_put(struct bdi_writeback_congested *congested) unsigned long flags; local_irq_save(flags); - if (!atomic_dec_and_lock(&congested->refcnt, &cgwb_lock)) { + if (!refcount_dec_and_lock(&congested->refcnt, &cgwb_lock)) { local_irq_restore(flags); return; } @@ -794,7 +794,7 @@ static int cgwb_bdi_init(struct backing_dev_info *bdi) if (!bdi->wb_congested) return -ENOMEM; - atomic_set(&bdi->wb_congested->refcnt, 1); + refcount_set(&bdi->wb_congested->refcnt, 1); err = wb_init(&bdi->wb, bdi, 1, GFP_KERNEL); if (err) {