Module Name:    src
Committed By:   rmind
Date:           Sun Jan 29 19:08:26 UTC 2012

Modified Files:
        src/sys/kern: subr_kcpuset.c
        src/sys/sys: kcpuset.h

Log Message:
- Add kcpuset_isotherset() and kcpuset_countset().
- Fix KC_NFIELDS_EARLY.  Make kcpuset_isset() return bool.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/kern/subr_kcpuset.c
cvs rdiff -u -r1.3 -r1.4 src/sys/sys/kcpuset.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/subr_kcpuset.c
diff -u src/sys/kern/subr_kcpuset.c:1.3 src/sys/kern/subr_kcpuset.c:1.4
--- src/sys/kern/subr_kcpuset.c:1.3	Sun Aug  7 21:38:32 2011
+++ src/sys/kern/subr_kcpuset.c	Sun Jan 29 19:08:26 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_kcpuset.c,v 1.3 2011/08/07 21:38:32 rmind Exp $	*/
+/*	$NetBSD: subr_kcpuset.c,v 1.4 2012/01/29 19:08:26 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2011 The NetBSD Foundation, Inc.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_kcpuset.c,v 1.3 2011/08/07 21:38:32 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_kcpuset.c,v 1.4 2012/01/29 19:08:26 rmind Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -87,7 +87,7 @@ static int			kc_last_idx = 0;
 static bool			kc_initialised = false;
 
 #define	KC_BITSIZE_EARLY	sizeof(kc_bits_early[0])
-#define	KC_NFIELDS_EARLY	(KC_BITSIZE_EARLY >> KC_SHIFT)
+#define	KC_NFIELDS_EARLY	1
 
 /*
  * The size of whole bitset fields and amount of fields.
@@ -113,6 +113,7 @@ kcpuset_sysinit(void)
 	/* Set a kcpuset_t sizes. */
 	kc_nfields = (KC_MAXCPUS >> KC_SHIFT);
 	kc_bitsize = sizeof(uint32_t) * kc_nfields;
+	KASSERT(kc_nfields != 0 && kc_bitsize != 0);
 
 	kc_cache = pool_cache_init(sizeof(kcpuset_impl_t) + kc_bitsize,
 	    coherency_unit, 0, 0, "kcpuset", NULL, IPL_NONE, NULL, NULL, NULL);
@@ -232,19 +233,11 @@ kcpuset_destroy(kcpuset_t *kcp)
 }
 
 /*
- * Routines to copy or reference/unreference the CPU set.
+ * Routines to reference/unreference the CPU set.
  * Note: early boot case is not supported by these routines.
  */
 
 void
-kcpuset_copy(kcpuset_t *dkcp, kcpuset_t *skcp)
-{
-
-	KASSERT(!kc_initialised || KC_GETSTRUCT(dkcp)->kc_refcnt == 1);
-	memcpy(dkcp, skcp, kc_bitsize);
-}
-
-void
 kcpuset_use(kcpuset_t *kcp)
 {
 	kcpuset_impl_t *kc = KC_GETSTRUCT(kcp);
@@ -311,9 +304,9 @@ kcpuset_copyout(kcpuset_t *kcp, cpuset_t
 }
 
 /*
- * Routines to change bit field - zero, fill, set, unset, etc.
+ * Routines to change bit field - zero, fill, copy, set, unset, etc.
  */
- 
+
 void
 kcpuset_zero(kcpuset_t *kcp)
 {
@@ -333,6 +326,15 @@ kcpuset_fill(kcpuset_t *kcp)
 }
 
 void
+kcpuset_copy(kcpuset_t *dkcp, kcpuset_t *skcp)
+{
+
+	KASSERT(!kc_initialised || KC_GETSTRUCT(dkcp)->kc_refcnt > 0);
+	KASSERT(!kc_initialised || KC_GETSTRUCT(dkcp)->kc_next == NULL);
+	memcpy(dkcp, skcp, kc_bitsize);
+}
+
+void
 kcpuset_set(kcpuset_t *kcp, cpuid_t i)
 {
 	const size_t j = i >> KC_SHIFT;
@@ -354,7 +356,7 @@ kcpuset_clear(kcpuset_t *kcp, cpuid_t i)
 	kcp->bits[j] &= ~(1 << (i & KC_MASK));
 }
 
-int
+bool
 kcpuset_isset(kcpuset_t *kcp, cpuid_t i)
 {
 	const size_t j = i >> KC_SHIFT;
@@ -368,6 +370,21 @@ kcpuset_isset(kcpuset_t *kcp, cpuid_t i)
 }
 
 bool
+kcpuset_isotherset(kcpuset_t *kcp, cpuid_t i)
+{
+	const size_t j2 = i >> KC_SHIFT;
+	const uint32_t mask = ~(1 << (i & KC_MASK));
+
+	for (size_t j = 0; j < kc_nfields; j++) {
+		const uint32_t bits = kcp->bits[j];
+		if (bits && (j != j2 || (bits & mask) != 0)) {
+			return true;
+		}
+	}
+	return false;
+}
+
+bool
 kcpuset_iszero(kcpuset_t *kcp)
 {
 
@@ -395,6 +412,17 @@ kcpuset_merge(kcpuset_t *kcp1, kcpuset_t
 	}
 }
 
+int
+kcpuset_countset(kcpuset_t *kcp)
+{
+	int count = 0;
+
+	for (size_t j = 0; j < kc_nfields; j++) {
+		count += popcount32(kcp->bits[j]);
+	}
+	return count;
+}
+
 /*
  * Routines to set/clear the flags atomically.
  */

Index: src/sys/sys/kcpuset.h
diff -u src/sys/sys/kcpuset.h:1.3 src/sys/sys/kcpuset.h:1.4
--- src/sys/sys/kcpuset.h:1.3	Mon Aug  8 17:53:29 2011
+++ src/sys/sys/kcpuset.h	Sun Jan 29 19:08:26 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: kcpuset.h,v 1.3 2011/08/08 17:53:29 matt Exp $	*/
+/*	$NetBSD: kcpuset.h,v 1.4 2012/01/29 19:08:26 rmind Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2011 The NetBSD Foundation, Inc.
@@ -56,10 +56,12 @@ void		kcpuset_fill(kcpuset_t *);
 void		kcpuset_set(kcpuset_t *, cpuid_t);
 void		kcpuset_clear(kcpuset_t *, cpuid_t);
 
-int		kcpuset_isset(kcpuset_t *, cpuid_t);
+bool		kcpuset_isset(kcpuset_t *, cpuid_t);
+bool		kcpuset_isotherset(kcpuset_t *, cpuid_t);
 bool		kcpuset_iszero(kcpuset_t *);
 bool		kcpuset_match(const kcpuset_t *, const kcpuset_t *);
 void		kcpuset_merge(kcpuset_t *, kcpuset_t *);
+int		kcpuset_countset(kcpuset_t *);
 
 void		kcpuset_atomic_set(kcpuset_t *, cpuid_t);
 void		kcpuset_atomic_clear(kcpuset_t *, cpuid_t);

Reply via email to