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: Oleg Nesterov <oleg@redhat.com>, Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	John Stultz <john.stultz@linaro.org>,
	Frederic Weisbecker <fweisbec@gmail.com>,
	Anna-Maria Behnsen <anna-maria@linutronix.de>
Subject: [patch 24/44] posix-cpu-timers: Create a container struct
Date: Mon, 19 Aug 2019 16:32:05 +0200	[thread overview]
Message-ID: <20190819143803.676155761@linutronix.de> (raw)
In-Reply-To: <20190819143141.221906747@linutronix.de>

Per task/process data of posix CPU timers is all over the place which
makes the code hard to follow and requires ifdeffery.

Create a container to hold all this information in one place, so data is
consolidated and the ifdeffery can be confined to the posix timer header
file and removed from places like fork.

As a first step, move the cpu_timers list head array into the new struct
and clean up the initializers and simplify fork. The remaining #ifdef in
fork will be removed later.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 include/linux/init_task.h      |   11 -----------
 include/linux/posix-timers.h   |   33 +++++++++++++++++++++++++++++++++
 include/linux/sched.h          |    3 ++-
 include/linux/sched/signal.h   |    4 ++--
 kernel/fork.c                  |   11 ++++-------
 kernel/time/posix-cpu-timers.c |   20 ++++++++++----------
 6 files changed, 51 insertions(+), 31 deletions(-)

--- a/include/linux/init_task.h
+++ b/include/linux/init_task.h
@@ -36,17 +36,6 @@ extern struct cred init_cred;
 #define INIT_PREV_CPUTIME(x)
 #endif
 
-#ifdef CONFIG_POSIX_TIMERS
-#define INIT_CPU_TIMERS(s)						\
-	.cpu_timers = {							\
-		LIST_HEAD_INIT(s.cpu_timers[0]),			\
-		LIST_HEAD_INIT(s.cpu_timers[1]),			\
-		LIST_HEAD_INIT(s.cpu_timers[2]),			\
-	},
-#else
-#define INIT_CPU_TIMERS(s)
-#endif
-
 #define INIT_TASK_COMM "swapper"
 
 /* Attach to the init_task data structure for proper alignment */
--- a/include/linux/posix-timers.h
+++ b/include/linux/posix-timers.h
@@ -62,6 +62,39 @@ static inline int clockid_to_fd(const cl
 	return ~(clk >> 3);
 }
 
+/**
+ * posix_cputimers - Container for posix CPU timer related data
+ * @cpu_timers:		List heads to queue posix CPU timers
+ *
+ * Used in task_struct and signal_struct
+ */
+struct posix_cputimers {
+	struct list_head	cpu_timers[CPUCLOCK_MAX];
+};
+
+static inline void posix_cputimers_init(struct posix_cputimers *pct)
+{
+	INIT_LIST_HEAD(&pct->cpu_timers[0]);
+	INIT_LIST_HEAD(&pct->cpu_timers[1]);
+	INIT_LIST_HEAD(&pct->cpu_timers[2]);
+}
+
+#ifdef CONFIG_POSIX_TIMERS
+/* Init task static initializer */
+#define INIT_CPU_TIMERLISTS(c)	{					\
+	LIST_HEAD_INIT(c.cpu_timers[0]),				\
+	LIST_HEAD_INIT(c.cpu_timers[1]),				\
+	LIST_HEAD_INIT(c.cpu_timers[2]),				\
+}
+
+#define INIT_CPU_TIMERS(s)						\
+	.posix_cputimers = {						\
+		.cpu_timers = INIT_CPU_TIMERLISTS(s.posix_cputimers),	\
+	},
+#else
+#define INIT_CPU_TIMERS(s)
+#endif
+
 #define REQUEUE_PENDING 1
 
 /**
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -28,6 +28,7 @@
 #include <linux/signal_types.h>
 #include <linux/mm_types_task.h>
 #include <linux/task_io_accounting.h>
+#include <linux/posix-timers.h>
 #include <linux/rseq.h>
 
 /* task_struct member predeclarations (sorted alphabetically): */
