All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: linux-kernel@vger.kernel.org,
	Thomas Gleixner <tglx@linutronix.de>,
	"Paul E . McKenney" <paulmck@kernel.org>,
	Boqun Feng <boqun.feng@gmail.com>,
	"H . Peter Anvin" <hpa@zytor.com>, Paul Turner <pjt@google.com>,
	linux-api@vger.kernel.org, Christian Brauner <brauner@kernel.org>,
	Florian Weimer <fw@deneb.enyo.de>,
	David.Laight@ACULAB.COM, carlos@redhat.com,
	Peter Oskolkov <posk@posk.io>,
	Alexander Mikhalitsyn <alexander@mihalicyn.com>,
	Chris Kennelly <ckennelly@google.com>,
	Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Subject: [PATCH v5 03/24] rseq: Extend struct rseq with numa node id
Date: Thu,  3 Nov 2022 16:03:38 -0400	[thread overview]
Message-ID: <20221103200359.328736-4-mathieu.desnoyers@efficios.com> (raw)
In-Reply-To: <20221103200359.328736-1-mathieu.desnoyers@efficios.com>

Adding the NUMA node id to struct rseq is a straightforward thing to do,
and a good way to figure out if anything in the user-space ecosystem
prevents extending struct rseq.

This NUMA node id field allows memory allocators such as tcmalloc to
take advantage of fast access to the current NUMA node id to perform
NUMA-aware memory allocation.

It can also be useful for implementing fast-paths for NUMA-aware
user-space mutexes.

It also allows implementing getcpu(2) purely in user-space.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
---
Changes since v4:
- Use __entry->cpu_id as argument for cpu_to_node() in the rseq_update
  tracepoint.
---
 include/trace/events/rseq.h |  4 +++-
 include/uapi/linux/rseq.h   |  8 ++++++++
 kernel/rseq.c               | 19 +++++++++++++------
 3 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/include/trace/events/rseq.h b/include/trace/events/rseq.h
