From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9FFD5C0219D for ; Thu, 13 Feb 2025 15:23:18 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 41427280004; Thu, 13 Feb 2025 10:23:18 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 3C4D5280001; Thu, 13 Feb 2025 10:23:18 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 26580280004; Thu, 13 Feb 2025 10:23:18 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 04DCB280001 for ; Thu, 13 Feb 2025 10:23:17 -0500 (EST) Received: from smtpin26.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id AB1BF4B376 for ; Thu, 13 Feb 2025 15:23:17 +0000 (UTC) X-FDA: 83115290034.26.FE121DC Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) by imf08.hostedemail.com (Postfix) with ESMTP id B715616000B for ; Thu, 13 Feb 2025 15:23:15 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=bNmaiaO6; spf=pass (imf08.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.128.52 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739460195; a=rsa-sha256; cv=none; b=XVAu5GM9ex5bidqcvO/YTfiD18tlyEWFiudCPOWWGHP0LyxfC8K570odDxyEiztPyxqCz4 AFJM3nzRTbar2FPXvm+yCZTjF4G+XJ5Ch4gUuTdmoM8GZJgNdYrn3BVY5wI1YP+srxJPZc Matp3+p0OzmcSFZlzIihslHNwQ8FUjg= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=bNmaiaO6; spf=pass (imf08.hostedemail.com: domain of alexei.starovoitov@gmail.com designates 209.85.128.52 as permitted sender) smtp.mailfrom=alexei.starovoitov@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739460195; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=eNgGb6l5tYjsIuQBPp0l3fcq090lnq3JNho4P21Atgw=; b=mNJtqEEq3qOnvzXjyBGrEY2CMszk8knR5qUIlmqtYFsJV4a+uklGUxQQgFZwTbi+5hA6n2 8t2vZHDlEHKaDbPFerr8nfyOSLwVDGCDa6zBll7TZFdYIHQF6TdPUKhO+EsdiamxXgpBhz WB8vmJgT2AQtMz5nm8tiXCd47YKmy08= Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4395a917f33so12221425e9.1 for ; Thu, 13 Feb 2025 07:23:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1739460194; x=1740064994; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=eNgGb6l5tYjsIuQBPp0l3fcq090lnq3JNho4P21Atgw=; b=bNmaiaO6iPGinQ7+ReKaBYaGzP0zN2PY1mBIJwYanTE4AJ406Vh+NR7Fq90C0FG3nE /pBWBClAm2wLBJ/7jTSsre+iJGyr/mrB17KGegCGZaACqpxcXVZTAjJdlRke5D2QcqrA DK3sEtuUtTAELRV9JujUKOwuYn3Y85Cq2hrZuqxjZ59msekFxjNUMtx2siJijHqU83yW XeiDYAydcrPhwD16tCfsg15YrKrZAcyrn3f+XbMiBDAkdPwZGmlXtOHUgINLhrKX6E0x nAZCi8Dtn6H88MjCVQ2dvoAC5QWr2+zhXEMMqrZmbtnCYE8wpFnTQKpoouy3cj9vwgq4 Ag5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1739460194; x=1740064994; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=eNgGb6l5tYjsIuQBPp0l3fcq090lnq3JNho4P21Atgw=; b=IYlwT115vq/h2+fvOP2Ob959CMWvTvxxjpC8bzQRy73N3pVHlUKfS3ELMa4Y7LDN0l NTWLLtP8MJcOfZslQjz8qMcYTriYzGlHD759a1hlhas5DGq5k0Ubo7aG99sHgu7WcF7Q +DhY+/RYvRzmqhxw/6fVeB5w9AEG1I/JGsu/Q85xWVFL2T0j1TjxjAKX0GuXHl1P0PKR EuLvZzmVSsGbOAS8/yUepmnBmuLga55JPx9NDB5iwdFc9aQz8OJhKbxdsYWgTVOYt1l1 OYCoOctpTmaXNNEDqMzYT/Nlz7ss4EqXABSC9UesOVftB29yGzNkh/vHE7SU6JI+xnWI tPwg== X-Forwarded-Encrypted: i=1; AJvYcCVaxGRKaL/HQFzuwhfYj7vhXgeYWre84vgaO5GLIzroY4d+ZbE8ct9udAMu1Jxk5OvfL+ZAXEUY5g==@kvack.org X-Gm-Message-State: AOJu0YzlCiccckmzzMxBcb3zbROkCIi1zlbDeWVdTv+I4iI+qdN9F9Pa DHcqtpUpJQeJzzIIrma0WMgQTyMVw+njd684elTKdouMxBxmhqoDjv80KWvHzYkdDKt7uaZ651M Z+AeMZTVNQ/bhmxo1SjPExetJ8jA= X-Gm-Gg: ASbGncsHWviivWdncuYCgRDL3Y+7uS+4VcIZNYYIPXuQzxjXQoHffnxV5duOefiLPwG WEQnBKTeL/b3ORGmVOdoi4MCow97tiz+n514ZHTmJAZ7Hw0vFGwQdP8xLMFCUOEgRqdrrEgbCTm k0elDg4CVRWnYEEI+G95r615ZwssLV X-Google-Smtp-Source: AGHT+IFcUtfVqwEaTPMb8xVdl8fitubOSxsfQpzrIL9HpGgE925Pq++6b3ZPtIiHMKM/uN8S/l+OPSwBotnObY0oBb4= X-Received: by 2002:a05:6000:41e4:b0:38f:232e:dd5e with SMTP id ffacd0b85a97d-38f24d7417emr4521607f8f.22.1739460193717; Thu, 13 Feb 2025 07:23:13 -0800 (PST) MIME-Version: 1.0 References: <20250213033556.9534-1-alexei.starovoitov@gmail.com> <20250213033556.9534-4-alexei.starovoitov@gmail.com> <1fda7391-228d-4e10-8449-189be36eb27c@suse.cz> In-Reply-To: <1fda7391-228d-4e10-8449-189be36eb27c@suse.cz> From: Alexei Starovoitov Date: Thu, 13 Feb 2025 07:23:01 -0800 X-Gm-Features: AWEUYZlVB9dARHXXyb1nl84B3JYlu65sCgJAqmfDsTD6Tg5SvasEOn9sCJyAYKs Message-ID: Subject: Re: [PATCH bpf-next v8 3/6] locking/local_lock: Introduce localtry_lock_t To: Vlastimil Babka Cc: bpf , Andrii Nakryiko , Kumar Kartikeya Dwivedi , Andrew Morton , Peter Zijlstra , Sebastian Sewior , Steven Rostedt , Hou Tao , Johannes Weiner , Shakeel Butt , Michal Hocko , Matthew Wilcox , Thomas Gleixner , Jann Horn , Tejun Heo , linux-mm , Kernel Team Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: B715616000B X-Stat-Signature: z7m7ir7j314cz4jm88ejou6i8zhcozd3 X-Rspam-User: X-Rspamd-Server: rspam10 X-HE-Tag: 1739460195-599720 X-HE-Meta: U2FsdGVkX19Qf9/TiLNyd3Js9wRSGGigPtsbBQirYi54JHliteE6VEPYv9XnvKpO2ZR8lKgyyZR1v2xLx5j4ME+o1qmvrb0iZu8MP3qiA2lajuWf+Lh1JjNIbEoE5hw6udbEs++75WHJEf0m7nxzbscFG1RFjtllLXbjztLfwwaFgBVBXL06PggwNFFJUyOXMO59dGDfz/aBmK0LUeSC8qoyMcCOVElB6zQ+qGMWhPvR2GDN3tSr71nxTuQHUXHsPnE+4fIoAyCmY8cHGiW+GIdUtNC3Et2GsK+6tPwzsSUHPB4TLp9vnFmIl3krCvcdfLM7fE7dF4ldBYzfqXD+EAQt9lA5TqJpNRgHq5drWKzkxgdUiYRQqhRm8Id9GIJgIbTXmMNMcPsJUNZDlx3YBpdBZwoDvn0jk6mI+jaByMDEKKhE5hxVrvjZIieCq5+FNaJbfJaZUwUHQhwqNfJ/bZLK6IGcaObnZtUJtrGrXY4zNF9qr2ZKViAhbfDAx37ALztLtxpre16gIO8j+eujLygAbMWKtOc73cUeTw5zE3/TpkmbOaz1jApewFZmcqnfnJmQpSFd/PDocDh2+YDmeyOaG+Qtv26li1pxtFtnI94nKqpmM7WhQvWTiWhQnOZ165e8Y4ZOWOwP+e9OWudzS3e27ianqf9ZKNMeMoA6Jj8w1aC8u/zApMSruhjj6HKqalil2u62u/n1Zm4chdUKuqW6FovX4Lo2S87ahKg6vAnCyiLljprvpU05htf0qYHTWip4S2duJbLfwyKxPQfixam1psT7cr72Bdltvafh5422k5eN8abdQlIaS0O+Km3j2ImwAJYgG7ucSw+KCJzVpLbsf6Pf0ra7O5gco4Q5lZFQU+OIOLIwHGHXf5Hjnm1QQVsHRIDjaTdE6Ud2fxFrpAxRFFt6htqT+Ho19Ycm+5zHb429KZCGxJMnrshYUNop1g1WIIJ8S4Z2Q63LsM9 b7kXx3MS HHUrClWeh8XAO4XnT7j5l3C3emxBZCejSuiL9tGNrUHPqw8zrampofCAmAMnuyZmZzFHvdyJAZ3ihyCxSIgRoJe1PDfhBpQWA4oPO7O3VSo8F8GBdTJhxTyglJIbXYqVdmYKLVT5Tg7YAwCvG0JMuxoGbV2BMyOMr4qqQk3tPzCJRyJbVdwpyaDQ/TxUJmE7pUx2sycHhlNQedQ0tx4BVi5CDEyOm3c7JwFZ19z6Rqu2RALGCEPK7CnInXIgJRT1I9bDr/k4C/6AdUTHHCuf16LQLU3JpSCl7PHpO2bpzOjmyvo0KxCtMLXJfq5Zpa4C3TQ0AZ/YkB3zRIriyER5XjfdMsZXkP3tq3JgwHK+ZpVEatVnS4oA8q5XnKAU3aoJUrdqQ1wxBQV1pe4ieSv7yyfDLmxZ8YWpgheDxDjE/JWSObIEfJbqTsscYMAT9UUuURxy+Dh8QbSyeLoA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: On Thu, Feb 13, 2025 at 7:04=E2=80=AFAM Vlastimil Babka wr= ote: > > On 2/13/25 04:35, Alexei Starovoitov wrote: > > From: Sebastian Andrzej Siewior > > > > In !PREEMPT_RT local_lock_irqsave() disables interrupts to protect > > critical section, but it doesn't prevent NMI, so the fully reentrant > > code cannot use local_lock_irqsave() for exclusive access. > > > > Introduce localtry_lock_t and localtry_lock_irqsave() that > > disables interrupts and sets acquired=3D1, so localtry_lock_irqsave() > > from NMI attempting to acquire the same lock will return false. > > > > In PREEMPT_RT local_lock_irqsave() maps to preemptible spin_lock(). > > Map localtry_lock_irqsave() to preemptible spin_trylock(). > > When in hard IRQ or NMI return false right away, since > > spin_trylock() is not safe due to PI issues. > > > > Note there is no need to use local_inc for acquired variable, > > since it's a percpu variable with strict nesting scopes. > > > > Signed-off-by: Sebastian Andrzej Siewior > > Signed-off-by: Alexei Starovoitov > > --- > > include/linux/local_lock.h | 59 +++++++++++++ > > include/linux/local_lock_internal.h | 123 ++++++++++++++++++++++++++++ > > 2 files changed, 182 insertions(+) > > > > diff --git a/include/linux/local_lock.h b/include/linux/local_lock.h > > index 091dc0b6bdfb..05c254a5d7d3 100644 > > --- a/include/linux/local_lock.h > > +++ b/include/linux/local_lock.h > > @@ -51,6 +51,65 @@ > > #define local_unlock_irqrestore(lock, flags) \ > > __local_unlock_irqrestore(lock, flags) > > > > +/** > > + * localtry_lock_init - Runtime initialize a lock instance > > + */ > > +#define localtry_lock_init(lock) __localtry_lock_init(lock= ) > > + > > +/** > > + * localtry_lock - Acquire a per CPU local lock > > + * @lock: The lock variable > > + */ > > +#define localtry_lock(lock) __localtry_lock(lock) > > + > > +/** > > + * localtry_lock_irq - Acquire a per CPU local lock and disable interr= upts > > + * @lock: The lock variable > > + */ > > +#define localtry_lock_irq(lock) __localtry_lock_irq(lock) > > + > > +/** > > + * localtry_lock_irqsave - Acquire a per CPU local lock, save and disa= ble > > + * interrupts > > + * @lock: The lock variable > > + * @flags: Storage for interrupt flags > > + */ > > +#define localtry_lock_irqsave(lock, flags) \ > > + __localtry_lock_irqsave(lock, flags) > > + > > +/** > > + * localtry_trylock_irqsave - Try to acquire a per CPU local lock, sav= e and disable > > + * interrupts if acquired > > + * @lock: The lock variable > > + * @flags: Storage for interrupt flags > > + * > > + * The function can be used in any context such as NMI or HARDIRQ. Due= to > > + * locking constrains it will _always_ fail to acquire the lock on PRE= EMPT_RT. > > The "always fail" applies only to the NMI and HARDIRQ contexts, right? It= 's > not entirely obvious so it sounds worse than it is. > > > + > > +#define __localtry_trylock_irqsave(lock, flags) \ > > + ({ \ > > + int __locked; \ > > + \ > > + typecheck(unsigned long, flags); \ > > + flags =3D 0; \ > > + if (in_nmi() | in_hardirq()) { \ > > + __locked =3D 0; \ > > Because of this, IIUC? Right. It's part of commit log: + In PREEMPT_RT local_lock_irqsave() maps to preemptible spin_lock(). + Map localtry_lock_irqsave() to preemptible spin_trylock(). + When in hard IRQ or NMI return false right away, since + spin_trylock() is not safe due to PI issues. Steven explained it in detail in some earlier thread. realtime is hard. bpf and realtime together are even harder. Things got much better over the years, but plenty of work ahead. I can go in detail, but offtopic for this thread.