Commit 54f1dd64 authored by Thomas Gleixner's avatar Thomas Gleixner
Browse files

signal: Provide posixtimer_sigqueue_init()



To cure the SIG_IGN handling for posix interval timers, the preallocated
sigqueue needs to be embedded into struct k_itimer to prevent life time
races of all sorts.

Provide a new function to initialize the embedded sigqueue to prepare for
that.

Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Reviewed-by: default avatarFrederic Weisbecker <frederic@kernel.org>
Acked-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/all/20241105064213.450427515@linutronix.de
parent 5cac427f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -12,6 +12,7 @@

struct kernel_siginfo;
struct task_struct;
struct sigqueue;
struct k_itimer;

static inline clockid_t make_process_cpuclock(const unsigned int pid,
@@ -106,6 +107,7 @@ static inline void posix_cputimers_rt_watchdog(struct posix_cputimers *pct,
}

void posixtimer_rearm_itimer(struct task_struct *p);
bool posixtimer_init_sigqueue(struct sigqueue *q);
bool posixtimer_deliver_signal(struct kernel_siginfo *info);
void posixtimer_free_timer(struct k_itimer *timer);

+11 −0
Original line number Diff line number Diff line
@@ -1905,6 +1905,17 @@ void flush_itimer_signals(void)
	__flush_itimer_signals(&tsk->signal->shared_pending);
}

bool posixtimer_init_sigqueue(struct sigqueue *q)
{
	struct ucounts *ucounts = sig_get_ucounts(current, -1, 0);

	if (!ucounts)
		return false;
	clear_siginfo(&q->info);
	__sigqueue_init(q, ucounts, SIGQUEUE_PREALLOC);
	return true;
}

struct sigqueue *sigqueue_alloc(void)
{
	return __sigqueue_alloc(-1, current, GFP_KERNEL, 0, SIGQUEUE_PREALLOC);