Received: by 10.223.176.5 with SMTP id f5csp571255wra; Tue, 6 Feb 2018 03:58:56 -0800 (PST) X-Google-Smtp-Source: AH8x224tMkJJ9F13rqpsINsMei8hBTwaTWP+zERqpajOSqtdqZLPlBXeRtqnL5MmCiUEgzZE8QNJ X-Received: by 2002:a17:902:fa2:: with SMTP id 31-v6mr2242138plz.346.1517918335957; Tue, 06 Feb 2018 03:58:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517918335; cv=none; d=google.com; s=arc-20160816; b=g/etoGlfIfpmRspsJPUs58y023QNHjivMYOwKl1m4DsBF4w13pY8+9CeVQdbC/TjNM 5KNZox3E58m/HgcxVW9xWgrjUcXlanR7mXSFebIAF9EEG+332mRQgo8BhQBXLaqcQdBy y3Ic4Y6iXN6a5Ebx/BLwB1C6NqkMU+5yvigiyiFb8AQuU9DsNNb4kdpDYamV48Ou2dZ3 iDf/OVY50+3i5uPT4k7u9NI2Ukrn2OjOrvthiZfShjarYX92cB2++RayOhEMr8/B/fq1 VSEqonEA0zNDrfuwwV5DfUiIcfM88Zvf5rBYV8Hy9v0Ej1nRrAKCTGBLSyBSVgWdjXof gNNA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-disposition :content-transfer-encoding:mime-version:robot-unsubscribe:robot-id :git-commit-id:subject:to:references:in-reply-to:reply-to:cc :message-id:from:date:arc-authentication-results; bh=U0zQFojlXkOBElFHvEMqz3HYQO7v83eW383YQJcnWbM=; b=pl3+mDdz0VCunEohGY1PixvTU2UAHeXoguKnXzs7v40WwvsMNamAi82jX6Q76PHLmn dfVk8WNVf0r/PzQi9+FIP9eman8MYkEZl4Gnue0ED6FXBjXs92REd3gXoo0v5pBdx6ZJ 3JYwE7SvolAvzdH35exzot10eiIQLxN/Za7N0nDkvOHwmCbzfRntc4l3C7+41hsTDv/W dcjTw0B4uSZ6+g5P2HtawHYLwocArMLDfy8LLxX7ce79bOzqvoDnlK7r8VfRij7+fHk0 jHvUfeTYxZvTJHSdFopqaSjQkJUbIkfMqTOIoCUshxj3KfWHXokLZsDdG0oiShUpOis7 u6kg== 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 e3si1049393pff.210.2018.02.06.03.58.42; Tue, 06 Feb 2018 03:58:55 -0800 (PST) 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 S1752866AbeBFL5w (ORCPT + 99 others); Tue, 6 Feb 2018 06:57:52 -0500 Received: from terminus.zytor.com ([65.50.211.136]:57211 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752324AbeBFL5m (ORCPT ); Tue, 6 Feb 2018 06:57:42 -0500 Received: from terminus.zytor.com (localhost [127.0.0.1]) by terminus.zytor.com (8.15.2/8.15.2) with ESMTP id w16BsG10026057; Tue, 6 Feb 2018 03:54:16 -0800 Received: (from tipbot@localhost) by terminus.zytor.com (8.15.2/8.15.2/Submit) id w16BsGHP026054; Tue, 6 Feb 2018 03:54:16 -0800 Date: Tue, 6 Feb 2018 03:54:16 -0800 X-Authentication-Warning: terminus.zytor.com: tipbot set sender to tipbot@zytor.com using -f From: "tip-bot for Steven Rostedt (VMware)" Message-ID: Cc: pkondeti@codeaurora.org, efault@gmx.de, rostedt@goodmis.org, linux-kernel@vger.kernel.org, hpa@zytor.com, akpm@linux-foundation.org, peterz@infradead.org, tglx@linutronix.de, mingo@kernel.org, torvalds@linux-foundation.org Reply-To: pkondeti@codeaurora.org, hpa@zytor.com, linux-kernel@vger.kernel.org, rostedt@goodmis.org, efault@gmx.de, peterz@infradead.org, akpm@linux-foundation.org, torvalds@linux-foundation.org, mingo@kernel.org, tglx@linutronix.de In-Reply-To: References: To: linux-tip-commits@vger.kernel.org Subject: [tip:sched/urgent] sched/rt: Use container_of() to get root domain in rto_push_irq_work_func() Git-Commit-ID: ad0f1d9d65938aec72a698116cd73a980916895e X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline X-Spam-Status: No, score=-2.9 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham autolearn_force=no version=3.4.1 X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on terminus.zytor.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: ad0f1d9d65938aec72a698116cd73a980916895e Gitweb: https://git.kernel.org/tip/ad0f1d9d65938aec72a698116cd73a980916895e Author: Steven Rostedt (VMware) AuthorDate: Tue, 23 Jan 2018 20:45:37 -0500 Committer: Ingo Molnar CommitDate: Tue, 6 Feb 2018 10:20:33 +0100 sched/rt: Use container_of() to get root domain in rto_push_irq_work_func() When the rto_push_irq_work_func() is called, it looks at the RT overloaded bitmask in the root domain via the runqueue (rq->rd). The problem is that during CPU up and down, nothing here stops rq->rd from changing between taking the rq->rd->rto_lock and releasing it. That means the lock that is released is not the same lock that was taken. Instead of using this_rq()->rd to get the root domain, as the irq work is part of the root domain, we can simply get the root domain from the irq work that is passed to the routine: container_of(work, struct root_domain, rto_push_work) This keeps the root domain consistent. Reported-by: Pavan Kondeti Signed-off-by: Steven Rostedt (VMware) Signed-off-by: Peter Zijlstra (Intel) Cc: Andrew Morton Cc: Linus Torvalds Cc: Mike Galbraith Cc: Peter Zijlstra Cc: Thomas Gleixner Fixes: 4bdced5c9a292 ("sched/rt: Simplify the IPI based RT balancing logic") Link: http://lkml.kernel.org/r/CAEU1=PkiHO35Dzna8EQqNSKW1fr1y1zRQ5y66X117MG06sQtNA@mail.gmail.com Signed-off-by: Ingo Molnar --- kernel/sched/rt.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 862a513..2fb627d 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -1907,9 +1907,8 @@ static void push_rt_tasks(struct rq *rq) * the rt_loop_next will cause the iterator to perform another scan. * */ -static int rto_next_cpu(struct rq *rq) +static int rto_next_cpu(struct root_domain *rd) { - struct root_domain *rd = rq->rd; int next; int cpu; @@ -1985,7 +1984,7 @@ static void tell_cpu_to_push(struct rq *rq) * Otherwise it is finishing up and an ipi needs to be sent. */ if (rq->rd->rto_cpu < 0) - cpu = rto_next_cpu(rq); + cpu = rto_next_cpu(rq->rd); raw_spin_unlock(&rq->rd->rto_lock); @@ -1998,6 +1997,8 @@ static void tell_cpu_to_push(struct rq *rq) /* Called from hardirq context */ void rto_push_irq_work_func(struct irq_work *work) { + struct root_domain *rd = + container_of(work, struct root_domain, rto_push_work); struct rq *rq; int cpu; @@ -2013,18 +2014,18 @@ void rto_push_irq_work_func(struct irq_work *work) raw_spin_unlock(&rq->lock); } - raw_spin_lock(&rq->rd->rto_lock); + raw_spin_lock(&rd->rto_lock); /* Pass the IPI to the next rt overloaded queue */ - cpu = rto_next_cpu(rq); + cpu = rto_next_cpu(rd); - raw_spin_unlock(&rq->rd->rto_lock); + raw_spin_unlock(&rd->rto_lock); if (cpu < 0) return; /* Try the next RT overloaded CPU */ - irq_work_queue_on(&rq->rd->rto_push_work, cpu); + irq_work_queue_on(&rd->rto_push_work, cpu); } #endif /* HAVE_RT_PUSH_IPI */