Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'tip/sched/core' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace into sched/core

Pull a scheduler optimization commit from Steven Rostedt.

Signed-off-by: Ingo Molnar <mingo@kernel.org>

+26 -30
+26 -30
kernel/sched/rt.c
··· 1803 1803 static void set_cpus_allowed_rt(struct task_struct *p, 1804 1804 const struct cpumask *new_mask) 1805 1805 { 1806 - int weight = cpumask_weight(new_mask); 1806 + struct rq *rq; 1807 + int weight; 1807 1808 1808 1809 BUG_ON(!rt_task(p)); 1809 1810 1811 + if (!p->on_rq) 1812 + return; 1813 + 1814 + weight = cpumask_weight(new_mask); 1815 + 1810 1816 /* 1811 - * Update the migration status of the RQ if we have an RT task 1812 - * which is running AND changing its weight value. 1817 + * Only update if the process changes its state from whether it 1818 + * can migrate or not. 1813 1819 */ 1814 - if (p->on_rq && (weight != p->rt.nr_cpus_allowed)) { 1815 - struct rq *rq = task_rq(p); 1820 + if ((p->rt.nr_cpus_allowed > 1) == (weight > 1)) 1821 + return; 1816 1822 1817 - if (!task_current(rq, p)) { 1818 - /* 1819 - * Make sure we dequeue this task from the pushable list 1820 - * before going further. It will either remain off of 1821 - * the list because we are no longer pushable, or it 1822 - * will be requeued. 1823 - */ 1824 - if (p->rt.nr_cpus_allowed > 1) 1825 - dequeue_pushable_task(rq, p); 1823 + rq = task_rq(p); 1826 1824 1827 - /* 1828 - * Requeue if our weight is changing and still > 1 1829 - */ 1830 - if (weight > 1) 1831 - enqueue_pushable_task(rq, p); 1832 - 1833 - } 1834 - 1835 - if ((p->rt.nr_cpus_allowed <= 1) && (weight > 1)) { 1836 - rq->rt.rt_nr_migratory++; 1837 - } else if ((p->rt.nr_cpus_allowed > 1) && (weight <= 1)) { 1838 - BUG_ON(!rq->rt.rt_nr_migratory); 1839 - rq->rt.rt_nr_migratory--; 1840 - } 1841 - 1842 - update_rt_migration(&rq->rt); 1825 + /* 1826 + * The process used to be able to migrate OR it can now migrate 1827 + */ 1828 + if (weight <= 1) { 1829 + if (!task_current(rq, p)) 1830 + dequeue_pushable_task(rq, p); 1831 + BUG_ON(!rq->rt.rt_nr_migratory); 1832 + rq->rt.rt_nr_migratory--; 1833 + } else { 1834 + if (!task_current(rq, p)) 1835 + enqueue_pushable_task(rq, p); 1836 + rq->rt.rt_nr_migratory++; 1843 1837 } 1838 + 1839 + update_rt_migration(&rq->rt); 1844 1840 } 1845 1841 1846 1842 /* Assumes rq->lock is held */