mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-29 01:05:29 +00:00
- Fix a case where posix timers with a thread-group-wide target would miss
signals if some of the group's threads are exiting - Fix a hang caused by ndelay() calling the wrong delay function __udelay() - Fix a wrong offset calculation in adjtimex(2) when using ADJ_MICRO (microsecond resolution) and a negative offset -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEzv7L6UO9uDPlPSfHEsHwGGHeVUoFAmdMQ2sACgkQEsHwGGHe VUoRGBAAt8luiDBdMHIcD053RHsLr7Oocg5AI/t0PVxYxJ+89o0cSdDx2vaaXiyX +vRSkdvH5mfwvwW4XRJZkVWbzOjMiA6m7FwH667XGzEedIq4vtgs5Rd/1YStSfIx ceQfD2N+34esamxiGGBlzjNO2GdqI2XMo/Fc6LuPCTfPBqELCL8OpbEdOV8Ltwxr mRsmbCNazBtw31Yo3zp9UZIVVSAzJFmWOoK0M+xm6S91YPYaKQ9RYk2QQwLizVgR N++dniNV6yZuSLTzr4dNckrvl744Iqc4Sy8iy2CL9rNFZkb+3q5CAAQggGNlY2U9 0W95tgwpy/Qt6drfsyam3+PR5Smwjnh/0mrk3sLzUCdy9Y6L2HgKmrvHk4Rqq/66 N6uIjIDmou+L0FUcdUducRnMOgQnvfIB/l6hIAHHkDap7iL8oy74JDzzk0jnNKHw 1I5kGbKqXz0ucdxge6H1BHqCc/roobwC05/TWLPAQ5IG0BtQFPGAwd901AZtANkk /FfWUq7IT6PW05T2co7O75NjgMvU3QV0Sf5E9vkV/+R9WtTKT13FmZ8+rC6zaC7o Juml/lRWeTCyuot3vv29NtcvY6j+gy/RrKWL4iNWDlXznntR2DAhIkzRCF+1yTSb z0RSOrY2BSsk2iqeUh8ydet5OEyPiMXwiHVbxUHzJ4R/7qaxsB8= =X4bb -----END PGP SIGNATURE----- Merge tag 'timers_urgent_for_v6.13_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull timer fixes from Borislav Petkov: - Fix a case where posix timers with a thread-group-wide target would miss signals if some of the group's threads are exiting - Fix a hang caused by ndelay() calling the wrong delay function __udelay() - Fix a wrong offset calculation in adjtimex(2) when using ADJ_MICRO (microsecond resolution) and a negative offset * tag 'timers_urgent_for_v6.13_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: posix-timers: Target group sigqueue to current task only if not exiting delay: Fix ndelay() spuriously treated as udelay() ntp: Remove invalid cast in time offset math
This commit is contained in:
commit
f788b5ef1c
@ -75,11 +75,11 @@ static __always_inline void ndelay(unsigned long nsec)
|
|||||||
{
|
{
|
||||||
if (__builtin_constant_p(nsec)) {
|
if (__builtin_constant_p(nsec)) {
|
||||||
if (nsec >= DELAY_CONST_MAX)
|
if (nsec >= DELAY_CONST_MAX)
|
||||||
__bad_udelay();
|
__bad_ndelay();
|
||||||
else
|
else
|
||||||
__const_udelay(nsec * NDELAY_CONST_MULT);
|
__const_udelay(nsec * NDELAY_CONST_MULT);
|
||||||
} else {
|
} else {
|
||||||
__udelay(nsec);
|
__ndelay(nsec);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#define ndelay(x) ndelay(x)
|
#define ndelay(x) ndelay(x)
|
||||||
|
@ -1959,14 +1959,15 @@ static void posixtimer_queue_sigqueue(struct sigqueue *q, struct task_struct *t,
|
|||||||
*
|
*
|
||||||
* Where type is not PIDTYPE_PID, signals must be delivered to the
|
* Where type is not PIDTYPE_PID, signals must be delivered to the
|
||||||
* process. In this case, prefer to deliver to current if it is in
|
* process. In this case, prefer to deliver to current if it is in
|
||||||
* the same thread group as the target process, which avoids
|
* the same thread group as the target process and its sighand is
|
||||||
* unnecessarily waking up a potentially idle task.
|
* stable, which avoids unnecessarily waking up a potentially idle task.
|
||||||
*/
|
*/
|
||||||
static inline struct task_struct *posixtimer_get_target(struct k_itimer *tmr)
|
static inline struct task_struct *posixtimer_get_target(struct k_itimer *tmr)
|
||||||
{
|
{
|
||||||
struct task_struct *t = pid_task(tmr->it_pid, tmr->it_pid_type);
|
struct task_struct *t = pid_task(tmr->it_pid, tmr->it_pid_type);
|
||||||
|
|
||||||
if (t && tmr->it_pid_type != PIDTYPE_PID && same_thread_group(t, current))
|
if (t && tmr->it_pid_type != PIDTYPE_PID &&
|
||||||
|
same_thread_group(t, current) && !current->exit_state)
|
||||||
t = current;
|
t = current;
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -798,7 +798,7 @@ int __do_adjtimex(struct __kernel_timex *txc, const struct timespec64 *ts,
|
|||||||
|
|
||||||
txc->offset = shift_right(ntpdata->time_offset * NTP_INTERVAL_FREQ, NTP_SCALE_SHIFT);
|
txc->offset = shift_right(ntpdata->time_offset * NTP_INTERVAL_FREQ, NTP_SCALE_SHIFT);
|
||||||
if (!(ntpdata->time_status & STA_NANO))
|
if (!(ntpdata->time_status & STA_NANO))
|
||||||
txc->offset = (u32)txc->offset / NSEC_PER_USEC;
|
txc->offset = div_s64(txc->offset, NSEC_PER_USEC);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = ntpdata->time_state;
|
result = ntpdata->time_state;
|
||||||
|
Loading…
Reference in New Issue
Block a user