Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 339081
b: refs/heads/master
c: fa5058f
h: refs/heads/master
i:
  339079: 68f3ac8
v: v3
  • Loading branch information
Frederic Weisbecker committed Oct 29, 2012
1 parent eb82fc2 commit fb408cd
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: b080935c8638e08134629d0a9ebdf35669bec14d
refs/heads/master: fa5058f3b63153e0147ef65bcdb3a4ee63581346
4 changes: 2 additions & 2 deletions trunk/include/linux/hardirq.h
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ extern void rcu_nmi_exit(void);
*/
#define __irq_enter() \
do { \
vtime_account(current); \
vtime_account_irq_enter(current); \
add_preempt_count(HARDIRQ_OFFSET); \
trace_hardirq_enter(); \
} while (0)
Expand All @@ -169,7 +169,7 @@ extern void irq_enter(void);
#define __irq_exit() \
do { \
trace_hardirq_exit(); \
vtime_account(current); \
vtime_account_irq_exit(current); \
sub_preempt_count(HARDIRQ_OFFSET); \
} while (0)

Expand Down
25 changes: 25 additions & 0 deletions trunk/include/linux/vtime.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,29 @@ static inline void vtime_account(struct task_struct *tsk)
extern void vtime_account(struct task_struct *tsk);
#endif

static inline void vtime_account_irq_enter(struct task_struct *tsk)
{
/*
* Hardirq can interrupt idle task anytime. So we need vtime_account()
* that performs the idle check in CONFIG_VIRT_CPU_ACCOUNTING.
* Softirq can also interrupt idle task directly if it calls
* local_bh_enable(). Such case probably don't exist but we never know.
* Ksoftirqd is not concerned because idle time is flushed on context
* switch. Softirqs in the end of hardirqs are also not a problem because
* the idle time is flushed on hardirq time already.
*/
vtime_account(tsk);
}

static inline void vtime_account_irq_exit(struct task_struct *tsk)
{
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
/* On hard|softirq exit we always account to hard|softirq cputime */
__vtime_account_system(tsk);
#endif
#ifdef CONFIG_IRQ_TIME_ACCOUNTING
vtime_account(tsk);
#endif
}

#endif /* _LINUX_KERNEL_VTIME_H */
6 changes: 3 additions & 3 deletions trunk/kernel/softirq.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ asmlinkage void __do_softirq(void)
current->flags &= ~PF_MEMALLOC;

pending = local_softirq_pending();
vtime_account(current);
vtime_account_irq_enter(current);

__local_bh_disable((unsigned long)__builtin_return_address(0),
SOFTIRQ_OFFSET);
Expand Down Expand Up @@ -272,7 +272,7 @@ asmlinkage void __do_softirq(void)

lockdep_softirq_exit();

vtime_account(current);
vtime_account_irq_exit(current);
__local_bh_enable(SOFTIRQ_OFFSET);
tsk_restore_flags(current, old_flags, PF_MEMALLOC);
}
Expand Down Expand Up @@ -341,7 +341,7 @@ static inline void invoke_softirq(void)
*/
void irq_exit(void)
{
vtime_account(current);
vtime_account_irq_exit(current);
trace_hardirq_exit();
sub_preempt_count(IRQ_EXIT_OFFSET);
if (!in_interrupt() && local_softirq_pending())
Expand Down

0 comments on commit fb408cd

Please sign in to comment.