mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
softirq: defer softirq processing to ksoftirqd if CPU is busy with RT
Defer the softirq processing to ksoftirqd if a RT task is running or queued on the current CPU. This complements the RT task placement algorithm which tries to find a CPU that is not currently busy with softirqs. Currently NET_TX, NET_RX, BLOCK and TASKLET softirqs are only deferred as they can potentially run for long time. Change-Id: Id7665244af6bbd5a96d9e591cf26154e9eaa860c Signed-off-by: Pavankumar Kondeti <[email protected]> [[email protected]: trivial merge conflict resolution.] Signed-off-by: Satya Durga Srinivasu Prabhala <[email protected]>
This commit is contained in:
parent
68efde1ad1
commit
db6940d546
3 changed files with 20 additions and 1 deletions
|
|
@ -253,6 +253,8 @@ static inline bool lockdep_softirq_start(void) { return false; }
|
|||
static inline void lockdep_softirq_end(bool in_hardirq) { }
|
||||
#endif
|
||||
|
||||
#define long_softirq_pending() (local_softirq_pending() & LONG_SOFTIRQ_MASK)
|
||||
#define defer_for_rt() (long_softirq_pending() && cpupri_check_rt())
|
||||
asmlinkage __visible void __softirq_entry __do_softirq(void)
|
||||
{
|
||||
unsigned long end = jiffies + MAX_SOFTIRQ_TIME;
|
||||
|
|
@ -317,6 +319,7 @@ restart:
|
|||
pending = local_softirq_pending();
|
||||
if (pending) {
|
||||
if (time_before(jiffies, end) && !need_resched() &&
|
||||
!defer_for_rt() &&
|
||||
--max_restart)
|
||||
goto restart;
|
||||
|
||||
|
|
@ -372,7 +375,7 @@ static inline void invoke_softirq(void)
|
|||
if (ksoftirqd_running(local_softirq_pending()))
|
||||
return;
|
||||
|
||||
if (!force_irqthreads) {
|
||||
if (!force_irqthreads && !defer_for_rt()) {
|
||||
#ifdef CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK
|
||||
/*
|
||||
* We can safely execute softirq on the current stack if
|
||||
|
|
|
|||
Loading…
Reference in a new issue