@@ -878,7 +879,7 @@ struct task_struct {
 
 #ifdef CONFIG_POSIX_TIMERS
 	struct task_cputime		cputime_expires;
-	struct list_head		cpu_timers[3];
+	struct posix_cputimers		posix_cputimers;
 #endif
 
 	/* Process credentials: */
--- a/include/linux/sched/signal.h
+++ b/include/linux/sched/signal.h
@@ -9,6 +9,7 @@
 #include <linux/sched/task.h>
 #include <linux/cred.h>
 #include <linux/refcount.h>
+#include <linux/posix-timers.h>
 
 /*
  * Types defining task->signal and task->sighand and APIs using them:
@@ -151,8 +152,7 @@ struct signal_struct {
 	/* Earliest-expiration cache. */
 	struct task_cputime cputime_expires;
 
-	struct list_head cpu_timers[3];
-
+	struct posix_cputimers posix_cputimers;
 #endif
 
 	/* PID/PID hash table linkage. */
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1523,6 +1523,7 @@ void __cleanup_sighand(struct sighand_st
  */
 static void posix_cpu_timers_init_group(struct signal_struct *sig)
 {
+	struct posix_cputimers *pct = &sig->posix_cputimers;
 	unsigned long cpu_limit;
 
 	cpu_limit = READ_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur);
@@ -1531,10 +1532,7 @@ static void posix_cpu_timers_init_group(
 		sig->cputimer.running = true;
 	}
 
-	/* The timer lists. */
-	INIT_LIST_HEAD(&sig->cpu_timers[0]);
-	INIT_LIST_HEAD(&sig->cpu_timers[1]);
-	INIT_LIST_HEAD(&sig->cpu_timers[2]);
+	posix_cputimers_init(pct);
 }
 #else
 static inline void posix_cpu_timers_init_group(struct signal_struct *sig) { }
@@ -1649,9 +1647,8 @@ static void posix_cpu_timers_init(struct
 	tsk->cputime_expires.prof_exp = 0;
 	tsk->cputime_expires.virt_exp = 0;
 	tsk->cputime_expires.sched_exp = 0;
-	INIT_LIST_HEAD(&tsk->cpu_timers[0]);
-	INIT_LIST_HEAD(&tsk->cpu_timers[1]);
-	INIT_LIST_HEAD(&tsk->cpu_timers[2]);
+
+	posix_cputimers_init(&tsk->posix_cputimers);
 }
 #else
 static inline void posix_cpu_timers_init(struct task_struct *tsk) { }
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -407,11 +407,11 @@ static void cleanup_timers_list(struct l
  *
  * This must be called with the siglock held.
  */
-static void cleanup_timers(struct list_head *head)
+static void cleanup_timers(struct posix_cputimers *pct)
 {
-	cleanup_timers_list(head);
-	cleanup_timers_list(++head);
-	cleanup_timers_list(++head);
+	cleanup_timers_list(&pct->cpu_timers[CPUCLOCK_PROF]);
+	cleanup_timers_list(&pct->cpu_timers[CPUCLOCK_VIRT]);
+	cleanup_timers_list(&pct->cpu_timers[CPUCLOCK_SCHED]);
 }
 
 /*
@@ -421,11 +421,11 @@ static void cleanup_timers(struct list_h
  */
 void posix_cpu_timers_exit(struct task_struct *tsk)
 {
-	cleanup_timers(tsk->cpu_timers);
+	cleanup_timers(&tsk->posix_cputimers);
 }
 void posix_cpu_timers_exit_group(struct task_struct *tsk)
 {
-	cleanup_timers(tsk->signal->cpu_timers);
+	cleanup_timers(&tsk->signal->posix_cputimers);
 }
 
 static inline int expires_gt(u64 expires, u64 new_exp)
@@ -446,10 +446,10 @@ static void arm_timer(struct k_itimer *t
 	struct cpu_timer_list *next;
 
 	if (CPUCLOCK_PERTHREAD(timer->it_clock)) {
-		head = p->cpu_timers;
+		head = p->posix_cputimers.cpu_timers;
 		cputime_expires = &p->cputime_expires;
 	} else {
-		head = p->signal->cpu_timers;
+		head = p->signal->posix_cputimers.cpu_timers;
 		cputime_expires = &p->signal->cputime_expires;
 	}
 	head += CPUCLOCK_WHICH(timer->it_clock);
@@ -773,8 +773,8 @@ static inline void check_dl_overrun(stru
 static void check_thread_timers(struct task_struct *tsk,
 				struct list_head *firing)
 {
+	struct list_head *timers = tsk->posix_cputimers.cpu_timers;
 	struct task_cputime *tsk_expires = &tsk->cputime_expires;
-	struct list_head *timers = tsk->cpu_timers;
 	u64 expires, stime, utime;
 	unsigned long soft;
 
@@ -879,9 +879,9 @@ static void check_process_timers(struct
 				 struct list_head *firing)
 {
 	struct signal_struct *const sig = tsk->signal;
+	struct list_head *timers = sig->posix_cputimers.cpu_timers;
 	u64 utime, ptime, virt_expires, prof_expires;
 	u64 sum_sched_runtime, sched_expires;
-	struct list_head *timers = sig->cpu_timers;
 	struct task_cputime cputime;
 	unsigned long soft;
 



  parent reply	other threads:[~2019-08-19 15:47 UTC|newest]

Thread overview: 83+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-19 14:31 [patch 00/44] posix-cpu-timers: Cleanup and consolidation Thomas Gleixner
2019-08-19 14:31 ` [patch 01/44] posix-timers: Cleanup forward declarations and includes Thomas Gleixner
2019-08-20 12:20   ` Frederic Weisbecker
2019-08-20 13:03     ` Thomas Gleixner
2019-08-20 13:48   ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 02/44] alarmtimers: Avoid rtc.h include Thomas Gleixner
2019-08-20 13:49   ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 03/44] posix-timer: Use a callback for cancel synchronization Thomas Gleixner
2019-08-20  2:21   ` Christoph Hellwig
2019-08-20 13:08     ` Thomas Gleixner
2019-08-20 13:59   ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] posix-timers: Use a callback for cancel synchronization on PREEMPT_RT tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 04/44] posix-cpu-timers: Fixup stale comment Thomas Gleixner
2019-08-20 14:26   ` Frederic Weisbecker
2019-08-20 17:57     ` Thomas Gleixner
2019-08-20 20:48       ` Frederic Weisbecker
2019-08-20 21:43         ` Thomas Gleixner
2019-08-20 22:56           ` Frederic Weisbecker
2019-08-21 13:31             ` Thomas Gleixner
2019-08-21 15:51               ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 05/44] posix-cpu-timers: Sanitize bogus WARNONS Thomas Gleixner
2019-08-21 11:34   ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 06/44] posix-cpu-timers: Remove tsk argument from run_posix_cpu_timers() Thomas Gleixner
2019-08-21 11:36   ` Frederic Weisbecker
2019-08-23  2:12   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2019-08-19 14:31 ` [patch 07/44] posix-cpu-timers: Simplify sighand locking in run_posix_cpu_timers() Thomas Gleixner
2019-08-21 12:09   ` Frederic Weisbecker
2019-08-21 13:25     ` Thomas Gleixner
2019-08-21 15:42       ` Frederic Weisbecker
2019-08-21 17:13         ` Thomas Gleixner
2019-08-19 14:31 ` [patch 08/44] posix-cpu-timers: Provide task validation functions Thomas Gleixner
2019-08-19 14:31 ` [patch 09/44] posix-cpu-timers: Use common permission check in posix_cpu_clock_get() Thomas Gleixner
2019-08-19 14:31 ` [patch 10/44] posix-cpu-timers: Use common permission check in posix_cpu_timer_create() Thomas Gleixner
2019-08-19 14:31 ` [patch 11/44] posix-cpu-timers: Provide quick sample function for itimer Thomas Gleixner
2019-08-19 14:31 ` [patch 12/44] itimers: Use quick sample function Thomas Gleixner
2019-08-19 14:31 ` [patch 13/44] posix-cpu-timers: Sample directly in timer check Thomas Gleixner
2019-08-19 14:31 ` [patch 14/44] posix-cpu-timers: Rename thread_group_cputimer() and make it static Thomas Gleixner
2019-08-19 14:31 ` [patch 15/44] posix-cpu-timer: Comsolidate thread group sample code Thomas Gleixner
2019-08-19 19:07   ` Ingo Molnar
2019-08-19 14:31 ` [patch 16/44] posix-cpu-timers: Use clock ID in posix_cpu_timer_set() Thomas Gleixner
2019-08-19 14:31 ` [patch 17/44] posix-cpu-timers: Use clock ID in posix_cpu_timer_get() Thomas Gleixner
2019-08-19 14:31 ` [patch 18/44] posix-cpu-timers: Use clock ID in posix_cpu_timer_rearm() Thomas Gleixner
2019-08-19 14:32 ` [patch 19/44] posix-cpu-timer: Remove pointless return value check Thomas Gleixner
2019-08-19 14:32 ` [patch 20/44] posix-cpu-timers: Simplify sample functions Thomas Gleixner
2019-08-19 14:32 ` [patch 21/44] posix-cpu-timers: Get rid of pointer indirection Thomas Gleixner
2019-08-19 14:32 ` [patch 22/44] posix-cpu-timers: Sample task times once in expiry check Thomas Gleixner
2019-08-19 14:32 ` [patch 23/44] posix-cpu-timers: Move prof/virt_ticks into caller Thomas Gleixner
2019-08-19 14:32 ` Thomas Gleixner [this message]
2019-08-19 14:32 ` [patch 25/44] sched: Move struct task_cputime to types.h Thomas Gleixner
2019-08-19 14:32 ` [patch 26/44] posix-cpu-timers: Move expiry cache into struct posix_cputimers Thomas Gleixner
2019-08-19 14:32 ` [patch 27/44] posix-cpu-timers: Provide array based access to expiry cache Thomas Gleixner
2019-08-19 19:32   ` Ingo Molnar
2019-08-20 20:22     ` Thomas Gleixner
2019-08-19 14:32 ` [patch 28/44] posix-cpu-timers: Simplify timer queueing Thomas Gleixner
2019-08-19 14:32 ` [patch 29/44] posix-cpu-timers: Simplify set_process_cpu_timer() Thomas Gleixner
2019-08-19 14:32 ` [patch 30/44] posix-cpu-timers: Switch check_*_timers() to array cache Thomas Gleixner
2019-08-19 14:32 ` [patch 31/44] posix-cpu-timers: Remove the odd field rename defines Thomas Gleixner
2019-08-19 14:32 ` [patch 32/44] posix-cpu-timers: Provide array based sample functions Thomas Gleixner
2019-08-19 14:32 ` [patch 33/44] posix-cpu-timers: Make expiry checks array based Thomas Gleixner
2019-08-19 14:32 ` [patch 34/44] posix-cpu-timers: Remove cputime_expires Thomas Gleixner
2019-08-19 14:32 ` [patch 35/44] posix-cpu-timers: Switch thread group sampling to array Thomas Gleixner
2019-08-19 14:32 ` [patch 36/44] posix-cpu-timers: Get rid of zero checks Thomas Gleixner
2019-08-19 14:32 ` [patch 37/44] posix-cpu-timers: Consolidate timer expiry further Thomas Gleixner
2019-08-19 14:32 ` [patch 38/44] posix-cpu-timers: Respect INFINITY for hard RTTIME limit Thomas Gleixner
2019-08-19 20:06   ` Ingo Molnar
2019-08-19 20:29     ` Thomas Gleixner
2019-08-19 14:32 ` [patch 39/44] posix-cpu-timers: Get rid of 64bit divisions Thomas Gleixner
2019-08-19 14:32 ` [patch 40/44] posix-cpu-timers: Remove pointless comparisions Thomas Gleixner
2019-08-19 20:10   ` Ingo Molnar
2019-08-19 14:32 ` [patch 41/44] posix-cpu-timers: Deduplicate rlimit handling Thomas Gleixner
2019-08-19 14:32 ` [patch 42/44] posix-cpu-timers: Move state tracking to struct posix_cputimers Thomas Gleixner
2019-08-19 19:13   ` Ingo Molnar
2019-08-19 20:29     ` Thomas Gleixner
2019-08-19 14:32 ` [patch 43/44] posix-cpu-timers: Utilize timerqueue for storage Thomas Gleixner
2019-08-19 14:32 ` [patch 44/44] posix-cpu-timers: Expire timers directly Thomas Gleixner
2019-08-19 19:09   ` Ingo Molnar
2019-08-20 13:07   ` Thomas Gleixner
2019-08-20  2:18 ` [patch 00/44] posix-cpu-timers: Cleanup and consolidation Christoph Hellwig
2019-08-20 13:09   ` 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=20190819143803.676155761@linutronix.de \
    --to=tglx@linutronix.de \
    --cc=anna-maria@linutronix.de \
    --cc=fweisbec@gmail.com \
    --cc=john.stultz@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=oleg@redhat.com \
    --cc=peterz@infradead.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

all inboxes | Powered by JetHome®