Module Name:    src
Committed By:   ad
Date:           Thu Nov 21 17:54:04 UTC 2019

Modified Files:
        src/sys/kern: sys_pset.c
        src/sys/sys: pset.h

Log Message:
Simplify pset locking, making it easier to sync with LWP creation, etc.


To generate a diff of this commit:
cvs rdiff -u -r1.21 -r1.22 src/sys/kern/sys_pset.c
cvs rdiff -u -r1.6 -r1.7 src/sys/sys/pset.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/sys_pset.c
diff -u src/sys/kern/sys_pset.c:1.21 src/sys/kern/sys_pset.c:1.22
--- src/sys/kern/sys_pset.c:1.21	Sun Dec  9 23:05:02 2018
+++ src/sys/kern/sys_pset.c	Thu Nov 21 17:54:04 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_pset.c,v 1.21 2018/12/09 23:05:02 mlelstv Exp $	*/
+/*	$NetBSD: sys_pset.c,v 1.22 2019/11/21 17:54:04 ad Exp $	*/
 
 /*
  * Copyright (c) 2008, Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_pset.c,v 1.21 2018/12/09 23:05:02 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_pset.c,v 1.22 2019/11/21 17:54:04 ad Exp $");
 
 #include <sys/param.h>
 
@@ -156,8 +156,6 @@ psid_validate(psetid_t psid, bool chkps)
 		return EINVAL;
 	if (psets[psid - 1] == NULL)
 		return EINVAL;
-	if (psets[psid - 1]->ps_flags & PSET_BUSY)
-		return EBUSY;
 
 	return 0;
 }
@@ -204,7 +202,6 @@ static int
 kern_pset_destroy(psetid_t psid)
 {
 	struct cpu_info *ci;
-	pset_info_t *pi;
 	struct lwp *l;
 	CPU_INFO_ITERATOR cii;
 	int error;
@@ -229,10 +226,6 @@ kern_pset_destroy(psetid_t psid)
 			continue;
 		spc->spc_psid = PS_NONE;
 	}
-	/* Mark that processor-set is going to be destroyed */
-	pi = psets[psid - 1];
-	pi->ps_flags |= PSET_BUSY;
-	mutex_exit(&cpu_lock);
 
 	/* Unmark the processor-set ID from each thread */
 	mutex_enter(proc_lock);
@@ -245,12 +238,11 @@ kern_pset_destroy(psetid_t psid)
 	mutex_exit(proc_lock);
 
 	/* Destroy the processor-set */
-	mutex_enter(&cpu_lock);
+	kmem_free(psets[psid - 1], sizeof(pset_info_t));
 	psets[psid - 1] = NULL;
 	psets_count--;
 	mutex_exit(&cpu_lock);
 
-	kmem_free(pi, sizeof(pset_info_t));
 	return 0;
 }
 
@@ -452,9 +444,6 @@ sys__pset_bind(struct lwp *l, const stru
 	}
 	if (psid == PS_MYID)
 		psid = curlwp->l_psid;
-	if (psid != PS_QUERY && psid != PS_NONE)
-		psets[psid - 1]->ps_flags |= PSET_BUSY;
-	mutex_exit(&cpu_lock);
 
 	/*
 	 * Get PID and LID from the ID.
@@ -463,6 +452,7 @@ sys__pset_bind(struct lwp *l, const stru
 	id1 = SCARG(uap, first_id);
 	id2 = SCARG(uap, second_id);
 
+	mutex_enter(proc_lock);
 	switch (SCARG(uap, idtype)) {
 	case P_PID:
 		/*
@@ -493,19 +483,13 @@ sys__pset_bind(struct lwp *l, const stru
 	}
 
 	/* Find the process */
-	mutex_enter(proc_lock);
 	p = proc_find(pid);
 	if (p == NULL) {
-		mutex_exit(proc_lock);
 		error = ESRCH;
 		goto error;
 	}
-	mutex_enter(p->p_lock);
-	mutex_exit(proc_lock);
-
 	/* Disallow modification of the system processes */
 	if (p->p_flag & PK_SYSTEM) {
-		mutex_exit(p->p_lock);
 		error = EPERM;
 		goto error;
 	}
@@ -513,6 +497,7 @@ sys__pset_bind(struct lwp *l, const stru
 	/* Find the LWP(s) */
 	lcnt = 0;
 	ci = NULL;
+	mutex_enter(p->p_lock);
 	LIST_FOREACH(t, &p->p_lwps, l_sibling) {
 		if (lid && lid != t->l_lid)
 			continue;
@@ -531,16 +516,12 @@ sys__pset_bind(struct lwp *l, const stru
 	mutex_exit(p->p_lock);
 	if (lcnt == 0) {
 		error = ESRCH;
-		goto error;
 	}
-	if (SCARG(uap, opsid))
-		error = copyout(&opsid, SCARG(uap, opsid), sizeof(psetid_t));
 error:
-	if (psid != PS_QUERY && psid != PS_NONE) {
-		mutex_enter(&cpu_lock);
-		psets[psid - 1]->ps_flags &= ~PSET_BUSY;
-		mutex_exit(&cpu_lock);
-	}
+	mutex_exit(proc_lock);
+	mutex_exit(&cpu_lock);
+	if (error == 0 && SCARG(uap, opsid))
+		error = copyout(&opsid, SCARG(uap, opsid), sizeof(psetid_t));
 	return error;
 }
 

Index: src/sys/sys/pset.h
diff -u src/sys/sys/pset.h:1.6 src/sys/sys/pset.h:1.7
--- src/sys/sys/pset.h:1.6	Mon May 28 21:05:02 2018
+++ src/sys/sys/pset.h	Thu Nov 21 17:54:04 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: pset.h,v 1.6 2018/05/28 21:05:02 chs Exp $	*/
+/*	$NetBSD: pset.h,v 1.7 2019/11/21 17:54:04 ad Exp $	*/
 
 /*
  * Copyright (c) 2008, Mindaugas Rasiukevicius <rmind at NetBSD org>
@@ -57,9 +57,6 @@ typedef struct {
 	int		ps_flags;
 } pset_info_t;
 
-/* Flags */
-#define	PSET_BUSY	0x01
-
 void	psets_init(void);
 
 #endif	/* _KERNEL */

Reply via email to