Received: by 2002:ac0:a5a6:0:0:0:0:0 with SMTP id m35-v6csp716281imm; Thu, 13 Sep 2018 06:44:58 -0700 (PDT) X-Google-Smtp-Source: ANB0VdbuiW1Kv23N3hsf7EJdXlLbHVIm0fDFvtb8EFmaD51PiVreDdvQTdTgCqJUWcsfz3+gqESN X-Received: by 2002:a62:455b:: with SMTP id s88-v6mr7464279pfa.203.1536846298901; Thu, 13 Sep 2018 06:44:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536846298; cv=none; d=google.com; s=arc-20160816; b=QUGhaD6OKNHsSCJ7Kmw+4/A3gHwQaQ/4Ic+oBlIRZuFtDGHeTyLxPGicMJccQaB1mV BUbKsSfWnGfB8Q7lIk8zx6R7nLMWAcxi0jPWVQbtCESQMaTtPbQ0d70sitSTZUNPrXrx 3CHcrRZfwO2vCrj4SgHmI/JVsWi64AxdyipIHFNY+X2S4n34ecOpGst9gZ2OPAnjAPT0 bIHLC3pwA0ASvs2atcH9I1aKUdo8nvhcMCd78OnOnt5j4EmmKBWkLX3jq7TaMFmqlvKS 63F5uAAwXkqDfAu1t068BeeUwxcAYO/CuhjTBmuJUwIADcAArNefPtP76V/4XFV+MqOp mprA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from; bh=hiYLRH8AFAZanI8C+5qc6KqtumF474xbSZlYWtd0Sf4=; b=L6fHZN2jKKeUgJSJWnt015FvnMV8Sysd/d5W+0T2iQDmvgFgFdUHdzIvxtaBMAbTM2 3uOnaAnLXIa5U1C80MmlzbEh4d8m+YKNiuHrNvNej57CJcYKAFLN6ANublaDGamCpV99 DpHyKe4oZR8rYZviLZGrdyVO2VLK9rZZGSa2g3p93LcVsqASTOy36NGde81iWiQmYbV+ 2FMNlxki90sP3HGxRM1sh1pU7ViPrQjEosDxsCPqpimYTLNGJNiEohsRQ/o/A3R9kfDw B66I4yUgtQ551IRpycl3Zm2oq2vxLx5y7BoPnDDRAfH1zWMW2yqOFn7ZtMAiIUxXZssm UPug== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b2-v6si4009084pgk.491.2018.09.13.06.44.44; Thu, 13 Sep 2018 06:44:58 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729825AbeIMSyK (ORCPT + 99 others); Thu, 13 Sep 2018 14:54:10 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:60582 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728565AbeIMSyK (ORCPT ); Thu, 13 Sep 2018 14:54:10 -0400 Received: from localhost (ip-213-127-77-73.ip.prioritytelecom.net [213.127.77.73]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 0F640D10; Thu, 13 Sep 2018 13:44:36 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Jamal Hadi Salim , Cong Wang , "David S. Miller" Subject: [PATCH 4.14 019/115] act_ife: fix a potential deadlock Date: Thu, 13 Sep 2018 15:30:39 +0200 Message-Id: <20180913131824.703629451@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20180913131823.327472833@linuxfoundation.org> References: <20180913131823.327472833@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.14-stable review patch. If anyone has any objections, please let me know. ------------------ From: Cong Wang [ Upstream commit 5ffe57da29b3802baeddaa40909682bbb4cb4d48 ] use_all_metadata() acquires read_lock(&ife_mod_lock), then calls add_metainfo() which calls find_ife_oplist() which acquires the same lock again. Deadlock! Introduce __add_metainfo() which accepts struct tcf_meta_ops *ops as an additional parameter and let its callers to decide how to find it. For use_all_metadata(), it already has ops, no need to find it again, just call __add_metainfo() directly. And, as ife_mod_lock is only needed for find_ife_oplist(), this means we can make non-atomic allocation for populate_metalist() now. Fixes: 817e9f2c5c26 ("act_ife: acquire ife_mod_lock before reading ifeoplist") Cc: Jamal Hadi Salim Signed-off-by: Cong Wang Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- net/sched/act_ife.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) --- a/net/sched/act_ife.c +++ b/net/sched/act_ife.c @@ -278,22 +278,16 @@ static int load_metaops_and_vet(u32 meta /* called when adding new meta information */ -static int add_metainfo(struct tcf_ife_info *ife, u32 metaid, void *metaval, - int len, bool atomic, bool exists) +static int __add_metainfo(const struct tcf_meta_ops *ops, + struct tcf_ife_info *ife, u32 metaid, void *metaval, + int len, bool atomic, bool exists) { struct tcf_meta_info *mi = NULL; - struct tcf_meta_ops *ops = find_ife_oplist(metaid); int ret = 0; - if (!ops) - return -ENOENT; - mi = kzalloc(sizeof(*mi), atomic ? GFP_ATOMIC : GFP_KERNEL); - if (!mi) { - /*put back what find_ife_oplist took */ - module_put(ops->owner); + if (!mi) return -ENOMEM; - } mi->metaid = metaid; mi->ops = ops; @@ -301,7 +295,6 @@ static int add_metainfo(struct tcf_ife_i ret = ops->alloc(mi, metaval, atomic ? GFP_ATOMIC : GFP_KERNEL); if (ret != 0) { kfree(mi); - module_put(ops->owner); return ret; } } @@ -315,6 +308,21 @@ static int add_metainfo(struct tcf_ife_i return ret; } +static int add_metainfo(struct tcf_ife_info *ife, u32 metaid, void *metaval, + int len, bool exists) +{ + const struct tcf_meta_ops *ops = find_ife_oplist(metaid); + int ret; + + if (!ops) + return -ENOENT; + ret = __add_metainfo(ops, ife, metaid, metaval, len, false, exists); + if (ret) + /*put back what find_ife_oplist took */ + module_put(ops->owner); + return ret; +} + static int use_all_metadata(struct tcf_ife_info *ife, bool exists) { struct tcf_meta_ops *o; @@ -323,7 +331,7 @@ static int use_all_metadata(struct tcf_i read_lock(&ife_mod_lock); list_for_each_entry(o, &ifeoplist, list) { - rc = add_metainfo(ife, o->metaid, NULL, 0, true, exists); + rc = __add_metainfo(o, ife, o->metaid, NULL, 0, true, exists); if (rc == 0) installed += 1; } @@ -412,7 +420,7 @@ static int populate_metalist(struct tcf_ if (rc != 0) return rc; - rc = add_metainfo(ife, i, val, len, false, exists); + rc = add_metainfo(ife, i, val, len, exists); if (rc) return rc; }