*/
 static DEFINE_MUTEX(rt_constraints_mutex);
 
-/* Must be called with tasklist_lock held */
 static inline int tg_has_rt_tasks(struct task_group *tg)
 {
-       struct task_struct *g, *p;
+       struct task_struct *task;
+       struct css_task_iter it;
+       int ret = 0;
 
        /*
         * Autogroups do not have RT tasks; see autogroup_create().
        if (task_group_is_autogroup(tg))
                return 0;
 
-       for_each_process_thread(g, p) {
-               if (rt_task(p) && task_group(p) == tg)
-                       return 1;
-       }
+       css_task_iter_start(&tg->css, 0, &it);
+       while (!ret && (task = css_task_iter_next(&it)))
+               ret |= rt_task(task);
+       css_task_iter_end(&it);
 
-       return 0;
+       return ret;
 }
 
 struct rt_schedulable_data {
                return -EINVAL;
 
        /*
-        * Ensure we don't starve existing RT tasks.
+        * Ensure we don't starve existing RT tasks if runtime turns zero.
         */
-       if (rt_bandwidth_enabled() && !runtime && tg_has_rt_tasks(tg))
+       if (rt_bandwidth_enabled() && !runtime &&
+           tg->rt_bandwidth.rt_runtime && tg_has_rt_tasks(tg))
                return -EBUSY;
 
        total = to_ratio(period, runtime);
                return -EINVAL;
 
        mutex_lock(&rt_constraints_mutex);
-       read_lock(&tasklist_lock);
        err = __rt_schedulable(tg, rt_period, rt_runtime);
        if (err)
                goto unlock;
        }
        raw_spin_unlock_irq(&tg->rt_bandwidth.rt_runtime_lock);
 unlock:
-       read_unlock(&tasklist_lock);
        mutex_unlock(&rt_constraints_mutex);
 
        return err;
        int ret = 0;
 
        mutex_lock(&rt_constraints_mutex);
-       read_lock(&tasklist_lock);
        ret = __rt_schedulable(NULL, 0, 0);
-       read_unlock(&tasklist_lock);
        mutex_unlock(&rt_constraints_mutex);
 
        return ret;