#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 */
 
        return ~(clk >> 3);
 }
 
+#ifdef CONFIG_POSIX_TIMERS
+/**
+ * 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]);
+}
+
+/* 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
+struct posix_cputimers { };
+#define INIT_CPU_TIMERS(s)
+#endif
+
 #define REQUEUE_PENDING 1
 
 /**
 
 #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): */
 
 #ifdef CONFIG_POSIX_TIMERS
        struct task_cputime             cputime_expires;
-       struct list_head                cpu_timers[3];
 #endif
+       /* Empty if CONFIG_POSIX_CPUTIMERS=n */
+       struct posix_cputimers          posix_cputimers;
 
        /* Process credentials: */
 
 
 #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:
        /* Earliest-expiration cache. */
        struct task_cputime cputime_expires;
 
-       struct list_head cpu_timers[3];
-
 #endif
+       /* Empty if CONFIG_POSIX_TIMERS=n */
+       struct posix_cputimers posix_cputimers;
 
        /* PID/PID hash table linkage. */
        struct pid *pids[PIDTYPE_MAX];
 
  */
 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);
                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) { }
        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) { }
 
  *
  * 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]);
 }
 
 /*
  */
 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)
        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);
 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;
 
                                 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;