A few fixes for timers/timekeeping:
- Prevent undefined behaviour in the timespec64_to_ns() conversion which is used for converting user supplied time input to nanoseconds. It lacked overflow protection. - Mark sched_clock_read_begin/retry() to prevent recursion in the tracer - Remove unused debug functions in the hrtimer and timerlist code -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAl+evaETHHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoT69D/0Z3ZGdNQu3mAPYdMSaW7R3MfXnLKno biRCwre/T88Exv+Yu612iLthTlfNlxZbofAgUc5BvCwjAjtt+uXlmS8mwXNsbGFd 516hisUnjJkjbcHI6WxrQQ7+YsK2XLjOeV90TpLs9zMgI94kQ+uzEzqKc6ZaRQP4 Zi/emqgHeO/RoObNBWjNh9McrHqXllXU/LeqD7y82JXdLPik78PniKFkh7B1d6u8 RL7kW1TeblkNaHMVjO4/lM9zR1hkZr4GPYbEHIbVN8FMQ10BAD2iswUR72U2mqx7 zf2Jt+09UEzPRu2gOr4Lrvo6bJQKClu4ZUnRt4apU4BeTgyG0gi7pgy0VZ3M1xtq KUnN8dNSMBwTurv9GuGTdiNpfFad2nsnSAra8r7GlZDHxNe1wWIPJmyu/FV1xohD yUgRq2s7rvCb894oz159hyIwkI/ZNbFr/AJTCvdzowgf9nf4WS5/Y2/JVLF28LRT 4xPhvuVUfrhHJajoZayuVvxYSVEPZFek2SgUEIFi6b1+FiMFwV6guv/f31D5GQ+E NHgvDMbDsVmzGt++c4zFHoqWvBrgC8Os8AEP8s2oczfvwMt2A8g7nIrGieAux+Jm eLO1DfXaXpQi/MmTBf/WD1dKwjuoLV9dT0Fp2y2docu9SXm/bMgRhxX7fm3uDge7 W87XWkfIxd5fzA== =Gdoq -----END PGP SIGNATURE----- Merge tag 'timers-urgent-2020-11-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull timer fixes from Thomas Gleixner: "A few fixes for timers/timekeeping: - Prevent undefined behaviour in the timespec64_to_ns() conversion which is used for converting user supplied time input to nanoseconds. It lacked overflow protection. - Mark sched_clock_read_begin/retry() to prevent recursion in the tracer - Remove unused debug functions in the hrtimer and timerlist code" * tag 'timers-urgent-2020-11-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: time: Prevent undefined behaviour in timespec64_to_ns() timers: Remove unused inline funtion debug_timer_free() hrtimer: Remove unused inline function debug_hrtimer_free() time/sched_clock: Mark sched_clock_read_begin/retry() as notrace
This commit is contained in:
commit
4312e0e8d3
@ -124,6 +124,10 @@ static inline bool timespec64_valid_settod(const struct timespec64 *ts)
|
|||||||
*/
|
*/
|
||||||
static inline s64 timespec64_to_ns(const struct timespec64 *ts)
|
static inline s64 timespec64_to_ns(const struct timespec64 *ts)
|
||||||
{
|
{
|
||||||
|
/* Prevent multiplication overflow */
|
||||||
|
if ((unsigned long long)ts->tv_sec >= KTIME_SEC_MAX)
|
||||||
|
return KTIME_MAX;
|
||||||
|
|
||||||
return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
|
return ((s64) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,11 +425,6 @@ static inline void debug_hrtimer_deactivate(struct hrtimer *timer)
|
|||||||
debug_object_deactivate(timer, &hrtimer_debug_descr);
|
debug_object_deactivate(timer, &hrtimer_debug_descr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void debug_hrtimer_free(struct hrtimer *timer)
|
|
||||||
{
|
|
||||||
debug_object_free(timer, &hrtimer_debug_descr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
|
static void __hrtimer_init(struct hrtimer *timer, clockid_t clock_id,
|
||||||
enum hrtimer_mode mode);
|
enum hrtimer_mode mode);
|
||||||
|
|
||||||
|
@ -172,10 +172,6 @@ static void set_cpu_itimer(struct task_struct *tsk, unsigned int clock_id,
|
|||||||
u64 oval, nval, ointerval, ninterval;
|
u64 oval, nval, ointerval, ninterval;
|
||||||
struct cpu_itimer *it = &tsk->signal->it[clock_id];
|
struct cpu_itimer *it = &tsk->signal->it[clock_id];
|
||||||
|
|
||||||
/*
|
|
||||||
* Use the to_ktime conversion because that clamps the maximum
|
|
||||||
* value to KTIME_MAX and avoid multiplication overflows.
|
|
||||||
*/
|
|
||||||
nval = timespec64_to_ns(&value->it_value);
|
nval = timespec64_to_ns(&value->it_value);
|
||||||
ninterval = timespec64_to_ns(&value->it_interval);
|
ninterval = timespec64_to_ns(&value->it_interval);
|
||||||
|
|
||||||
|
@ -68,13 +68,13 @@ static inline u64 notrace cyc_to_ns(u64 cyc, u32 mult, u32 shift)
|
|||||||
return (cyc * mult) >> shift;
|
return (cyc * mult) >> shift;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct clock_read_data *sched_clock_read_begin(unsigned int *seq)
|
notrace struct clock_read_data *sched_clock_read_begin(unsigned int *seq)
|
||||||
{
|
{
|
||||||
*seq = raw_read_seqcount_latch(&cd.seq);
|
*seq = raw_read_seqcount_latch(&cd.seq);
|
||||||
return cd.read_data + (*seq & 1);
|
return cd.read_data + (*seq & 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int sched_clock_read_retry(unsigned int seq)
|
notrace int sched_clock_read_retry(unsigned int seq)
|
||||||
{
|
{
|
||||||
return read_seqcount_latch_retry(&cd.seq, seq);
|
return read_seqcount_latch_retry(&cd.seq, seq);
|
||||||
}
|
}
|
||||||
|
@ -732,11 +732,6 @@ static inline void debug_timer_deactivate(struct timer_list *timer)
|
|||||||
debug_object_deactivate(timer, &timer_debug_descr);
|
debug_object_deactivate(timer, &timer_debug_descr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void debug_timer_free(struct timer_list *timer)
|
|
||||||
{
|
|
||||||
debug_object_free(timer, &timer_debug_descr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void debug_timer_assert_init(struct timer_list *timer)
|
static inline void debug_timer_assert_init(struct timer_list *timer)
|
||||||
{
|
{
|
||||||
debug_object_assert_init(timer, &timer_debug_descr);
|
debug_object_assert_init(timer, &timer_debug_descr);
|
||||||
|
Loading…
Reference in New Issue
Block a user