On 09/29, Ingo Molnar wrote:
>
> * Oleg Nesterov <[email protected]> wrote:
>
> >     struct task_struct *next_task_with_mm(struct task_struct *p)
> >     {
> >             struct task_struct *t;
> >
> >             p = p->group_leader;
> >             while ((p = next_task(p)) != &init_task) {
> >                     if (p->flags & PF_KTHREAD)
> >                             continue;
> >
> >                     t = find_lock_task_mm(p);
> >                     if (t)
> >                             return t;
> >             }
> >
> >             return NULL;
> >     }
> >
> >     #define for_each_task_lock_mm(p)
> >             for (p = &init_task; (p = next_task_with_mm(p)); task_unlock(p))
> >
> >
> > So that you can do
> >
> >     for_each_task_lock_mm(p) {
> >             do_something_with(p->mm);
> >
> >             if (some_condition()) {
> >                     // UNFORTUNATELY you can't just do "break"
> >                     task_unlock(p);
> >                     break;
> >             }
> >     }
> >
> > do you think it makes sense?
>
> Sure, I'm inclined to use the above code from you.
>
> > In fact it can't be simpler, we can move task_unlock() into 
> > next_task_with_mm(),
> > it can check ->mm != NULL or p != init_task.
>
> s/can't/can ?

yes, sorry,

> But even with that I'm not sure I can parse your suggestion. Got some 
> (pseudo) code
> perhaps?

I meant

        struct task_struct *next_task_lock_mm(struct task_struct *p)
        {
                struct task_struct *t;

                if (p) {
                        task_unlock(p);
                        p = p->group_leader;
                } else {
                        p = &init_task;
                }

                while ((p = next_task(p)) != &init_task) {
                        if (p->flags & PF_KTHREAD)
                                continue;

                        t = find_lock_task_mm(p);
                        if (t)
                                return t;
                }

                return NULL;
        }

        #define for_each_task_lock_mm(p)
                for (p = NULL; (p = next_task_lock_mm(p)); )

Oleg.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to