diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 104 |
1 files changed, 52 insertions, 52 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 53c0ee742f69..e642bfa61fe3 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -617,6 +617,58 @@ static inline struct rq *this_rq_lock(void) | |||
617 | return rq; | 617 | return rq; |
618 | } | 618 | } |
619 | 619 | ||
620 | /* | ||
621 | * resched_task - mark a task 'to be rescheduled now'. | ||
622 | * | ||
623 | * On UP this means the setting of the need_resched flag, on SMP it | ||
624 | * might also involve a cross-CPU call to trigger the scheduler on | ||
625 | * the target CPU. | ||
626 | */ | ||
627 | #ifdef CONFIG_SMP | ||
628 | |||
629 | #ifndef tsk_is_polling | ||
630 | #define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) | ||
631 | #endif | ||
632 | |||
633 | static void resched_task(struct task_struct *p) | ||
634 | { | ||
635 | int cpu; | ||
636 | |||
637 | assert_spin_locked(&task_rq(p)->lock); | ||
638 | |||
639 | if (unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED))) | ||
640 | return; | ||
641 | |||
642 | set_tsk_thread_flag(p, TIF_NEED_RESCHED); | ||
643 | |||
644 | cpu = task_cpu(p); | ||
645 | if (cpu == smp_processor_id()) | ||
646 | return; | ||
647 | |||
648 | /* NEED_RESCHED must be visible before we test polling */ | ||
649 | smp_mb(); | ||
650 | if (!tsk_is_polling(p)) | ||
651 | smp_send_reschedule(cpu); | ||
652 | } | ||
653 | |||
654 | static void resched_cpu(int cpu) | ||
655 | { | ||
656 | struct rq *rq = cpu_rq(cpu); | ||
657 | unsigned long flags; | ||
658 | |||
659 | if (!spin_trylock_irqsave(&rq->lock, flags)) | ||
660 | return; | ||
661 | resched_task(cpu_curr(cpu)); | ||
662 | spin_unlock_irqrestore(&rq->lock, flags); | ||
663 | } | ||
664 | #else | ||
665 | static inline void resched_task(struct task_struct *p) | ||
666 | { | ||
667 | assert_spin_locked(&task_rq(p)->lock); | ||
668 | set_tsk_need_resched(p); | ||
669 | } | ||
670 | #endif | ||
671 | |||
620 | #include "sched_stats.h" | 672 | #include "sched_stats.h" |
621 | 673 | ||
622 | /* | 674 | /* |
@@ -953,58 +1005,6 @@ static void deactivate_task(struct task_struct *p, struct rq *rq) | |||
953 | p->array = NULL; | 1005 | p->array = NULL; |
954 | } | 1006 | } |
955 | 1007 | ||
956 | /* | ||
957 | * resched_task - mark a task 'to be rescheduled now'. | ||
958 | * | ||
959 | * On UP this means the setting of the need_resched flag, on SMP it | ||
960 | * might also involve a cross-CPU call to trigger the scheduler on | ||
961 | * the target CPU. | ||
962 | */ | ||
963 | #ifdef CONFIG_SMP | ||
964 | |||
965 | #ifndef tsk_is_polling | ||
966 | #define tsk_is_polling(t) test_tsk_thread_flag(t, TIF_POLLING_NRFLAG) | ||
967 | #endif | ||
968 | |||
969 | static void resched_task(struct task_struct *p) | ||
970 | { | ||
971 | int cpu; | ||
972 | |||
973 | assert_spin_locked(&task_rq(p)->lock); | ||
974 | |||
975 | if (unlikely(test_tsk_thread_flag(p, TIF_NEED_RESCHED))) | ||
976 | return; | ||
977 | |||
978 | set_tsk_thread_flag(p, TIF_NEED_RESCHED); | ||
979 | |||
980 | cpu = task_cpu(p); | ||
981 | if (cpu == smp_processor_id()) | ||
982 | return; | ||
983 | |||
984 | /* NEED_RESCHED must be visible before we test polling */ | ||
985 | smp_mb(); | ||
986 | if (!tsk_is_polling(p)) | ||
987 | smp_send_reschedule(cpu); | ||
988 | } | ||
989 | |||
990 | static void resched_cpu(int cpu) | ||
991 | { | ||
992 | struct rq *rq = cpu_rq(cpu); | ||
993 | unsigned long flags; | ||
994 | |||
995 | if (!spin_trylock_irqsave(&rq->lock, flags)) | ||
996 | return; | ||
997 | resched_task(cpu_curr(cpu)); | ||
998 | spin_unlock_irqrestore(&rq->lock, flags); | ||
999 | } | ||
1000 | #else | ||
1001 | static inline void resched_task(struct task_struct *p) | ||
1002 | { | ||
1003 | assert_spin_locked(&task_rq(p)->lock); | ||
1004 | set_tsk_need_resched(p); | ||
1005 | } | ||
1006 | #endif | ||
1007 | |||
1008 | /** | 1008 | /** |
1009 | * task_curr - is this task currently executing on a CPU? | 1009 | * task_curr - is this task currently executing on a CPU? |
1010 | * @p: the task in question. | 1010 | * @p: the task in question. |