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
7171 extern void __delayacct_tsk_init(struct task_struct *);
7272 extern void __delayacct_tsk_exit(struct task_struct *);
7373 extern void __delayacct_blkio_start(void);
74−extern void __delayacct_blkio_end(void);
74+extern void __delayacct_blkio_end(struct task_struct *);
7575 extern int __delayacct_add_tsk(struct taskstats *, struct task_struct *);
7676 extern __u64 __delayacct_blkio_ticks(struct task_struct *);
7777 extern void __delayacct_freepages_start(void);
@@ -122,10 +122,10 @@ static inline void delayacct_blkio_start(void) · 44 unmodified lines
122122 __delayacct_blkio_start();
123123 }
124124
125−static inline void delayacct_blkio_end(void)
125+static inline void delayacct_blkio_end(struct task_struct *p)
126126 {
127127 if (current->delays)
128− __delayacct_blkio_end();
128+ __delayacct_blkio_end(p);
129129 delayacct_clear_flag(DELAYACCT_PF_BLKIO);
130130 }
131131
@@ -169,7 +169,7 @@ static inline void delayacct_tsk_free(struct task_struct *tsk) · 37 unmodified lines
169169 {}
170170 static inline void delayacct_blkio_start(void)
171171 {}
172−static inline void delayacct_blkio_end(void)
172+static inline void delayacct_blkio_end(struct task_struct *p)
173173 {}
174174 static inline int delayacct_add_tsk(struct taskstats *d,
175175 struct task_struct *tsk)
kernel/delayacct.c+26−16
@@ -51,16 +51,16 @@ void __delayacct_tsk_init(struct task_struct *tsk) · 50 unmodified lines
5151 * Finish delay accounting for a statistic using its timestamps (@start),
5252 * accumalator (@total) and @count
5353 */
54−static void delayacct_end(u64 *start, u64 *total, u32 *count)
54+static void delayacct_end(spinlock_t *lock, u64 *start, u64 *total, u32 *count)
5555 {
5656 s64 ns = ktime_get_ns() - *start;
5757 unsigned long flags;
5858
5959 if (ns > 0) {
60− spin_lock_irqsave(&current->delays->lock, flags);
60+ spin_lock_irqsave(lock, flags);
6161 *total += ns;
6262 (*count)++;
63− spin_unlock_irqrestore(&current->delays->lock, flags);
63+ spin_unlock_irqrestore(lock, flags);
6464 }
6565 }
6666
@@ -69,17 +69,25 @@ void __delayacct_blkio_start(void) · 2 unmodified lines
6969 current->delays->blkio_start = ktime_get_ns();
7070 }
7171
72−void __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+ */
76+void __delayacct_blkio_end(struct task_struct *p)
7377 {
74− if (current->delays->flags & DELAYACCT_PF_SWAPIN)
75− /* Swapin block I/O */
76− delayacct_end(&current->delays->blkio_start,
77− &current->delays->swapin_delay,
78− &current->delays->swapin_count);
79− else /* Other block I/O */
80− delayacct_end(&current->delays->blkio_start,
81− &current->delays->blkio_delay,
82− &current->delays->blkio_count);
78+ struct task_delay_info *delays = p->delays;
79+ u64 *total;
80+ u32 *count;
81+
82+ if (p->delays->flags & DELAYACCT_PF_SWAPIN) {
83+ total = &delays->swapin_delay;
84+ count = &delays->swapin_count;
85+ } else {
86+ total = &delays->blkio_delay;
87+ count = &delays->blkio_count;
88+ }
89+
90+ delayacct_end(&delays->lock, &delays->blkio_start, total, count);
8391 }
8492
8593 int __delayacct_add_tsk(struct taskstats *d, struct task_struct *tsk)
@@ -153,8 +161,10 @@ void __delayacct_freepages_start(void) · 67 unmodified lines
153161
154162 void __delayacct_freepages_end(void)
155163 {
156− delayacct_end(&current->delays->freepages_start,
157− &current->delays->freepages_delay,
158− &current->delays->freepages_count);
164+ delayacct_end(
165+ &current->delays->lock,
166+ &current->delays->freepages_start,
167+ &current->delays->freepages_delay,
168+ &current->delays->freepages_count);
159169 }
160170
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
20562056 p->state = TASK_WAKING;
20572057
20582058 if (p->in_iowait) {
2059− delayacct_blkio_end();
2059+ delayacct_blkio_end(p);
20602060 atomic_dec(&task_rq(p)->nr_iowait);
20612061 }
20622062
@@ -2069,7 +2069,7 @@ try_to_wake_up(struct task_struct *p, unsigned int state, int wake_flags) · 6 unmodified lines
20692069 #else /* CONFIG_SMP */
20702070
20712071 if (p->in_iowait) {
2072− delayacct_blkio_end();
2072+ delayacct_blkio_end(p);
20732073 atomic_dec(&task_rq(p)->nr_iowait);
20742074 }
20752075
@@ -2122,7 +2122,7 @@ static void try_to_wake_up_local(struct task_struct *p, struct rq_flags *rf) · 46 unmodified lines
21222122
21232123 if (!task_on_rq_queued(p)) {
21242124 if (p->in_iowait) {
2125− delayacct_blkio_end();
2125+ delayacct_blkio_end(p);
21262126 atomic_dec(&rq->nr_iowait);
21272127 }
21282128 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