From: Heiko Carstens <hca@linux.ibm.com>
To: Gerald Schaefer <gerald.schaefer@linux.ibm.com>
Cc: Alexander Gordeev <agordeev@linux.ibm.com>,
Sven Schnelle <svens@linux.ibm.com>,
Vasily Gorbik <gor@linux.ibm.com>,
Christian Borntraeger <borntraeger@linux.ibm.com>,
linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org
Subject: [RFC PATCH 2/2] s390/vtime: Remove vtimer infrastructure
Date: Mon, 5 Oct 2026 16:50:04 +0200 [thread overview]
Message-ID: <20261005145004.156348-3-hca@linux.ibm.com> (raw)
In-Reply-To: <20261005145004.156348-1-hca@linux.ibm.com>
The only user is gone - remove the vtimer infrastructure.
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
---
arch/s390/include/asm/vtime.h | 2 +
arch/s390/include/asm/vtimer.h | 30 -----
arch/s390/kernel/process.c | 1 -
arch/s390/kernel/smp.c | 2 +-
arch/s390/kernel/time.c | 2 +-
arch/s390/kernel/vtime.c | 212 ++-------------------------------
6 files changed, 12 insertions(+), 237 deletions(-)
delete mode 100644 arch/s390/include/asm/vtimer.h
diff --git a/arch/s390/include/asm/vtime.h b/arch/s390/include/asm/vtime.h
index da116a93d3b6..22e494b22192 100644
--- a/arch/s390/include/asm/vtime.h
+++ b/arch/s390/include/asm/vtime.h
@@ -8,6 +8,8 @@
DECLARE_PER_CPU(u64, mt_cycles[8]);
+void vtime_init(void);
+
static inline void update_timer_sys(void)
{
struct lowcore *lc = get_lowcore();
diff --git a/arch/s390/include/asm/vtimer.h b/arch/s390/include/asm/vtimer.h
deleted file mode 100644
index e601adaa6320..000000000000
--- a/arch/s390/include/asm/vtimer.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright IBM Corp. 2003, 2012
- * Virtual CPU timer
- *
- * Author(s): Jan Glauber <jan.glauber@de.ibm.com>
- */
-
-#ifndef _ASM_S390_TIMER_H
-#define _ASM_S390_TIMER_H
-
-#define VTIMER_MAX_SLICE (0x7fffffffffffffffULL)
-
-struct vtimer_list {
- struct list_head entry;
- u64 expires;
- u64 interval;
- void (*function)(unsigned long);
- unsigned long data;
-};
-
-extern void init_virt_timer(struct vtimer_list *timer);
-extern void add_virt_timer(struct vtimer_list *timer);
-extern void add_virt_timer_periodic(struct vtimer_list *timer);
-extern int mod_virt_timer(struct vtimer_list *timer, u64 expires);
-extern int mod_virt_timer_periodic(struct vtimer_list *timer, u64 expires);
-extern int del_virt_timer(struct vtimer_list *timer);
-extern void vtime_init(void);
-
-#endif /* _ASM_S390_TIMER_H */
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
index 416650ae4871..4c73d2528fcb 100644
--- a/arch/s390/kernel/process.c
+++ b/arch/s390/kernel/process.c
@@ -35,7 +35,6 @@
#include <asm/cpu_mf.h>
#include <asm/processor.h>
#include <asm/ptrace.h>
-#include <asm/vtimer.h>
#include <asm/exec.h>
#include <asm/fpu.h>
#include <asm/irq.h>
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
index 32499cad86f0..f7c262a17c03 100644
--- a/arch/s390/kernel/smp.c
+++ b/arch/s390/kernel/smp.c
@@ -48,7 +48,7 @@
#include <asm/setup.h>
#include <asm/irq.h>
#include <asm/tlbflush.h>
-#include <asm/vtimer.h>
+#include <asm/vtime.h>
#include <asm/abs_lowcore.h>
#include <asm/sclp.h>
#include <asm/debug.h>
diff --git a/arch/s390/kernel/time.c b/arch/s390/kernel/time.c
index 2b989bebd220..dd8a88cc9c4b 100644
--- a/arch/s390/kernel/time.c
+++ b/arch/s390/kernel/time.c
@@ -48,9 +48,9 @@
#include <asm/vdso.h>
#include <asm/irq.h>
#include <asm/irq_regs.h>
-#include <asm/vtimer.h>
#include <asm/stp.h>
#include <asm/cio.h>
+#include <asm/vtime.h>
#include "entry.h"
union tod_clock __bootdata_preserved(tod_clock_base);
diff --git a/arch/s390/kernel/vtime.c b/arch/s390/kernel/vtime.c
index efcbf406f03e..d9fd39c5732e 100644
--- a/arch/s390/kernel/vtime.c
+++ b/arch/s390/kernel/vtime.c
@@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0
/*
- * Virtual cpu timer based timer functions.
+ * Virtual CPU time accounting
*
* Copyright IBM Corp. 2004, 2012
* Author(s): Jan Glauber <jan.glauber@de.ibm.com>
@@ -14,7 +14,6 @@
#include <linux/time.h>
#include <asm/alternative.h>
#include <asm/cputime.h>
-#include <asm/vtimer.h>
#include <asm/vtime.h>
#include <asm/cpu_mf.h>
#include <asm/idle.h>
@@ -22,19 +21,14 @@
#include "entry.h"
-static void virt_timer_expire(void);
-
-static LIST_HEAD(virt_timer_list);
-static DEFINE_SPINLOCK(virt_timer_lock);
-static atomic64_t virt_timer_current;
-static atomic64_t virt_timer_elapsed;
+#define CPU_TIMER_MAX 0x7fffffffffffffffUL
DEFINE_PER_CPU(u64, mt_cycles[8]);
static DEFINE_PER_CPU(u64, mt_scaling_mult) = { 1 };
static DEFINE_PER_CPU(u64, mt_scaling_div) = { 1 };
static DEFINE_PER_CPU(unsigned long, mt_scaling_jiffies);
-static inline void set_vtimer(u64 expires)
+static inline void cpu_timer_init(u64 value)
{
struct lowcore *lc = get_lowcore();
u64 timer;
@@ -42,18 +36,9 @@ static inline void set_vtimer(u64 expires)
asm volatile(
" stpt %0\n" /* Store current cpu timer value */
" spt %1" /* Set new value imm. afterwards */
- : "=Q" (timer) : "Q" (expires));
+ : "=Q" (timer) : "Q" (value));
lc->system_timer += lc->last_update_timer - timer;
- lc->last_update_timer = expires;
-}
-
-static inline int virt_timer_forward(u64 elapsed)
-{
- lockdep_assert_irqs_disabled();
- if (list_empty(&virt_timer_list))
- return 0;
- elapsed = atomic64_add_return(elapsed, &virt_timer_elapsed);
- return elapsed >= atomic64_read(&virt_timer_current);
+ lc->last_update_timer = value;
}
static void update_mt_scaling(void)
@@ -125,7 +110,7 @@ static inline void vtime_reset_last_update(struct lowcore *lc)
* Update process times based on virtual cpu times stored by entry.S
* to the lowcore fields user_timer, system_timer & steal_clock.
*/
-static int do_account_vtime(struct task_struct *tsk)
+static void do_account_vtime(struct task_struct *tsk)
{
u64 timer, clock, user, guest, system, hardirq, softirq;
struct lowcore *lc = get_lowcore();
@@ -172,8 +157,6 @@ static int do_account_vtime(struct task_struct *tsk)
account_system_index_scaled(tsk, hardirq, CPUTIME_IRQ);
if (softirq)
account_system_index_scaled(tsk, softirq, CPUTIME_SOFTIRQ);
-
- return virt_timer_forward(user + guest + system + hardirq + softirq);
}
void vtime_task_switch(struct task_struct *prev)
@@ -203,8 +186,7 @@ void vtime_flush(struct task_struct *tsk)
struct lowcore *lc = get_lowcore();
u64 steal, avg_steal;
- if (do_account_vtime(tsk))
- virt_timer_expire();
+ do_account_vtime(tsk);
steal = lc->steal_timer;
avg_steal = lc->avg_steal_timer;
@@ -247,187 +229,9 @@ void vtime_account_hardirq(struct task_struct *tsk)
get_lowcore()->hardirq_timer += vtime_delta();
}
-/*
- * Sorted add to a list. List is linear searched until first bigger
- * element is found.
- */
-static void list_add_sorted(struct vtimer_list *timer, struct list_head *head)
-{
- struct vtimer_list *tmp;
-
- list_for_each_entry(tmp, head, entry) {
- if (tmp->expires > timer->expires) {
- list_add_tail(&timer->entry, &tmp->entry);
- return;
- }
- }
- list_add_tail(&timer->entry, head);
-}
-
-/*
- * Handler for expired virtual CPU timer.
- */
-static void virt_timer_expire(void)
-{
- struct vtimer_list *timer, *tmp;
- unsigned long elapsed;
- LIST_HEAD(cb_list);
-
- /* walk timer list, fire all expired timers */
- spin_lock(&virt_timer_lock);
- elapsed = atomic64_read(&virt_timer_elapsed);
- list_for_each_entry_safe(timer, tmp, &virt_timer_list, entry) {
- if (timer->expires < elapsed)
- /* move expired timer to the callback queue */
- list_move_tail(&timer->entry, &cb_list);
- else
- timer->expires -= elapsed;
- }
- if (!list_empty(&virt_timer_list)) {
- timer = list_first_entry(&virt_timer_list,
- struct vtimer_list, entry);
- atomic64_set(&virt_timer_current, timer->expires);
- }
- atomic64_sub(elapsed, &virt_timer_elapsed);
- spin_unlock(&virt_timer_lock);
-
- /* Do callbacks and recharge periodic timers */
- list_for_each_entry_safe(timer, tmp, &cb_list, entry) {
- list_del_init(&timer->entry);
- timer->function(timer->data);
- if (timer->interval) {
- /* Recharge interval timer */
- timer->expires = timer->interval +
- atomic64_read(&virt_timer_elapsed);
- spin_lock(&virt_timer_lock);
- list_add_sorted(timer, &virt_timer_list);
- spin_unlock(&virt_timer_lock);
- }
- }
-}
-
-void init_virt_timer(struct vtimer_list *timer)
-{
- timer->function = NULL;
- INIT_LIST_HEAD(&timer->entry);
-}
-EXPORT_SYMBOL(init_virt_timer);
-
-static inline int vtimer_pending(struct vtimer_list *timer)
-{
- return !list_empty(&timer->entry);
-}
-
-static void internal_add_vtimer(struct vtimer_list *timer)
-{
- if (list_empty(&virt_timer_list)) {
- /* First timer, just program it. */
- atomic64_set(&virt_timer_current, timer->expires);
- atomic64_set(&virt_timer_elapsed, 0);
- list_add(&timer->entry, &virt_timer_list);
- } else {
- /* Update timer against current base. */
- timer->expires += atomic64_read(&virt_timer_elapsed);
- if (likely((s64) timer->expires <
- (s64) atomic64_read(&virt_timer_current)))
- /* The new timer expires before the current timer. */
- atomic64_set(&virt_timer_current, timer->expires);
- /* Insert new timer into the list. */
- list_add_sorted(timer, &virt_timer_list);
- }
-}
-
-static void __add_vtimer(struct vtimer_list *timer, int periodic)
-{
- unsigned long flags;
-
- timer->interval = periodic ? timer->expires : 0;
- spin_lock_irqsave(&virt_timer_lock, flags);
- internal_add_vtimer(timer);
- spin_unlock_irqrestore(&virt_timer_lock, flags);
-}
-
-/*
- * add_virt_timer - add a oneshot virtual CPU timer
- */
-void add_virt_timer(struct vtimer_list *timer)
-{
- __add_vtimer(timer, 0);
-}
-EXPORT_SYMBOL(add_virt_timer);
-
-/*
- * add_virt_timer_int - add an interval virtual CPU timer
- */
-void add_virt_timer_periodic(struct vtimer_list *timer)
-{
- __add_vtimer(timer, 1);
-}
-EXPORT_SYMBOL(add_virt_timer_periodic);
-
-static int __mod_vtimer(struct vtimer_list *timer, u64 expires, int periodic)
-{
- unsigned long flags;
- int rc;
-
- BUG_ON(!timer->function);
-
- if (timer->expires == expires && vtimer_pending(timer))
- return 1;
- spin_lock_irqsave(&virt_timer_lock, flags);
- rc = vtimer_pending(timer);
- if (rc)
- list_del_init(&timer->entry);
- timer->interval = periodic ? expires : 0;
- timer->expires = expires;
- internal_add_vtimer(timer);
- spin_unlock_irqrestore(&virt_timer_lock, flags);
- return rc;
-}
-
-/*
- * returns whether it has modified a pending timer (1) or not (0)
- */
-int mod_virt_timer(struct vtimer_list *timer, u64 expires)
-{
- return __mod_vtimer(timer, expires, 0);
-}
-EXPORT_SYMBOL(mod_virt_timer);
-
-/*
- * returns whether it has modified a pending timer (1) or not (0)
- */
-int mod_virt_timer_periodic(struct vtimer_list *timer, u64 expires)
-{
- return __mod_vtimer(timer, expires, 1);
-}
-EXPORT_SYMBOL(mod_virt_timer_periodic);
-
-/*
- * Delete a virtual timer.
- *
- * returns whether the deleted timer was pending (1) or not (0)
- */
-int del_virt_timer(struct vtimer_list *timer)
-{
- unsigned long flags;
-
- if (!vtimer_pending(timer))
- return 0;
- spin_lock_irqsave(&virt_timer_lock, flags);
- list_del_init(&timer->entry);
- spin_unlock_irqrestore(&virt_timer_lock, flags);
- return 1;
-}
-EXPORT_SYMBOL(del_virt_timer);
-
-/*
- * Start the virtual CPU timer on the current CPU.
- */
void vtime_init(void)
{
- /* set initial cpu timer */
- set_vtimer(VTIMER_MAX_SLICE);
+ cpu_timer_init(CPU_TIMER_MAX);
/* Setup initial MT scaling values */
if (smp_cpu_mtid) {
__this_cpu_write(mt_scaling_jiffies, jiffies);
--
2.53.0
prev parent reply other threads:[~2026-10-05 14:50 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-05 14:50 [RFC PATCH 0/2] s390: " Heiko Carstens
2026-10-05 14:50 ` [RFC PATCH 1/2] s390/appldata: Emulate virtual timer with delayed work Heiko Carstens
2026-10-05 14:50 ` Heiko Carstens [this message]
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=20261005145004.156348-3-hca@linux.ibm.com \
--to=hca@linux.ibm.com \
--cc=agordeev@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=gerald.schaefer@linux.ibm.com \
--cc=gor@linux.ibm.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-s390@vger.kernel.org \
--cc=svens@linux.ibm.com \
/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®