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. |
