From patchwork Thu Feb 7 19:07:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Waiman Long X-Patchwork-Id: 10802027 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 4C6431669 for ; Thu, 7 Feb 2019 19:25:43 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3ACB32D6C2 for ; Thu, 7 Feb 2019 19:25:43 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 2E7FB2E115; Thu, 7 Feb 2019 19:25:43 +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=-5.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D71082D6C2 for ; Thu, 7 Feb 2019 19:25:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=FYka0gCOexeK33axT0j5tFr4zifm+GbjYXFVAgF2S00=; b=GgXY2qs9Ll9eVePSI4ZUFMUtTw le8Bw2fFU2kZYSSaTIPtDuYBAgSBgjzVcild46SHfTPL5lDuDFflOtrVTW7TWD5zvFiIMD1meBzG4 0SkIj5WBRr6Mu2dspfPD2vvZO8+THAZyn/0AYdaV3+AEY18JeRnAhKyMtOm8iMMs7s1XyexTsK7a5 fqYRzVwLw7hq8YrjVlxn9sEDtqJAPkjLZDVJs+b20O/USUAI8kql2HyoWbkWg7IGMmlbuSuc7soWn 2VCiYnQyg42r1oahs6JK/IXwtKOyqFWcVSx9OeCx86c4iGuIOe0pe/6KixF903sYiNpxUHCyw6l13 vC+3Gp5w==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1grpIp-0002nK-Ad; Thu, 07 Feb 2019 19:25:39 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1grpIo-0001Lj-CL for linux-arm-kernel@bombadil.infradead.org; Thu, 07 Feb 2019 19:25:38 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=AqCROM3m0szd5qixFDYJLm6Jj0fp1QM31Rd8FvZ1b6s=; b=SByAu0zmpWk71I5iXKsN2Imkr GckW71RHQlhdd2WIfLSx90Uw9m7ZwR0z0oDDrCHkMv/Jafc2iI1UYjJRKJ4KWIU6g87ohJdAKjwgm yjd4jHcOzjs/bmX1WhGsAS7PAdypctxO4zrz7R0kPyCZOYN3nkucnmAZaPBBou92jvPIr/7HwS/MQ rPgd/t/mohnlxI9JGz4ivJZsSxy73bOmg3lxS6nDoYvQq/ltkgao4QpclL6jPm4joeRxKH/2OzUOe mBT5tv2EFYLQGSgr4vo+bhXZ3JhcDmwmSKLNH4ocvUrOIbvBMppL0iOYio8pvsNYsnF47QpymCv8S hxnmO2wTQ==; Received: from mx1.redhat.com ([209.132.183.28]) by casper.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1grp47-0004lo-JY for linux-arm-kernel@lists.infradead.org; Thu, 07 Feb 2019 19:10:30 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 03F0B37E85; Thu, 7 Feb 2019 19:10:26 +0000 (UTC) Received: from llong.com (dhcp-17-35.bos.redhat.com [10.18.17.35]) by smtp.corp.redhat.com (Postfix) with ESMTP id DB62662FA3; Thu, 7 Feb 2019 19:10:23 +0000 (UTC) From: Waiman Long To: Peter Zijlstra , Ingo Molnar , Will Deacon , Thomas Gleixner Subject: [PATCH-tip 22/22] locking/rwsem: Ensure an RT task will not spin on reader Date: Thu, 7 Feb 2019 14:07:26 -0500 Message-Id: <1549566446-27967-23-git-send-email-longman@redhat.com> In-Reply-To: <1549566446-27967-1-git-send-email-longman@redhat.com> References: <1549566446-27967-1-git-send-email-longman@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Thu, 07 Feb 2019 19:10:26 +0000 (UTC) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190207_191028_062078_4F55D4D5 X-CRM114-Status: GOOD ( 22.69 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-arch@vger.kernel.org, linux-xtensa@linux-xtensa.org, Davidlohr Bueso , linux-ia64@vger.kernel.org, Tim Chen , Arnd Bergmann , linux-sh@vger.kernel.org, linux-hexagon@vger.kernel.org, x86@kernel.org, "H. Peter Anvin" , linux-kernel@vger.kernel.org, Linus Torvalds , Borislav Petkov , linux-alpha@vger.kernel.org, sparclinux@vger.kernel.org, Waiman Long , Andrew Morton , linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP An RT task can do optimistic spinning only if the lock holder is actually running. If the state of the lock holder isn't known, there is a possibility that high priority of the RT task may block forward progress of the lock holder if they happen to reside on the same CPU. This will lead to deadlock. So we have to make sure that an RT task will not spin on a reader-owned rwsem. Signed-off-by: Waiman Long --- kernel/locking/rwsem-xadd.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index 3cf2e84..ac1f6c4 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c @@ -349,12 +349,14 @@ static inline bool rwsem_can_spin_on_owner(struct rw_semaphore *sem) /* * Return the folowing three values depending on the lock owner state. + * 2 when owner is currently NULL * 1 when owner changes and no reader is detected yet. * 0 when owner changes and the new owner may be a reader. * -1 when optimistic spinning has to stop because either the owner stops * running, is unknown, or its timeslice has been used up. */ enum owner_state { + OWNER_NULL = 2, OWNER_SPINNABLE = 1, OWNER_READER = 0, OWNER_NONSPINNABLE = -1, @@ -405,7 +407,8 @@ static noinline enum owner_state rwsem_spin_on_owner(struct rw_semaphore *sem) owner = rwsem_get_owner(sem); if (!is_rwsem_owner_spinnable(owner)) return OWNER_NONSPINNABLE; - return is_rwsem_owner_reader(owner) ? OWNER_READER : OWNER_SPINNABLE; + return !owner ? OWNER_NULL : + is_rwsem_owner_reader(owner) ? OWNER_READER : OWNER_SPINNABLE; } static bool rwsem_optimistic_spin(struct rw_semaphore *sem, const long wlock) @@ -442,12 +445,13 @@ static bool rwsem_optimistic_spin(struct rw_semaphore *sem, const long wlock) break; /* - * When there's no owner, we might have preempted between the - * owner acquiring the lock and setting the owner field. If - * we're an RT task that will live-lock because we won't let - * the owner complete. + * An RT task cannot do optimistic spinning if it cannot + * be sure the lock holder is running. When there's no owner + * or is reader-owned, an RT task has to stop spinning or + * live-lock may happen if the current task and the lock + * holder happen to run in the same CPU. */ - if (!rwsem_get_owner(sem) && + if ((owner_state != OWNER_SPINNABLE) && (need_resched() || rt_task(current))) break;