Re: [Patch] export sched_setscheduler() for kernel module use
From: Dean Nelson
Date: Thu Dec 09 2004 - 09:39:41 EST
On Mon, Nov 15, 2004 at 01:27:49PM -0800, Chris Wright wrote:
> * Dean Nelson (dcn@xxxxxxx) wrote:
> > On Mon, Nov 15, 2004 at 10:58:01AM -0800, Chris Wright wrote:
> > > * Dean Nelson (dcn@xxxxxxx) wrote:
> > > > +int do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
> > >
> > > this should be static.
> >
> > You're right. I made another change in that one now passes the task_struct
> > pointer to sched_setscheduler() instead of the pid. This requires that
> > the caller of sched_setscheduler() hold the tasklist_lock. The new patch
> > for people's feedback follows.
>
> This now means callers of sched_setscheduler hold tasklist_lock, also
> with irq off. I think it's safer to let the core function do that.
> It's a touchy area that's ripe for deadlock.
After some further investigation, I think I was mistaken in saying that
the caller of sched_setscheduler() must hold the tasklist_lock.
If you look at the example of sys_setpriority() and sys_nice(), both
of which call set_user_nice(), the first one does so via set_one_prio()
while holding the tasklist_lock, the second one does so while not
holding the tasklist_lock. The difference seems to be whether the caller
was operating against a task_struct located by way of pid or uid (like
calling find_task_by_pid()), which is the case for sys_setpriority(),
whereas sys_nice() operates against the current task_struct.
Now my proposed sched_setscheduler() is very similar to set_user_nice().
And sys_sched_setscheduler()/do_sched_setscheduler() is very similar to
sys_setpriority()/set_one_prio(). And the kernel module (XPC) that I'm
attempting to get accepted by the community would be analagous to
sys_nice() in that its call to sched_setscheduler() would be against
the current task.
So if there is a problem with my proposed patch in regards to the
tasklist_lock, then it would seem to me that there is a problem
with the exiting sys_setpriority(), set_one_prio(), sys_nice(),
set_user_nice() code.
Or am I missing something?
Thanks,
Dean
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/