Commit 1af5c1d3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'timers-urgent-2025-11-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Ingo Molnar:

 - Fix a race in timer->function clearing in timer_shutdown_sync()

 - Fix a timekeeper sysfs-setup resource leak in error paths

 - Fix the NOHZ report_idle_softirq() syslog rate-limiting
   logic to have no side effects on the return value

* tag 'timers-urgent-2025-11-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  timers: Fix NULL function pointer race in timer_shutdown_sync()
  timekeeping: Fix resource leak in tk_aux_sysfs_init() error paths
  tick/sched: Fix bogus condition in report_idle_softirq()
parents e624f737 20739af0
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -1152,16 +1152,15 @@ static bool report_idle_softirq(void)
			return false;
	}

	if (ratelimit >= 10)
		return false;

	/* On RT, softirq handling may be waiting on some lock */
	if (local_bh_blocked())
		return false;

	if (ratelimit < 10) {
		pr_warn("NOHZ tick-stop error: local softirq work is pending, handler #%02x!!!\n",
			pending);
		ratelimit++;
	}

	return true;
}
+12 −9
Original line number Diff line number Diff line
@@ -3060,29 +3060,32 @@ static const struct attribute_group aux_clock_enable_attr_group = {
static int __init tk_aux_sysfs_init(void)
{
	struct kobject *auxo, *tko = kobject_create_and_add("time", kernel_kobj);
	int ret = -ENOMEM;

	if (!tko)
		return -ENOMEM;
		return ret;

	auxo = kobject_create_and_add("aux_clocks", tko);
	if (!auxo) {
		kobject_put(tko);
		return -ENOMEM;
	}
	if (!auxo)
		goto err_clean;

	for (int i = 0; i < MAX_AUX_CLOCKS; i++) {
		char id[2] = { [0] = '0' + i, };
		struct kobject *clk = kobject_create_and_add(id, auxo);

		if (!clk)
			return -ENOMEM;

		int ret = sysfs_create_group(clk, &aux_clock_enable_attr_group);
			goto err_clean;

		ret = sysfs_create_group(clk, &aux_clock_enable_attr_group);
		if (ret)
			return ret;
			goto err_clean;
	}
	return 0;

err_clean:
	kobject_put(auxo);
	kobject_put(tko);
	return ret;
}
late_initcall(tk_aux_sysfs_init);

+4 −3
Original line number Diff line number Diff line
@@ -1458,10 +1458,11 @@ static int __try_to_del_timer_sync(struct timer_list *timer, bool shutdown)

	base = lock_timer_base(timer, &flags);

	if (base->running_timer != timer)
	if (base->running_timer != timer) {
		ret = detach_if_pending(timer, base, true);
		if (shutdown)
			timer->function = NULL;
	}

	raw_spin_unlock_irqrestore(&base->lock, flags);