From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Cyrus-Session-Id: sloti22d1t05-655063-1516759019-2-9502011930246124699 X-Sieve: CMU Sieve 3.0 X-Spam-known-sender: no X-Spam-score: 0.0 X-Spam-hits: BAYES_00 -1.9, HEADER_FROM_DIFFERENT_DOMAINS 0.25, ME_NOAUTH 0.01, RCVD_IN_DNSWL_HI -5, T_RP_MATCHES_RCVD -0.01, LANGUAGES en, BAYES_USED global, SA_VERSION 3.4.0 X-Spam-source: IP='209.132.180.67', Host='vger.kernel.org', Country='US', FromHeader='org', MailFrom='org' X-Spam-charsets: plain='ISO-8859-15' X-Attached: 0001-sched-rt-Use-container_of-to-get-root-domain-in-rto_.patch X-Resolved-to: greg@kroah.com X-Delivered-to: greg@kroah.com X-Mail-from: stable-owner@vger.kernel.org ARC-Seal: i=1; a=rsa-sha256; cv=none; d=messagingengine.com; s=arctest; t=1516759018; b=RGj4a5bIW/DrezaWQp5KlFFmPWmy7UokvZ1uD+bSj2DdrQd 9YzV0HXc4Si15MFRgQFtV7o/CEQzcElUBavg5jIjbAa93OFD/BhcwvE+Bd6dT0XA fjun3FRuA23HwRFX7R0WzA639GeEcNlFAn71PdytMkpJxL8orDVVfGBWYk3lyXDw yq8sfRVkFX+Yc0iwzALX12NV2qJCnTxLgnGqNYeNByBIeJ77dJ78iFEoIh34TpTs b/4cwc765BHHiJIojX9L4FxhlO9+D4wTAceLNoyFZVBZST7Q1aqgIL7ZZnibep9/ ewTbRTsGsJYaIe2gl+KIi+tHKX2Ol9iyQb93B7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=message-id:date:from:to:cc:subject :references:mime-version:content-type:sender:list-id; s=arctest; t=1516759018; bh=MJkztiC6FYky54tOiaCL6rqzJ2Ta8i2O3ymE7j3KKpU=; b= pdGm1RCv3zExtbzanTLrVIGyvJQvfK/GnS5VPPj54NsDG31D3uo0xyj6aO6sy4mC ZehfvPdwwH4cZ19p5f2L/ReoIq/A2HrOUkqcKx82ElvEHtDoJl978tuf/mBmGZmi s/OH2j3Dcu839ggFLhd6R1OVXCsHXOleBYqMgpCaed9rVjBspZyhhKYxKTr/yyU9 2R3y336DMPBTi4CcDzNkAbRSl6QCaBuiwxL0vY5S/AqGB+EkEu9sFqYTJjfxPjxo f8v/FPULc27TDDCPrrnkpedK4QKxFUy70owrq3iecuIZwx92Cfv/9HGb+k6oSe0Z 4rF/eMxUX2bhb4WZIsFVVg== ARC-Authentication-Results: i=1; mx2.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=goodmis.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=goodmis.org header.result=pass header_is_org_domain=yes Authentication-Results: mx2.messagingengine.com; arc=none (no signatures found); dkim=none (no signatures found); dmarc=none (p=none,has-list-id=yes,d=none) header.from=goodmis.org; iprev=pass policy.iprev=209.132.180.67 (vger.kernel.org); spf=none smtp.mailfrom=stable-owner@vger.kernel.org smtp.helo=vger.kernel.org; x-aligned-from=fail; x-ptr=pass x-ptr-helo=vger.kernel.org x-ptr-lookup=vger.kernel.org; x-return-mx=pass smtp.domain=vger.kernel.org smtp.result=pass smtp_org.domain=kernel.org smtp_org.result=pass smtp_is_org_domain=no header.domain=goodmis.org header.result=pass header_is_org_domain=yes Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752113AbeAXB4Y (ORCPT ); Tue, 23 Jan 2018 20:56:24 -0500 Received: from mail.kernel.org ([198.145.29.99]:40502 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751884AbeAXB4X (ORCPT ); Tue, 23 Jan 2018 20:56:23 -0500 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5195F21796 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=goodmis.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=rostedt@goodmis.org Message-Id: <20180124015620.675202611@goodmis.org> User-Agent: quilt/0.63-1 Date: Tue, 23 Jan 2018 20:45:37 -0500 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Ingo Molnar , Andrew Morton , Peter Zijlstra , Pavan Kondeti , stable@vger.kernel.org Subject: [PATCH 1/2] sched/rt: Use container_of() to get root domain in rto_push_irq_work_func() References: <20180124014536.348451435@goodmis.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-15 Content-Disposition: inline; filename=0001-sched-rt-Use-container_of-to-get-root-domain-in-rto_.patch Sender: stable-owner@vger.kernel.org X-Mailing-List: stable@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-Mailing-List: linux-kernel@vger.kernel.org List-ID: From: "Steven Rostedt (VMware)" 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. Link: http://lkml.kernel.org/r/CAEU1=PkiHO35Dzna8EQqNSKW1fr1y1zRQ5y66X117MG06sQtNA@mail.gmail.com Cc: stable@vger.kernel.org Fixes: 4bdced5c9a292 ("sched/rt: Simplify the IPI based RT balancing logic") Reported-by: Pavan Kondeti Signed-off-by: Steven Rostedt (VMware) --- 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 665ace2fc558..274b55e4a560 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 */ -- 2.15.1