Received: by 2002:a05:6359:c8b:b0:c7:702f:21d4 with SMTP id go11csp3414591rwb; Mon, 3 Oct 2022 14:49:59 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4ihVDL2qm0PXsZKD96ns1k4OfFHenxL5htT83xnI4aTk25H4sucNR4aokZj2gE5vwyk4tK X-Received: by 2002:a17:90a:6ace:b0:20a:8a9b:33c2 with SMTP id b14-20020a17090a6ace00b0020a8a9b33c2mr9627507pjm.243.1664833799548; Mon, 03 Oct 2022 14:49:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664833799; cv=none; d=google.com; s=arc-20160816; b=OAmf3WBt+yL0swg3GiIF5GH2dCNgfVpdZrUH2Tzu/QUc2wVfgzKQTt8Cpnw9mtQ7IQ Xxsy4ZjLX/6pusQskgWCrlAe4RYll3nLuYSdxQgftMGL+YgrslfiRRpAetroLYAwlYsr vPbdRzi1yAe32bkSnUuMDr5veCrnEm+c3q+CKOxj0n2H9UgaSWptm10HPdHtxewTrsJ3 8pWS1mvwAeADMSMvghsUbgvNq1xgZ7Tof2V/JuldnEbSBdKgM5ae0nbQrkGNhkoQCmiM 6OPy3qU20yeFsLpwMmKBC4lu61XeNn28gK3QsEkO/QiZGzSXsZHCHjltxh7rZdREb7ZA HCug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:from:subject:message-id:references :mime-version:in-reply-to:date:dkim-signature; bh=5yAN+QZy9nLQV95BBsToXol/w+0WJ0BbSV/EIcklhhI=; b=XXmSdLozkWG+UAKSn8kJL36OpaeEq7BycgnETMssJiqBl36edSQS6kfYS2P5Q+B00m Dzbf5eKGyciuciGTl8bQ41ZRDF4sO87P2nUtwH+61kCV0LV3+Rsq+LUO4MmawIPb4O3E aZpkhKizsFuieJZFXnhJKSv9fGtlJZg1AjzAAwgGzOlxhJDFY0IVtTvqtHWmiNJqybIW TEw6h2Ir1g8teDJPUdkjUY5a2RGUBT86SQtdB4YhkrHEKPknGkY55Zx0X1wC9aV5Ebay 3DnRoQ58icyjkZMx7MyNMmxpBVq0B9yI61sqoHpRrIosTNl1Nhj5sMS2AR5ZyDORgmik 2/vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="UGmYR/Dp"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id bc22-20020a656d96000000b0044536a9e8fcsi9330078pgb.485.2022.10.03.14.49.47; Mon, 03 Oct 2022 14:49:59 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20210112 header.b="UGmYR/Dp"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229873AbiJCVpb (ORCPT + 99 others); Mon, 3 Oct 2022 17:45:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229648AbiJCVpM (ORCPT ); Mon, 3 Oct 2022 17:45:12 -0400 Received: from mail-pf1-x44a.google.com (mail-pf1-x44a.google.com [IPv6:2607:f8b0:4864:20::44a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6EACC15FE9 for ; Mon, 3 Oct 2022 14:45:11 -0700 (PDT) Received: by mail-pf1-x44a.google.com with SMTP id cg5-20020a056a00290500b0053511889856so7888174pfb.18 for ; Mon, 03 Oct 2022 14:45:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date; bh=5yAN+QZy9nLQV95BBsToXol/w+0WJ0BbSV/EIcklhhI=; b=UGmYR/DpovHVdZSDCCwUZnO7imMWnpK1NbgRRr4GPlVFt6x5z+WRWU94H4eL4b/xEy qIV2d/OP8IozutNAOWSjCCVvvS5hJvGC9h2G9P3EZDuUF8SN6EcIU9O8Ndt/gpBxN9/e tHeKzMWhqYSYFjb2dOOKaxIuJovDgSQTctef0wpz9n+Vz4PW67XLrv+JF6R0vvtQLaZw dT9RtRzKayQTtY8ohBBUlQ2pDzwCKxC1m5o0hJAUkepu8P0k2UVU5uFQiR/MMF8HN+tL 094PzBukf9NDbmePP+ujjdu/ocEJVfP3YcQYqvuFZ3oSXxqxLZ+ECY6ftdJu3HOYpu/2 GSHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date; bh=5yAN+QZy9nLQV95BBsToXol/w+0WJ0BbSV/EIcklhhI=; b=5py80KFfDe/lOF7uQT/NxTHnhYtFM1kBVTIFd3iLeumAbD4fmJWVVFNervzdKBVW9S FovwP+EnXGT2vyHej+rbAi2j70r7P+g/1tc2FeIwm/foycwDZ+7GSedKiHL+17vWm7t0 bS3miT+6TSz+XSurgPklhdsC8Bt0UVShsC7EqxXLM56LzZ7M90hPjdg3m9cnUrHcBm9x 4J4LNOvku+JPEDYvtQMcN78dtf5ap1jnxWkB175dwxOoBCRrfjNYarzpa0o1YB8bEHLg qopILQKMhMbFStIcxYj3D61J3MF/t5ebo2ILTaDGeJ/avIWl42kOUlHuOZ5pabWfR46l 8cgw== X-Gm-Message-State: ACrzQf0TYTj0qdqMYgjcLbEYQ4ZI3efqM44qIekN6wUL/aPBVU652GOP SnPG/batHtChbqoqM6eRK4+LwuuHTwAFDH5LJhZg93mWNI173ABnJnCmhx4pVitJZNMZam3iXpC KlLSY0ugM10XFwIIMF+LHvKDx9knFbqZTjeRfjv94kx8CaWKR8zQ+y7+c2xAaDQ7ZcL07S5Rc X-Received: from connoro.c.googlers.com ([fda3:e722:ac3:cc00:7f:e700:c0a8:a99]) (user=connoro job=sendgmr) by 2002:a17:90b:1e46:b0:20a:c49f:9929 with SMTP id pi6-20020a17090b1e4600b0020ac49f9929mr2651409pjb.221.1664833510573; Mon, 03 Oct 2022 14:45:10 -0700 (PDT) Date: Mon, 3 Oct 2022 21:44:54 +0000 In-Reply-To: <20221003214501.2050087-1-connoro@google.com> Mime-Version: 1.0 References: <20221003214501.2050087-1-connoro@google.com> X-Mailer: git-send-email 2.38.0.rc1.362.ged0d419d3c-goog Message-ID: <20221003214501.2050087-5-connoro@google.com> Subject: [RFC PATCH 04/11] locking/mutex: make mutex::wait_lock irq safe From: "Connor O'Brien" To: linux-kernel@vger.kernel.org Cc: kernel-team@android.com, John Stultz , Joel Fernandes , Qais Yousef , Ingo Molnar , Peter Zijlstra , Juri Lelli , Vincent Guittot , Dietmar Eggemann , Steven Rostedt , Ben Segall , Mel Gorman , Daniel Bristot de Oliveira , Valentin Schneider , Will Deacon , Waiman Long , Boqun Feng , "Paul E . McKenney" , "Connor O'Brien" Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIMWL_WL_MED, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Juri Lelli mutex::wait_lock might be nested under rq->lock. Make it irq safe then. Signed-off-by: Juri Lelli Signed-off-by: Peter Zijlstra (Intel) Link: https://lkml.kernel.org/r/20181009092434.26221-7-juri.lelli@redhat.com [rebase & fix {un,}lock_wait_lock helpers in ww_mutex.h] Signed-off-by: Connor O'Brien --- kernel/locking/mutex.c | 18 ++++++++++-------- kernel/locking/ww_mutex.h | 22 ++++++++++++---------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 7800380219db..f39e9ee3c4d0 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -572,6 +572,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas { struct mutex_waiter waiter; struct ww_mutex *ww; + unsigned long flags; int ret; if (!use_ww_ctx) @@ -614,7 +615,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas return 0; } - raw_spin_lock(&lock->wait_lock); + raw_spin_lock_irqsave(&lock->wait_lock, flags); /* * After waiting to acquire the wait_lock, try again. */ @@ -676,7 +677,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas goto err; } - raw_spin_unlock(&lock->wait_lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); if (ww_ctx) ww_ctx_wake(ww_ctx); schedule_preempt_disabled(); @@ -703,9 +704,9 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas trace_contention_begin(lock, LCB_F_MUTEX); } - raw_spin_lock(&lock->wait_lock); + raw_spin_lock_irqsave(&lock->wait_lock, flags); } - raw_spin_lock(&lock->wait_lock); + raw_spin_lock_irqsave(&lock->wait_lock, flags); acquired: __set_current_state(TASK_RUNNING); @@ -732,7 +733,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas if (ww_ctx) ww_mutex_lock_acquired(ww, ww_ctx); - raw_spin_unlock(&lock->wait_lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); if (ww_ctx) ww_ctx_wake(ww_ctx); preempt_enable(); @@ -743,7 +744,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas __mutex_remove_waiter(lock, &waiter); err_early_kill: trace_contention_end(lock, ret); - raw_spin_unlock(&lock->wait_lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); debug_mutex_free_waiter(&waiter); mutex_release(&lock->dep_map, ip); if (ww_ctx) @@ -915,6 +916,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne struct task_struct *next = NULL; DEFINE_WAKE_Q(wake_q); unsigned long owner; + unsigned long flags; mutex_release(&lock->dep_map, ip); @@ -941,7 +943,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne } } - raw_spin_lock(&lock->wait_lock); + raw_spin_lock_irqsave(&lock->wait_lock, flags); debug_mutex_unlock(lock); if (!list_empty(&lock->wait_list)) { /* get the first entry from the wait-list: */ @@ -959,7 +961,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne __mutex_handoff(lock, next); preempt_disable(); - raw_spin_unlock(&lock->wait_lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); wake_up_q(&wake_q); preempt_enable(); diff --git a/kernel/locking/ww_mutex.h b/kernel/locking/ww_mutex.h index dfc174cd96c6..7edd55d10f87 100644 --- a/kernel/locking/ww_mutex.h +++ b/kernel/locking/ww_mutex.h @@ -70,14 +70,14 @@ __ww_mutex_has_waiters(struct mutex *lock) return atomic_long_read(&lock->owner) & MUTEX_FLAG_WAITERS; } -static inline void lock_wait_lock(struct mutex *lock) +static inline void lock_wait_lock(struct mutex *lock, unsigned long *flags) { - raw_spin_lock(&lock->wait_lock); + raw_spin_lock_irqsave(&lock->wait_lock, *flags); } -static inline void unlock_wait_lock(struct mutex *lock) +static inline void unlock_wait_lock(struct mutex *lock, unsigned long flags) { - raw_spin_unlock(&lock->wait_lock); + raw_spin_unlock_irqrestore(&lock->wait_lock, flags); } static inline void lockdep_assert_wait_lock_held(struct mutex *lock) @@ -144,14 +144,14 @@ __ww_mutex_has_waiters(struct rt_mutex *lock) return rt_mutex_has_waiters(&lock->rtmutex); } -static inline void lock_wait_lock(struct rt_mutex *lock) +static inline void lock_wait_lock(struct rt_mutex *lock, unsigned long *flags) { - raw_spin_lock(&lock->rtmutex.wait_lock); + raw_spin_lock_irqsave(&lock->rtmutex.wait_lock, *flags); } -static inline void unlock_wait_lock(struct rt_mutex *lock) +static inline void unlock_wait_lock(struct rt_mutex *lock, flags) { - raw_spin_unlock(&lock->rtmutex.wait_lock); + raw_spin_unlock_irqrestore(&lock->rtmutex.wait_lock, flags); } static inline void lockdep_assert_wait_lock_held(struct rt_mutex *lock) @@ -382,6 +382,8 @@ __ww_mutex_check_waiters(struct MUTEX *lock, struct ww_acquire_ctx *ww_ctx) static __always_inline void ww_mutex_set_context_fastpath(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) { + unsigned long flags; + ww_mutex_lock_acquired(lock, ctx); /* @@ -409,9 +411,9 @@ ww_mutex_set_context_fastpath(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) * Uh oh, we raced in fastpath, check if any of the waiters need to * die or wound us. */ - lock_wait_lock(&lock->base); + lock_wait_lock(&lock->base, &flags); __ww_mutex_check_waiters(&lock->base, ctx); - unlock_wait_lock(&lock->base); + unlock_wait_lock(&lock->base, flags); } static __always_inline int -- 2.38.0.rc1.362.ged0d419d3c-goog