mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Anna-Maria Behnsen <anna-maria@linutronix.de>,
	Frederic Weisbecker <frederic@kernel.org>,
	John Stultz <jstultz@google.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>, Stephen Boyd <sboyd@kernel.org>,
	Eric Biederman <ebiederm@xmission.com>,
	Oleg Nesterov <oleg@redhat.com>
Subject: [patch v4 15/27] signal: Add sys_private_ptr to siginfo::_sifields:: _timer
Date: Fri, 27 Sep 2024 10:48:57 +0200 (CEST)	[thread overview]
Message-ID: <20240927084817.817985972@linutronix.de> (raw)
In-Reply-To: <20240927083900.989915582@linutronix.de>

From: Thomas Gleixner <tglx@linutronix.de>

On signal delivery collect_signal() copies the queued siginfo into a caller
provided siginfo struct. The posix timer signal delivery code then uses
siginfo::si_tid to lookup the timer in the hash table.

That's required today as the timer and the sigqueue are separate entities
and have different life time rules.

The sigqueue will be embedded into struct k_itimer to address a few issues
in the posix timer signal handling, which means the life time rules are
not longer separate, which can spare the lookup.

Due to locking rules posixtimer_deliver_signal() cannot be invoked from
collect_signal(). The timer pointer could be handed down from
collect_signal() to dequeue_signal(), but that's just overhead for the
non-posixtimer case.

There is room in the _sifields union for an extra pointer which will be
used later for storing the timer pointer. This field is copied with siginfo
and cleared before the info is delivered to userspace like the existing
si_sys_private field.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>

---
 arch/x86/kernel/signal_32.c        | 2 +-
 arch/x86/kernel/signal_64.c        | 2 +-
 include/uapi/asm-generic/siginfo.h | 2 ++
 kernel/signal.c                    | 6 ++++--
 kernel/time/posix-timers.c         | 4 +++-
 5 files changed, 11 insertions(+), 5 deletions(-)
---
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c
index ef654530bf5a..34ce839ed4ff 100644
--- a/arch/x86/kernel/signal_32.c
+++ b/arch/x86/kernel/signal_32.c
@@ -456,7 +456,7 @@ CHECK_SI_OFFSET(_timer);
 /* compat_siginfo_t doesn't have si_sys_private */
 CHECK_SI_SIZE  (_timer, 3*sizeof(int));
 #else
-CHECK_SI_SIZE  (_timer, 4*sizeof(int));
+CHECK_SI_SIZE  (_timer, 5*sizeof(int));
 #endif
 static_assert(offsetof(siginfo32_t, si_tid)     == 0x0C);
 static_assert(offsetof(siginfo32_t, si_overrun) == 0x10);
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c
index 8a94053c5444..dd96b7f3f60c 100644
--- a/arch/x86/kernel/signal_64.c
+++ b/arch/x86/kernel/signal_64.c
@@ -462,7 +462,7 @@ static_assert(offsetof(siginfo_t, si_pid) == 0x10);
 static_assert(offsetof(siginfo_t, si_uid) == 0x14);
 
 CHECK_SI_OFFSET(_timer);
-CHECK_SI_SIZE  (_timer, 6*sizeof(int));
+CHECK_SI_SIZE  (_timer, 8*sizeof(int));
 static_assert(offsetof(siginfo_t, si_tid)     == 0x10);
 static_assert(offsetof(siginfo_t, si_overrun) == 0x14);
 static_assert(offsetof(siginfo_t, si_value)   == 0x18);
diff --git a/include/uapi/asm-generic/siginfo.h b/include/uapi/asm-generic/siginfo.h
index b7bc545ec3b2..702d7d3ca117 100644
--- a/include/uapi/asm-generic/siginfo.h
+++ b/include/uapi/asm-generic/siginfo.h
@@ -47,6 +47,7 @@ union __sifields {
 		int _overrun;		/* overrun count */
 		sigval_t _sigval;	/* same as below */
 		int _sys_private;       /* not to be passed to user */
+		void *_sys_privptr;	/* not to be passed to user */
 	} _timer;
 
 	/* POSIX.1b signals */