index a04a64bc1a00..dde7a359b4ef 100644
--- a/include/trace/events/rseq.h
+++ b/include/trace/events/rseq.h
@@ -16,13 +16,15 @@ TRACE_EVENT(rseq_update,
 
 	TP_STRUCT__entry(
 		__field(s32, cpu_id)
+		__field(s32, node_id)
 	),
 
 	TP_fast_assign(
 		__entry->cpu_id = raw_smp_processor_id();
+		__entry->node_id = cpu_to_node(__entry->cpu_id);
 	),
 
-	TP_printk("cpu_id=%d", __entry->cpu_id)
+	TP_printk("cpu_id=%d node_id=%d", __entry->cpu_id, __entry->node_id)
 );
 
 TRACE_EVENT(rseq_ip_fixup,
diff --git a/include/uapi/linux/rseq.h b/include/uapi/linux/rseq.h
index 05d3c4cdeb40..1cb90a435c5c 100644
--- a/include/uapi/linux/rseq.h
+++ b/include/uapi/linux/rseq.h
@@ -131,6 +131,14 @@ struct rseq {
 	 */
 	__u32 flags;
 
+	/*
+	 * Restartable sequences node_id field. Updated by the kernel. Read by
+	 * user-space with single-copy atomicity semantics. This field should
+	 * only be read by the thread which registered this data structure.
+	 * Aligned on 32-bit. Contains the current NUMA node ID.
+	 */
+	__u32 node_id;
+
 	/*
 	 * Flexible array member at end of structure, after last feature field.
 	 */
diff --git a/kernel/rseq.c b/kernel/rseq.c
index c1058b3f10ac..e21ad8929958 100644
--- a/kernel/rseq.c
+++ b/kernel/rseq.c
@@ -85,15 +85,17 @@
  *   F1. <failure>
  */
 
-static int rseq_update_cpu_id(struct task_struct *t)
+static int rseq_update_cpu_node_id(struct task_struct *t)
 {
-	u32 cpu_id = raw_smp_processor_id();
 	struct rseq __user *rseq = t->rseq;
+	u32 cpu_id = raw_smp_processor_id();
+	u32 node_id = cpu_to_node(cpu_id);
 
 	if (!user_write_access_begin(rseq, t->rseq_len))
 		goto efault;
 	unsafe_put_user(cpu_id, &rseq->cpu_id_start, efault_end);
 	unsafe_put_user(cpu_id, &rseq->cpu_id, efault_end);
+	unsafe_put_user(node_id, &rseq->node_id, efault_end);
 	/*
 	 * Additional feature fields added after ORIG_RSEQ_SIZE
 	 * need to be conditionally updated only if
@@ -109,9 +111,9 @@ static int rseq_update_cpu_id(struct task_struct *t)
 	return -EFAULT;
 }
 
-static int rseq_reset_rseq_cpu_id(struct task_struct *t)
+static int rseq_reset_rseq_cpu_node_id(struct task_struct *t)
 {
-	u32 cpu_id_start = 0, cpu_id = RSEQ_CPU_ID_UNINITIALIZED;
+	u32 cpu_id_start = 0, cpu_id = RSEQ_CPU_ID_UNINITIALIZED, node_id = 0;
 
 	/*
 	 * Reset cpu_id_start to its initial state (0).
@@ -125,6 +127,11 @@ static int rseq_reset_rseq_cpu_id(struct task_struct *t)
 	 */
 	if (put_user(cpu_id, &t->rseq->cpu_id))
 		return -EFAULT;
+	/*
+	 * Reset node_id to its initial state (0).
+	 */
+	if (put_user(node_id, &t->rseq->node_id))
+		return -EFAULT;
 	/*
 	 * Additional feature fields added after ORIG_RSEQ_SIZE
 	 * need to be conditionally reset only if
@@ -299,7 +306,7 @@ void __rseq_handle_notify_resume(struct ksignal *ksig, struct pt_regs *regs)
 		if (unlikely(ret < 0))
 			goto error;
 	}
-	if (unlikely(rseq_update_cpu_id(t)))
+	if (unlikely(rseq_update_cpu_node_id(t)))
 		goto error;
 	return;
 
@@ -346,7 +353,7 @@ SYSCALL_DEFINE4(rseq, struct rseq __user *, rseq, u32, rseq_len,
 			return -EINVAL;
 		if (current->rseq_sig != sig)
 			return -EPERM;
-		ret = rseq_reset_rseq_cpu_id(current);
+		ret = rseq_reset_rseq_cpu_node_id(current);
 		if (ret)
 			return ret;
 		current->rseq = NULL;
-- 
2.25.1


  parent reply	other threads:[~2022-11-03 20:05 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-11-03 20:03 [PATCH v5 00/24] RSEQ node id and virtual cpu id extensions Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 01/24] rseq: Introduce feature size and alignment ELF auxiliary vector entries Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 02/24] rseq: Introduce extensible rseq ABI Mathieu Desnoyers
2022-11-03 20:03 ` Mathieu Desnoyers [this message]
2022-11-03 20:03 ` [PATCH v5 04/24] selftests/rseq: Use ELF auxiliary vector for extensible rseq Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 05/24] selftests/rseq: Implement rseq numa node id field selftest Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 06/24] lib: Implement find_{first,next,nth}_notandnot_bit, find_first_andnot_bit Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 07/24] cpumask: Implement cpumask_{first,next}_{not,}andnot Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 08/24] sched: Introduce per memory space current virtual cpu id Mathieu Desnoyers
2022-11-08 13:00   ` Peter Zijlstra
2022-11-08 19:45     ` Mathieu Desnoyers
2022-11-08 13:04   ` Peter Zijlstra
2022-11-08 20:07     ` Mathieu Desnoyers
2022-11-09 10:19       ` Peter Zijlstra
2022-11-09  9:28   ` Peter Zijlstra
2022-11-09 15:04     ` Mathieu Desnoyers
2022-11-09  9:42   ` Peter Zijlstra
2022-11-09 15:09     ` Mathieu Desnoyers
2022-11-11  4:41   ` Andy Lutomirski
2022-11-11 14:18     ` Mathieu Desnoyers
2022-11-14 20:49       ` Sean Christopherson
2022-11-17 17:19         ` Mathieu Desnoyers
2022-11-17 19:10           ` Sean Christopherson
2022-11-17 19:42             ` Mathieu Desnoyers
2022-11-17 21:15               ` Sean Christopherson
2022-11-21 19:00                 ` Mathieu Desnoyers
2022-11-21 19:52                   ` Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 09/24] rseq: Extend struct rseq with per memory space vcpu id Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 10/24] selftests/rseq: Remove RSEQ_SKIP_FASTPATH code Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 11/24] selftests/rseq: Implement rseq vm_vcpu_id field support Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 12/24] selftests/rseq: x86: Template memory ordering and percpu access mode Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 13/24] selftests/rseq: arm: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 14/24] selftests/rseq: arm64: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 15/24] selftests/rseq: mips: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 16/24] selftests/rseq: ppc: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 17/24] selftests/rseq: s390: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 18/24] selftests/rseq: riscv: " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 19/24] selftests/rseq: Implement basic percpu ops vm_vcpu_id test Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 20/24] selftests/rseq: Implement parametrized " Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 21/24] selftests/rseq: x86: Implement rseq_load_u32_u32 Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 22/24] selftests/rseq: Implement numa node id vs vm_vcpu_id invariant test Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 23/24] selftests/rseq: parametrized test: Report/abort on negative cpu id Mathieu Desnoyers
2022-11-03 20:03 ` [PATCH v5 24/24] tracing/rseq: Add mm_vcpu_id field to rseq_update Mathieu Desnoyers

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20221103200359.328736-4-mathieu.desnoyers@efficios.com \
    --to=mathieu.desnoyers@efficios.com \
    --cc=David.Laight@ACULAB.COM \
    --cc=alexander@mihalicyn.com \
    --cc=boqun.feng@gmail.com \
    --cc=brauner@kernel.org \
    --cc=carlos@redhat.com \
    --cc=ckennelly@google.com \
    --cc=fw@deneb.enyo.de \
    --cc=hpa@zytor.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=paulmck@kernel.org \
    --cc=peterz@infradead.org \
    --cc=pjt@google.com \
    --cc=posk@posk.io \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.