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);