History

Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull scheduler fix from Ingo Molnar: "A delayacct statistics correctness fix" * 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: delayacct: Account blkio completion on the correct task

Linus Torvalds committed 8 years ago

Commit 9a4ba2a2 parents 7dfda84 c96f5473 files · +33 −23Browse files

Unified · Split

3 files
  1. include/linux/delayacct.h +4 −4
  2. kernel/delayacct.c +26 −16
  3. kernel/sched/core.c +3 −3
include/linux/delayacct.h+4−4
@@ -71,7 +71,7 @@ extern void delayacct_init(void); · 70 unmodified lines
71extern void __delayacct_tsk_init(struct task_struct *);71extern void __delayacct_tsk_init(struct task_struct *);
72extern void __delayacct_tsk_exit(struct task_struct *);72extern void __delayacct_tsk_exit(struct task_struct *);
73extern void __delayacct_blkio_start(void);73extern void __delayacct_blkio_start(void);
74extern void __delayacct_blkio_end(void);74extern void __delayacct_blkio_end(struct task_struct *);
75extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);75extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
76extern __u64 __delayacct_blkio_ticks(struct task_struct *);76extern __u64 __delayacct_blkio_ticks(struct task_struct *);
77extern void __delayacct_freepages_start(void);77extern void __delayacct_freepages_start(void);
@@ -122,10 +122,10 @@ static inline void delayacct_blkio_start(void) · 44 unmodified lines
122 __delayacct_blkio_start();122 __delayacct_blkio_start();
123}123}
124 124
125static inline void delayacct_blkio_end(void)125static inline void delayacct_blkio_end(struct task_struct *p)
126{126{
127 if (current->delays)127 if (current->delays)
128 __delayacct_blkio_end();128 __delayacct_blkio_end(p);
129 delayacct_clear_flag(DELAYACCT_PF_BLKIO);129 delayacct_clear_flag(DELAYACCT_PF_BLKIO);
130}130}
131 131
@@ -169,7 +169,7 @@ static inline void delayacct_tsk_free(struct task_struct *tsk) · 37 unmodified lines
169{}169{}
170static inline void delayacct_blkio_start(void)170static inline void delayacct_blkio_start(void)
171{}171{}
172static inline void delayacct_blkio_end(void)172static inline void delayacct_blkio_end(struct task_struct *p)
173{}173{}
174static inline int delayacct_add_tsk(struct taskstats *d,174static inline int delayacct_add_tsk(struct taskstats *d,
175 struct task_struct *tsk)175 struct task_struct *tsk)
kernel/delayacct.c+26−16
@@ -51,16 +51,16 @@ void __delayacct_tsk_init(struct task_struct *tsk) · 50 unmodified lines
51 * Finish delay accounting for a statistic using its timestamps (@start),51 * Finish delay accounting for a statistic using its timestamps (@start),
52 * accumalator (@total) and @count52 * accumalator (@total) and @count
53 */53 */
54static void delayacct_end(u64 *start, u64 *total, u32 *count)54static void delayacct_end(spinlock_t *lock, u64 *start, u64 *total, u32 *count)
55{55{
56 s64 ns = ktime_get_ns() - *start;56 s64 ns = ktime_get_ns() - *start;
57 unsigned long flags;57 unsigned long flags;
58 58
59 if (ns > 0) {59 if (ns > 0) {
60 spin_lock_irqsave(&current->delays->lock, flags);60 spin_lock_irqsave(lock, flags);
61 *total += ns;61 *total += ns;
62 (*count)++;62 (*count)++;
63 spin_unlock_irqrestore(&current->delays->lock, flags);63 spin_unlock_irqrestore(lock, flags);
64 }64 }
65}65}
66 66
@@ -69,17 +69,25 @@ void __delayacct_blkio_start(void) · 2 unmodified lines
69 current->delays->blkio_start = ktime_get_ns();69 current->delays->blkio_start = ktime_get_ns();
70}70}
71 71
72void __delayacct_blkio_end(void)72/*
73 * We cannot rely on the `current` macro, as we haven't yet switched back to
74 * the process being woken.
75 */
76void __delayacct_blkio_end(struct task_struct *p)
73{77{
74 if (current->delays->flags & DELAYACCT_PF_SWAPIN)78 struct task_delay_info *delays = p->delays;
75 /* Swapin block I/O */79 u64 *total;
76 delayacct_end(&current->delays->blkio_start,80 u32 *count;
77 &current->delays->swapin_delay,81
78 &current->delays->swapin_count);82 if (p->delays->flags & DELAYACCT_PF_SWAPIN) {
79 else /* Other block I/O */83 total = &delays->swapin_delay;
80 delayacct_end(&current->delays->blkio_start,84 count = &delays->swapin_count;
81 &current->delays->blkio_delay,85 } else {
82 &current->delays->blkio_count);86 total = &delays->blkio_delay;
87 count = &delays->blkio_count;
88 }
89
90 delayacct_end(&delays->lock, &delays->blkio_start, total, count);
83}91}
84 92
85int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)93int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
@@ -153,8 +161,10 @@ void __delayacct_freepages_start(void) · 67 unmodified lines
153 161
154void __delayacct_freepages_end(void)162void __delayacct_freepages_end(void)
155{163{
156 delayacct_end(&current->delays->freepages_start,164 delayacct_end(
157 &current->delays->freepages_delay,165 &current->delays->lock,
158 &current->delays->freepages_count);166 &current->delays->freepages_start,
167 &current->delays->freepages_delay,
168 &current->delays->freepages_count);
159}169}
160 170
kernel/sched/core.c+3−3
@@ -2056,7 +2056,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 2055 unmodified lines
2056 p->state = TASK_WAKING;2056 p->state = TASK_WAKING;
2057 2057
2058 if (p->in_iowait) {2058 if (p->in_iowait) {
2059 delayacct_blkio_end();2059 delayacct_blkio_end(p);
2060 atomic_dec(&task_rq(p)->nr_iowait);2060 atomic_dec(&task_rq(p)->nr_iowait);
2061 }2061 }
2062 2062
@@ -2069,7 +2069,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 6 unmodified lines
2069#else /* CONFIG_SMP */2069#else /* CONFIG_SMP */
2070 2070
2071 if (p->in_iowait) {2071 if (p->in_iowait) {
2072 delayacct_blkio_end();2072 delayacct_blkio_end(p);
2073 atomic_dec(&task_rq(p)->nr_iowait);2073 atomic_dec(&task_rq(p)->nr_iowait);
2074 }2074 }
2075 2075
@@ -2122,7 +2122,7 @@ static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf) · 46 unmodified lines
2122 2122
2123 if (!task_on_rq_queued(p)) {2123 if (!task_on_rq_queued(p)) {
2124 if (p->in_iowait) {2124 if (p->in_iowait) {
2125 delayacct_blkio_end();2125 delayacct_blkio_end(p);
2126 atomic_dec(&rq->nr_iowait);2126 atomic_dec(&rq->nr_iowait);
2127 }2127 }
2128 ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK);2128 ttwu_activate(rq, p, ENQUEUE_WAKEUP | ENQUEUE_NOCLOCK);

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t