@@ -146,6 +147,7 @@ typedef struct siginfo {
 #define si_tid		_sifields._timer._tid
 #define si_overrun	_sifields._timer._overrun
 #define si_sys_private  _sifields._timer._sys_private
+#define si_sys_privptr  _sifields._timer._sys_privptr
 #define si_status	_sifields._sigchld._status
 #define si_utime	_sifields._sigchld._utime
 #define si_stime	_sifields._sigchld._stime
diff --git a/kernel/signal.c b/kernel/signal.c
index a857f6628e77..0aa01eec5e2d 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -3410,12 +3410,14 @@ static int post_copy_siginfo_from_user(kernel_siginfo_t *info,
 				       const siginfo_t __user *from)
 {
 	/*
-	 * Clear the si_sys_private field for timer signals as that's the
+	 * Clear the si_sys_priv* fields for timer signals as that's the
 	 * indicator for rearming a posix timer. User space submitted
 	 * signals are not allowed to inject that.
 	 */
-	if (info->si_code == SI_TIMER)
+	if (info->si_code == SI_TIMER) {
 		info->si_sys_private = 0;
+		info->si_sys_privptr = NULL;
+	}
 
 	if (unlikely(!known_siginfo_layout(info->si_signo, info->si_code))) {
 		char __user *expansion = si_expansion(from);
diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c
index 1c2f6090b767..9d7e02db4157 100644
--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -289,8 +289,9 @@ bool posixtimer_deliver_signal(struct kernel_siginfo *info)
 out:
 	spin_lock(&current->sighand->siglock);
 
-	/* Don't expose the si_sys_private value to userspace */
+	/* Don't expose the si_sys_priv* values to userspace */
 	info->si_sys_private = 0;
+	info->si_sys_privptr = NULL;
 	return ret;
 }
 
@@ -505,6 +506,7 @@ static int do_timer_create(clockid_t which_clock, struct sigevent *event,
 
 	new_timer->sigq->info.si_tid   = new_timer->it_id;
 	new_timer->sigq->info.si_code  = SI_TIMER;
+	new_timer->sigq->info.si_sys_privptr  = new_timer;
 
 	if (copy_to_user(created_timer_id, &new_timer_id, sizeof (new_timer_id))) {
 		error = -EFAULT;


  parent reply	other threads:[~2024-09-27  8:48 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-09-27  8:48 [patch v4 00/27] posix-timers: Cure the SIG_IGN mess Thomas Gleixner
2024-09-27  8:48 ` [patch v4 01/27] signal: Confine POSIX_TIMERS properly Thomas Gleixner
2024-09-27 12:21   ` Frederic Weisbecker
2024-09-27  8:48 ` [patch v4 02/27] signal: Prevent user space from setting si_sys_private Thomas Gleixner
2024-09-27 12:37   ` Frederic Weisbecker
2024-09-27 13:40   ` Eric W. Biederman
2024-09-27  8:48 ` [patch v4 03/27] signal: Get rid of resched_timer logic Thomas Gleixner
2024-09-27 13:08   ` Frederic Weisbecker
2024-09-27 13:53   ` Eric W. Biederman
2024-09-27  8:48 ` [patch v4 04/27] posix-timers: Cure si_sys_private race Thomas Gleixner
2024-09-27 14:02   ` Eric W. Biederman
2024-09-27  8:48 ` [patch v4 05/27] signal: Allow POSIX timer signals to be dropped Thomas Gleixner
2024-09-27  8:48 ` [patch v4 06/27] posix-timers: Drop signal if timer has been deleted or reprogrammed Thomas Gleixner
2024-09-27  8:48 ` [patch v4 07/27] posix-timers: Rename k_itimer::it_requeue_pending Thomas Gleixner
2024-09-27  8:48 ` [patch v4 08/27] posix-timers: Add proper state tracking Thomas Gleixner
2024-09-27  8:48 ` [patch v4 09/27] posix-timers: Make signal delivery consistent Thomas Gleixner
2024-09-27  8:48 ` [patch v4 10/27] posix-timers: Make signal overrun accounting sensible Thomas Gleixner
2024-09-27  8:48 ` [patch v4 11/27] posix-cpu-timers: Use dedicated flag for CPU timer nanosleep Thomas Gleixner
2024-09-27  8:48 ` [patch v4 12/27] posix-timers: Add a refcount to struct k_itimer Thomas Gleixner
2024-09-27  8:48 ` [patch v4 13/27] signal: Split up __sigqueue_alloc() Thomas Gleixner
2024-09-27  8:48 ` [patch v4 14/27] signal: Provide posixtimer_sigqueue_init() Thomas Gleixner
2024-09-27  8:48 ` Thomas Gleixner [this message]
2024-09-27  8:48 ` [patch v4 16/27] posix-timers: Store PID type in the timer Thomas Gleixner
2024-09-27  8:48 ` [patch v4 17/27] signal: Refactor send_sigqueue() Thomas Gleixner
2024-09-27  8:49 ` [patch v4 18/27] posix-timers: Embed sigqueue in struct k_itimer Thomas Gleixner
2024-09-27  8:49 ` [patch v4 19/27] signal: Cleanup unused posix-timer leftovers Thomas Gleixner
2024-09-27  8:49 ` [patch v4 20/27] signal: Add task argument to flush_sigqueue_mask() Thomas Gleixner
2024-09-27  8:49 ` [patch v4 21/27] signal: Provide ignored_posix_timers list Thomas Gleixner
2024-09-27  8:49 ` [patch v4 22/27] posix-timers: Handle ignored list on delete and exit Thomas Gleixner
2024-09-27  8:49 ` [patch v4 23/27] signal: Handle ignored signals in do_sigaction(action != SIG_IGN) Thomas Gleixner
2024-09-27  8:49 ` [patch v4 24/27] signal: Queue ignored posixtimers on ignore list Thomas Gleixner
2024-09-27  8:49 ` [patch v4 25/27] posix-timers: Cleanup SIG_IGN workaround leftovers Thomas Gleixner
2024-09-27  8:49 ` [patch v4 26/27] alarmtimers: Remove the throttle mechanism from alarm_forward_now() Thomas Gleixner
2024-09-27  8:49 ` [patch v4 27/27] alarmtimers: Remove return value from alarm functions Thomas Gleixner
2024-09-27 14:39 ` [patch v4 00/27] posix-timers: Cure the SIG_IGN mess Eric W. Biederman
2024-09-27 19:24   ` Thomas Gleixner

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=20240927084817.817985972@linutronix.de \
    --to=tglx@linutronix.de \
    --cc=anna-maria@linutronix.de \
    --cc=ebiederm@xmission.com \
    --cc=frederic@kernel.org \
    --cc=jstultz@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.org \
    --cc=sboyd@kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome