NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/37987: sys__sched_getparam doesn't work if LWP with lid=1 exited.
"Mindaugas R." <rmind%NetBSD.org@localhost> wrote:
> > >Fix:
> > use proc_representative_lwp?
>
> Yes, it is not a good solution. But if I remember correctly, we are trying
> to avoid proc_representative_lwp(), no? I may be confused.
>
> LIST_FIRST(&p->p_lwps) was another solution I was thinking about.
"Andrew Doran" <ad%netbsd.org@localhost> wrote:
> May I suggest LIST_FIRST(&p->p_lwps)? proc_representative_lwp() is not very
> deterministic.
Are we intended to replace and remove proc_representative_lwp()?
Please review the attached patch.
--
Best regards,
Mindaugas
www.NetBSD.org
Index: sys_sched.c
===================================================================
RCS file: /cvsroot/src/sys/kern/sys_sched.c,v
retrieving revision 1.11
diff -u -p -r1.11 sys_sched.c
--- sys_sched.c 16 Feb 2008 16:39:34 -0000 1.11
+++ sys_sched.c 18 Feb 2008 01:58:37 -0000
@@ -210,35 +210,19 @@ sys__sched_getparam(struct lwp *l, const
} */
struct sched_param param;
struct lwp *t;
- lwpid_t lid;
int error, policy;
- /* If not specified, use the first LWP */
- lid = SCARG(uap, lid) == 0 ? 1 : SCARG(uap, lid);
-
- if (SCARG(uap, pid) != 0) {
- /* Locks the LWP */
- t = lwp_find2(SCARG(uap, pid), lid);
- } else {
- struct proc *p = l->l_proc;
- /* Use the calling process */
- mutex_enter(&p->p_smutex);
- t = lwp_find(p, lid);
- if (t != NULL)
- lwp_lock(t);
- mutex_exit(&p->p_smutex);
- }
- if (t == NULL) {
- error = ESRCH;
- goto error;
- }
+ /* Locks the LWP */
+ t = lwp_find2(SCARG(uap, pid), SCARG(uap, lid));
+ if (t == NULL)
+ return ESRCH;
/* Check the permission */
error = kauth_authorize_process(l->l_cred,
KAUTH_PROCESS_SCHEDULER_GETPARAM, t->l_proc, NULL, NULL, NULL);
if (error != 0) {
lwp_unlock(t);
- goto error;
+ return error;
}
param.sched_priority = t->l_priority;
@@ -257,7 +241,6 @@ sys__sched_getparam(struct lwp *l, const
error = copyout(¶m, SCARG(uap, params), sizeof(param));
if (error == 0 && SCARG(uap, policy) != NULL)
error = copyout(&policy, SCARG(uap, policy), sizeof(int));
-error:
return error;
}
@@ -375,28 +358,14 @@ sys__sched_getaffinity(struct lwp *l,
} */
struct lwp *t;
void *cpuset;
- lwpid_t lid;
int error;
if (SCARG(uap, size) <= 0)
return EINVAL;
cpuset = kmem_zalloc(sizeof(cpuset_t), KM_SLEEP);
- /* If not specified, use the first LWP */
- lid = SCARG(uap, lid) == 0 ? 1 : SCARG(uap, lid);
-
- if (SCARG(uap, pid) != 0) {
- /* Locks the LWP */
- t = lwp_find2(SCARG(uap, pid), lid);
- } else {
- struct proc *p = l->l_proc;
- /* Use the calling process */
- mutex_enter(&p->p_smutex);
- t = lwp_find(p, lid);
- if (t != NULL)
- lwp_lock(t);
- mutex_exit(&p->p_smutex);
- }
+ /* Locks the LWP */
+ t = lwp_find2(SCARG(uap, pid), SCARG(uap, lid));
if (t == NULL) {
kmem_free(cpuset, sizeof(cpuset_t));
return ESRCH;
Index: kern_lwp.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_lwp.c,v
retrieving revision 1.93
diff -u -p -r1.93 kern_lwp.c
--- kern_lwp.c 28 Jan 2008 12:23:42 -0000 1.93
+++ kern_lwp.c 18 Feb 2008 01:58:42 -0000
@@ -1097,7 +1097,8 @@ lwp_migrate(lwp_t *l, struct cpu_info *c
}
/*
- * Find the LWP in the process.
+ * Find the LWP in the process. Arguments may be zero, in such case,
+ * the calling process and first LWP in the list will be used.
* On success - returns LWP locked.
*/
struct lwp *
@@ -1107,14 +1108,17 @@ lwp_find2(pid_t pid, lwpid_t lid)
lwp_t *l;
/* Find the process */
- p = p_find(pid, PFIND_UNLOCK_FAIL);
+ p = (pid == 0) ? curlwp->l_proc : p_find(pid, PFIND_UNLOCK_FAIL);
if (p == NULL)
return NULL;
mutex_enter(&p->p_smutex);
- mutex_exit(&proclist_lock);
+ if (pid != 0) {
+ /* Case of p_find */
+ mutex_exit(&proclist_lock);
+ }
/* Find the thread */
- l = lwp_find(p, lid);
+ l = (lid == 0) ? LIST_FIRST(&p->p_lwps) : lwp_find(p, lid);
if (l != NULL)
lwp_lock(l);
mutex_exit(&p->p_smutex);
Home |
Main Index |
Thread Index |
Old Index