Patch "delayacct: Account blkio completion on the correct task" has been added to the 4.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
delayacct: Account blkio completion on the correct task
to the 4.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
delayacct-account-blkio-completion-on-the-correct-task.patch
and it can be found in the queue-4.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c96f5471ce7d2aefd0dda560cc23f08ab00bc65dMon Sep 17 00:00:00 2001
From: Josh Snyder <[email protected]>
Date: Mon, 18 Dec 2017 16:15:10 +0000
Subject: delayacct: Account blkio completion on the correct task
From: Josh Snyder <[email protected]>
commit c96f5471ce7d2aefd0dda560cc23f08ab00bc65d upstream.
Before commit:
e33a9bba85a8 ("sched/core: move IO scheduling accounting from io_schedule_timeout() into scheduler")
delayacct_blkio_end() was called after context-switching into the task which completed I/O.
This resulted in double counting: the task would account a delay both waiting for I/O and for time spent in the runqueue.
With e33a9bba85a8, delayacct_blkio_end() is called by try_to_wake_up(). In ttwu, we have not yet context-switched. This is more correct, in that the delay accounting ends when the I/O is complete.
But delayacct_blkio_end() relies on 'get_current()', and we have not yet context-switched into the task whose I/O completed. This results in the wrong task having its delay accounting statistics updated.
Instead of doing that, pass the task_struct being woken to delayacct_blkio_end(), so that it can update the statistics of the correct task.
--- include/linux/delayacct.h | 8 ++++---- kernel/delayacct.c | 42 ++++++++++++++++++++++++++---------------- kernel/sched/core.c | 6 +++--- 3 files changed, 33 insertions(+), 23 deletions(-)
include/linux/delayacct.h +4 -4
@@ -71,7 +71,7 @@ extern void delayacct_init(void);extern void __delayacct_tsk_init (struct task_struct *);extern void __delayacct_tsk_exit (struct task_struct *);extern void __delayacct_blkio_start (void ); -extern void __delayacct_blkio_end (void ); +extern void __delayacct_blkio_end (struct task_struct *);extern int __delayacct_add_tsk (struct taskstats *,struct task_struct *);extern __u64 __delayacct_blkio_ticks (struct task_struct *);extern void __delayacct_freepages_start (void );
@@ -122,10 +122,10 @@ static inline void delayacct_blkio_start__delayacct_blkio_start (); } -static inline void delayacct_blkio_end (void ) +static inline void delayacct_blkio_end (struct task_struct *p) {if (current->delays) -__delayacct_blkio_end (); +__delayacct_blkio_end (p);delayacct_clear_flag (DELAYACCT_PF_BLKIO ); }
@@ -169,7 +169,7 @@ static inline void delayacct_tsk_free(st {}static inline void delayacct_blkio_start (void ) {} -static inline void delayacct_blkio_end (void ) +static inline void delayacct_blkio_end (struct task_struct *p) {}static inline int delayacct_add_tsk (struct taskstats *d,struct task_struct *tsk)
kernel/delayacct.c +26 -16
67 lines not on this page · raw message
kernel/sched/core.c +3 -3
@@ -2046,7 +2046,7 @@ try_to_wake_up(struct task_struct *p, un p->state =TASK_WAKING ;if (p->in_iowait) { -delayacct_blkio_end (); +delayacct_blkio_end (p);atomic_dec (&task_rq (p)->nr_iowait); }
@@ -2059,7 +2059,7 @@ try_to_wake_up(struct task_struct *p, un#else /* CONFIG_SMP */ if (p->in_iowait) { -delayacct_blkio_end (); +delayacct_blkio_end (p);atomic_dec (&task_rq (p)->nr_iowait); }
@@ -2112,7 +2112,7 @@ static void try_to_wake_up_local(structif (!task_on_rq_queued (p)) {if (p->in_iowait) { -delayacct_blkio_end (); +delayacct_blkio_end (p);atomic_dec (&rq->nr_iowait); }ttwu_activate (rq, p,ENQUEUE_WAKEUP |ENQUEUE_NOCLOCK );
Patches currently in stable-queue which might be from [email protected] are
queue-4.14/delayacct-account-blkio-completion-on-the-correct-task.patch