Commit d5ca3273 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'timers-urgent-2020-04-05' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:
 "Two timer subsystem fixes:

   - Prevent a use after free in the new lockdep state tracking for
     hrtimers

   - Add missing parenthesis in the VF pit timer driver"

* tag 'timers-urgent-2020-04-05' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  clocksource/drivers/timer-vf-pit: Add missing parenthesis
  hrtimer: Don't dereference the hrtimer pointer after the callback
parents e5adbd6e 760a5376
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -129,7 +129,7 @@ static int __init pit_clockevent_init(unsigned long rate, int irq)
	__raw_writel(PITTFLG_TIF, clkevt_base + PITTFLG);

	BUG_ON(request_irq(irq, pit_timer_interrupt, IRQF_TIMER | IRQF_IRQPOLL,
			   "VF pit timer", &clockevent_pit);
			   "VF pit timer", &clockevent_pit));

	clockevent_pit.cpumask = cpumask_of(0);
	clockevent_pit.irq = irq;
+16 −11
Original line number Diff line number Diff line
@@ -58,14 +58,19 @@ do { \
} while (0)

# define lockdep_hrtimer_enter(__hrtimer)		\
	  do {						\
		  if (!__hrtimer->is_hard)		\
({							\
	bool __expires_hardirq = true;			\
							\
	if (!__hrtimer->is_hard) {			\
		current->irq_config = 1;		\
	  } while (0)
		__expires_hardirq = false;		\
	}						\
	__expires_hardirq;				\
})

# define lockdep_hrtimer_exit(__hrtimer)		\
# define lockdep_hrtimer_exit(__expires_hardirq)	\
	do {						\
		  if (!__hrtimer->is_hard)		\
		if (!__expires_hardirq)			\
			current->irq_config = 0;	\
	} while (0)

@@ -102,8 +107,8 @@ do { \
# define lockdep_hardirq_exit()		do { } while (0)
# define lockdep_softirq_enter()	do { } while (0)
# define lockdep_softirq_exit()		do { } while (0)
# define lockdep_hrtimer_enter(__hrtimer)		do { } while (0)
# define lockdep_hrtimer_exit(__hrtimer)		do { } while (0)
# define lockdep_hrtimer_enter(__hrtimer)	false
# define lockdep_hrtimer_exit(__context)	do { } while (0)
# define lockdep_posixtimer_enter()		do { } while (0)
# define lockdep_posixtimer_exit()		do { } while (0)
# define lockdep_irq_work_enter(__work)		do { } while (0)
+3 −2
Original line number Diff line number Diff line
@@ -1480,6 +1480,7 @@ static void __run_hrtimer(struct hrtimer_cpu_base *cpu_base,
			  unsigned long flags) __must_hold(&cpu_base->lock)
{
	enum hrtimer_restart (*fn)(struct hrtimer *);
	bool expires_in_hardirq;
	int restart;

	lockdep_assert_held(&cpu_base->lock);
@@ -1514,11 +1515,11 @@ static void __run_hrtimer(struct hrtimer_cpu_base *cpu_base,
	 */
	raw_spin_unlock_irqrestore(&cpu_base->lock, flags);
	trace_hrtimer_expire_entry(timer, now);
	lockdep_hrtimer_enter(timer);
	expires_in_hardirq = lockdep_hrtimer_enter(timer);

	restart = fn(timer);

	lockdep_hrtimer_exit(timer);
	lockdep_hrtimer_exit(expires_in_hardirq);
	trace_hrtimer_expire_exit(timer);
	raw_spin_lock_irq(&cpu_base->lock);