Received: by 2002:a05:7412:d008:b0:f9:6acb:47ec with SMTP id bd8csp260255rdb; Tue, 19 Dec 2023 16:19:54 -0800 (PST) X-Google-Smtp-Source: AGHT+IHMS0aHNOJ4L3vGNwedQktYuhlSVl6vgELSe7ncsWUwkeX/UrcnCOBhL+y8D43AETk1GADb X-Received: by 2002:a05:622a:190c:b0:427:7a3e:57b7 with SMTP id w12-20020a05622a190c00b004277a3e57b7mr2022617qtc.98.1703031593913; Tue, 19 Dec 2023 16:19:53 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1703031593; cv=none; d=google.com; s=arc-20160816; b=pVyBn49nZ1YOYp69VJnSOT3ilNl3tC/RwmH1V4vO6Mwg5LXoQmAYhvCZFpmMo3qcvY 2oK15Ig6sCK9kzhbtps9Jb72ZB0Fs/pznleQI1cVoiYE3kk8tS/eUMRav/pUjnfIrJ3t uGreFCFwwn7cQmwGrjwtrapS1HFW5FOMtyC0LXcc8nFbOVwWlhZo+ZRPMGSvQIqSfQTo 95Htz+IWiPsJ0Y2xNWqyORP5nCKzPQJI28h6+BT0qq3DWX2VSx2QGGjvSBWUYV5GVxRm K7nRscoOpF04TEOivwY9g7K4cHJ4ae9GNPBwWTJBZGSBM3nAmZ9N9bp+yTJ0WnKYgG21 d6Ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:from:subject:message-id:references:mime-version :list-unsubscribe:list-subscribe:list-id:precedence:in-reply-to:date :dkim-signature; bh=WfAUy2Ttqwgv58afFxIJs0xH1Dq1+/SdF+f9rGh0vBU=; fh=y8KJUBnrwQA+5PtWX4i2qO6O4Uc2yYtIrVYD0yjhUrk=; b=jkae9z3BjlPu8+6IZxLwaubZhGd4ZV/l7FGbp3OAugkXmFg5dQk92/uoQltF9pnlzI 1tyiNE0JuMn3evJPTkrT1dQ87HmxVsLfBj+uVUg0ggmVzSge4kiOlVMshmZoueFlEKsx 9+2LFRLxsG/UopWIiEnirZyuBk0PjR9ChFqkKIwFcv9Z3P/KVh0yYNy7Ss/djTZwziRM 6vkXvBe9cErQLORyHeyxbxpIqJiq3X1eiWnwkWxbOnFFhh8gjiPVOxTL88/d6xA7ePYt fFW4CE7TjZYR8ImIf7foYpkfi1QF4RoNE2thI3WBZ68QpI50Rz8ED7j4LUcCdqf7wSCQ 977w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=nZAjgbDS; spf=pass (google.com: domain of linux-kernel+bounces-6137-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-6137-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id fz13-20020a05622a5a8d00b00423f4b4ac15si29147520qtb.6.2023.12.19.16.19.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Dec 2023 16:19:53 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-6137-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@google.com header.s=20230601 header.b=nZAjgbDS; spf=pass (google.com: domain of linux-kernel+bounces-6137-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-6137-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 999351C214EA for ; Wed, 20 Dec 2023 00:19:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 066ED8BE7; Wed, 20 Dec 2023 00:19:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nZAjgbDS" X-Original-To: linux-kernel@vger.kernel.org Received: from mail-pj1-f73.google.com (mail-pj1-f73.google.com [209.85.216.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82C3F5C9D for ; Wed, 20 Dec 2023 00:19:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--jstultz.bounces.google.com Received: by mail-pj1-f73.google.com with SMTP id 98e67ed59e1d1-28bd4766346so14226a91.3 for ; Tue, 19 Dec 2023 16:19:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1703031549; x=1703636349; darn=vger.kernel.org; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:from:to:cc:subject:date:message-id:reply-to; bh=WfAUy2Ttqwgv58afFxIJs0xH1Dq1+/SdF+f9rGh0vBU=; b=nZAjgbDSfn4vKBBa7P5/FjkImF1p5J1j1wJwz+sGezB2sX9M90A8nyYzXrrYz8qcRZ M2Rr76kifrmwk8OZ/I3eMMw6U8y9JZpNQDiE3C8u3SPaHkI04bVI4ZMpCIEZSSY7VnqU MbQqqgP176EmGJK2gYjWTHB4LwpdiMBPmvK/RnEwg/sMlj7EreAMrd74Z+8WFJu3R+iH DuuwKbolSua4KKx/Z5VEDWmBKYyfhQjMhnNlauT07UZcaBWGkXYcH644rqAdcz4HGMsr nI3RevNPA7SYRxzWxpMdqqRTxj7GosDZ859jelD5ikq/kEPbaoaOWFxHhmZ4h0Xte8u1 1aoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703031549; x=1703636349; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=WfAUy2Ttqwgv58afFxIJs0xH1Dq1+/SdF+f9rGh0vBU=; b=V1d/spNPDKK3FT3Gv7pWhaG7e5RQOBdjseGBf1BUmWc1C1i3vumZvZC+ZotEEFywML DV8kccKHWHDqNHHSQ5N+pJ1GRTirzO26M7SJl9R4x3+46unxDWNwnbXMgpiUttgnh/UD MTziKC1b73HzDytKT383aWcXG88kGu0RHxdsKDYv4QC1rcuxhErUfkqnjJCnAt6FPnbF UuOX5qvOHElpgh5xkj947qjj8Eva6bWByfd2CFCWPFXIzmF474ebYFVwVgkZ77ZZeaOv zkne054/M43Go+edjU5vyWrcskgBhABSiD/VG8SYYikBXcrlnqrPY4J735ALWip08g9L f6Ow== X-Gm-Message-State: AOJu0YzJR8bC3qm0tN6I9hRKTuF8JT+Ag98yw9AQS5m9JhF8QSLRq/qV GOigCFylh4LJIttZKNlC/BTDqzKnawpgLj3njfM8NpGlK5zDHFya3rKqEuPRgvw+wTq5eOZCNPV 9Vr8eu1C4VCwK5BO1MdtPeS5IToYSHzt4SLnbAEYticu3JUkbugBF/fRyn4hF0/2J26ql5qM= X-Received: from jstultz-noogler2.c.googlers.com ([fda3:e722:ac3:cc00:24:72f4:c0a8:600]) (user=jstultz job=sendgmr) by 2002:a17:90b:1bcd:b0:28b:4d3c:6688 with SMTP id oa13-20020a17090b1bcd00b0028b4d3c6688mr274608pjb.8.1703031547610; Tue, 19 Dec 2023 16:19:07 -0800 (PST) Date: Tue, 19 Dec 2023 16:18:14 -0800 In-Reply-To: <20231220001856.3710363-1-jstultz@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20231220001856.3710363-1-jstultz@google.com> X-Mailer: git-send-email 2.43.0.472.g3155946c3a-goog Message-ID: <20231220001856.3710363-4-jstultz@google.com> Subject: [PATCH v7 03/23] locking/mutex: Make mutex::wait_lock irq safe From: John Stultz To: LKML Cc: Juri Lelli , Joel Fernandes , Qais Yousef , Ingo Molnar , Peter Zijlstra , Vincent Guittot , Dietmar Eggemann , Valentin Schneider , Steven Rostedt , Ben Segall , Zimuzo Ezeozue , Youssef Esmat , Mel Gorman , Daniel Bristot de Oliveira , Will Deacon , Waiman Long , Boqun Feng , "Paul E. McKenney" , Metin Kaya , Xuewen Yan , K Prateek Nayak , Thomas Gleixner , kernel-team@android.com, "Connor O'Brien" , John Stultz Content-Type: text/plain; charset="UTF-8" From: Juri Lelli mutex::wait_lock might be nested under rq->lock. Make it irq safe then. Cc: Joel Fernandes Cc: Qais Yousef Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Juri Lelli Cc: Vincent Guittot Cc: Dietmar Eggemann Cc: Valentin Schneider Cc: Steven Rostedt Cc: Ben Segall Cc: Zimuzo Ezeozue Cc: Youssef Esmat Cc: Mel Gorman Cc: Daniel Bristot de Oliveira Cc: Will Deacon Cc: Waiman Long Cc: Boqun Feng Cc: "Paul E. McKenney" Cc: Metin Kaya Cc: Xuewen Yan Cc: K Prateek Nayak Cc: Thomas Gleixner Cc: kernel-team@android.com Signed-off-by: Juri Lelli Signed-off-by: Peter Zijlstra (Intel) [rebase & fix {un,}lock_wait_lock helpers in ww_mutex.h] Signed-off-by: Connor O'Brien Signed-off-by: John Stultz --- v3: * Re-added this patch after it was dropped in v2 which caused lockdep warnings to trip. v7: * Fix function definition for PREEMPT_RT case, as pointed out by Metin Kaya. * Fix incorrect flags handling in PREEMPT_RT case as found by Metin Kaya --- kernel/locking/mutex.c | 18 ++++++++++-------- kernel/locking/ww_mutex.h | 22 +++++++++++----------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c index 8337ed0dbf81..73d98dd23eec 100644 --- a/kernel/locking/mutex.c +++ b/kernel/locking/mutex.c @@ -573,6 +573,7 @@ __mutex_lock_common(struct mutex *lock, unsigned int state, unsigned int subclas DEFINE_WAKE_Q(wake_q); struct mutex_waiter waiter; struct ww_mutex *ww; + unsigned long flags; int ret; if (!use_ww_ctx) @@ -615,7 +616,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); /* Make sure we do wakeups before calling schedule */ if (!wake_q_empty(&wake_q)) { wake_up_q(&wake_q); @@ -702,9 +703,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); @@ -730,7 +731,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); wake_up_q(&wake_q); preempt_enable(); return 0; @@ -740,7 +741,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); wake_up_q(&wake_q); @@ -911,6 +912,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); @@ -938,7 +940,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne } preempt_disable(); - 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: */ @@ -955,7 +957,7 @@ static noinline void __sched __mutex_unlock_slowpath(struct mutex *lock, unsigne if (owner & MUTEX_FLAG_HANDOFF) __mutex_handoff(lock, next); - 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 7189c6631d90..9facc0ddfdd3 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, unsigned long *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) @@ -380,6 +380,7 @@ static __always_inline void ww_mutex_set_context_fastpath(struct ww_mutex *lock, struct ww_acquire_ctx *ctx) { DEFINE_WAKE_Q(wake_q); + unsigned long flags; ww_mutex_lock_acquired(lock, ctx); @@ -408,10 +409,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, &wake_q); - unlock_wait_lock(&lock->base); - + unlock_wait_lock(&lock->base, &flags); wake_up_q(&wake_q); } -- 2.43.0.472.g3155946c3a-goog