Module Name: src Committed By: matt Date: Wed Jul 17 22:36:26 UTC 2013
Modified Files: src/share/man/man9: kcpuset.9 src/sys/kern: subr_kcpuset.c src/sys/sys: kcpuset.h Log Message: Some constification. Add kcpuset_clone, kcpuset_insersection, kcpuset_remove, kcpuset_ffs, kcpuset_ffs_intersecting, kcpuset_atomicly_merge, kcpuset_atomicly_intersect, kcpuset_atomicly_remove To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/share/man/man9/kcpuset.9 cvs rdiff -u -r1.8 -r1.9 src/sys/kern/subr_kcpuset.c cvs rdiff -u -r1.8 -r1.9 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/share/man/man9/kcpuset.9 diff -u src/share/man/man9/kcpuset.9:1.5 src/share/man/man9/kcpuset.9:1.6 --- src/share/man/man9/kcpuset.9:1.5 Sun Jan 27 15:21:38 2013 +++ src/share/man/man9/kcpuset.9 Wed Jul 17 22:36:26 2013 @@ -1,4 +1,4 @@ -.\" $NetBSD: kcpuset.9,v 1.5 2013/01/27 15:21:38 pgoyette Exp $ */ +.\" $NetBSD: kcpuset.9,v 1.6 2013/07/17 22:36:26 matt Exp $ */ .\" .\" Copyright (c) 2011 Jukka Ruohonen <jruohonen.iki.fi> .\" All rights reserved. @@ -32,6 +32,7 @@ .Nm kcpuset , .Nm kcpuset_create , .Nm kcpuset_destroy , +.Nm kcpuset_clone , .Nm kcpuset_copy , .Nm kcpuset_use , .Nm kcpuset_unuse , @@ -45,10 +46,17 @@ .Nm kcpuset_isotherset , .Nm kcpuset_iszero , .Nm kcpuset_match , +.Nm kcpuset_intersect , .Nm kcpuset_merge , +.Nm kcpuset_remove , +.Nm kcpuset_ffs , +.Nm kcpuset_ffs_intersecting , .Nm kcpuset_countset , .Nm kcpuset_atomic_set , -.Nm kcpuset_atomic_clear +.Nm kcpuset_atomic_clear , +.Nm kcpuset_atomicly_intersect , +.Nm kcpuset_atomicly_merge , +.Nm kcpuset_atomicly_remove , .Nm kcpuset_export_32 .Nd dynamic kernel CPU sets .Sh SYNOPSIS @@ -58,7 +66,9 @@ .Ft void .Fn kcpuset_destroy "kcpuset_t *kcp" .Ft void -.Fn kcpuset_copy "kcpuset_t *dkcp" "kcpuset_t *skcp" +.Fn kcpuset_clone "kcpuset_t **retkcp" "const kcpuset_t *skcp" +.Ft void +.Fn kcpuset_copy "kcpuset_t *dkcp" "const kcpuset_t *skcp" .Ft void .Fn kcpuset_use "kcpuset_t *kcp" .Ft void @@ -76,22 +86,38 @@ .Ft void .Fn kcpuset_clear "kcpuset_t *kcp" "cpuid_t cpu" .Ft bool -.Fn kcpuset_isset "kcpuset_t * kcp" "cpuid_t cpu" +.Fn kcpuset_isset "const kcpuset_t * kcp" "cpuid_t cpu" +.Ft bool +.Fn kcpuset_isotherset "const kcpuset_t * kcp" "cpuid_t cpu" .Ft bool -.Fn kcpuset_isotherset "kcpuset_t * kcp" "cpuid_t cpu" +.Fn kcpuset_iszero "const kcpuset_t *kcp" .Ft bool -.Fn kcpuset_iszero "kcpuset_t *kcp" +.Fn kcpuset_intersecting_p "const kcpuset_t *kcp1" "const kcpuset_t *kcp2" .Ft bool .Fn kcpuset_match "const kcpuset_t *kcp1" "const kcpuset_t *kcp2" .Ft void -.Fn kcpuset_merge "kcpuset_t *kcp1" "kcpuset_t *kcp2" +.Fn kcpuset_intersect "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft void +.Fn kcpuset_merge "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft void +.Fn kcpuset_remove "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft cpuid_t +.Fn kcpuset_ffs "const kcpuset_t *kcp" +.Ft cpuid_t +.Fn kcpuset_ffs_intersecting "const kcpuset_t *kcp1" "const kcpuset_t *kcp2" .Ft int -.Fn kcpuset_countset "kcpuset_t *kcp1" +.Fn kcpuset_countset "const kcpuset_t *kcp" .Ft void .Fn kcpuset_atomic_set "kcpuset_t *kcp" "cpuid_t cpu" .Ft void .Fn kcpuset_atomic_clear "kcpuset_t *kcp" "cpuid_t cpu" .Ft void +.Fn kcpuset_atomicly_intersect "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft void +.Fn kcpuset_atomicly_merge "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft void +.Fn kcpuset_atomicly_remove "kcpuset_t *kcp1" "const kcpuset_t *kcp2" +.Ft void .Fn kcpuset_export_u32 "const kcpuset_t *kcp" "uint32_t *bitfield" "size_t len" .Sh DESCRIPTION The machine-independent @@ -127,6 +153,18 @@ set pointed by .Fa skcp to .Fa dkcp . +.It Fn kcpuset_clone "retkcp" "skcp" +Creates a dynamic +.Tn CPU +set and stores the result to +.Fa retkcp +and copies the +.Tn CPU +set pointed by +.Fa skcp +to the new +.Tn CPU +set. .It Fn kcpuset_use "kcp" Marks .Fa kcp @@ -210,11 +248,42 @@ Compares the sets and .Fa kcp2 , returning true if these are identical. +.It Fn kcpuset_intersect "kcp1" "kcp2" +Removes any +.Tn CPU +not set in +.Fa kcp2 +from the set +.Fa kcp1 . .It Fn kcpuset_merge "kcp1" "kcp2" Merges the set .Fa kcp2 to the set .Fa kcp1 . +.It Fn kcpuset_remove "kcp1" "kcp2" +Removes any +.Tn CPU +present in +.Fa kcp2 +from the set +.Fa kcp1 . +.It Fn kcpuset_ffs "kcp" +Returns the lowest numbered +.Ft cpu +present in +.Fa kcp +plus 1. If +.Fa kcp +is empty, a value of 0 is returned . +.Fa kcp +.It Fn kcpuset_ffs_intersecting "kcp1" "kcp2" +Returns the lowest numbered +.Ft cpu +present in the intersection of +.Fa kcp1 +and +.Fa kcp2 +plus 1. If the intersection is empty, a value of 0 is returned . .It Fn kcpuset_countset "kcp" Counts how many CPUs are in the set .Fa kcp . @@ -234,6 +303,30 @@ from the set .Fa kcp atomically. +.It Fn kcpuset_atomicly_intersect "kcp1" "kcp2" +The +.Fn kcpuset_atomicly_intersect +function operates as +.Fn kcpuset_intersect , +but the operation is performed using atomic operations; see +.Xr atomic_ops 3 +for more details. +.It Fn kcpuset_atomicly_merge "kcp1" "kcp2" +The +.Fn kcpuset_atomicly_merge +function operates as +.Fn kcpuset_merge , +but the operation is performed using atomic operations; see +.Xr atomic_ops 3 +for more details. +.It Fn kcpuset_atomicly_remove "kcp1" "kcp2" +The +.Fn kcpuset_atomicly_remove +function operates as +.Fn kcpuset_remove , +but the operation is performed using atomic operations; see +.Xr atomic_ops 3 +for more details. .It Fn kcpuset_export_u32 "kcp" "bitfield" "len" Exports the CPU set .Fa kcp Index: src/sys/kern/subr_kcpuset.c diff -u src/sys/kern/subr_kcpuset.c:1.8 src/sys/kern/subr_kcpuset.c:1.9 --- src/sys/kern/subr_kcpuset.c:1.8 Sun Sep 16 22:09:33 2012 +++ src/sys/kern/subr_kcpuset.c Wed Jul 17 22:36:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_kcpuset.c,v 1.8 2012/09/16 22:09:33 rmind Exp $ */ +/* $NetBSD: subr_kcpuset.c,v 1.9 2013/07/17 22:36:26 matt 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.8 2012/09/16 22:09:33 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_kcpuset.c,v 1.9 2013/07/17 22:36:26 matt Exp $"); #include <sys/param.h> #include <sys/types.h> @@ -72,6 +72,7 @@ typedef struct kcpuset_impl { #define KC_BITS_OFF (offsetof(struct kcpuset_impl, kc_field)) #define KC_GETSTRUCT(b) ((kcpuset_impl_t *)((char *)(b) - KC_BITS_OFF)) +#define KC_GETCSTRUCT(b) ((const kcpuset_impl_t *)((const char *)(b) - KC_BITS_OFF)) /* Sizes of a single bitset. */ #define KC_SHIFT 5 @@ -218,6 +219,13 @@ kcpuset_create(kcpuset_t **retkcp, bool } void +kcpuset_clone(kcpuset_t **retkcp, const kcpuset_t *kcp) +{ + kcpuset_create(retkcp, false); + memcpy(*retkcp, kcp, kc_bitsize); +} + +void kcpuset_destroy(kcpuset_t *kcp) { kcpuset_impl_t *kc; @@ -333,7 +341,7 @@ kcpuset_fill(kcpuset_t *kcp) } void -kcpuset_copy(kcpuset_t *dkcp, kcpuset_t *skcp) +kcpuset_copy(kcpuset_t *dkcp, const kcpuset_t *skcp) { KASSERT(!kc_initialised || KC_GETSTRUCT(dkcp)->kc_refcnt > 0); @@ -357,27 +365,27 @@ kcpuset_clear(kcpuset_t *kcp, cpuid_t i) { const size_t j = i >> KC_SHIFT; - KASSERT(!kc_initialised || KC_GETSTRUCT(kcp)->kc_next == NULL); + KASSERT(!kc_initialised || KC_GETCSTRUCT(kcp)->kc_next == NULL); KASSERT(j < kc_nfields); kcp->bits[j] &= ~(1 << (i & KC_MASK)); } bool -kcpuset_isset(kcpuset_t *kcp, cpuid_t i) +kcpuset_isset(const kcpuset_t *kcp, cpuid_t i) { const size_t j = i >> KC_SHIFT; KASSERT(kcp != NULL); - KASSERT(!kc_initialised || KC_GETSTRUCT(kcp)->kc_refcnt > 0); - KASSERT(!kc_initialised || KC_GETSTRUCT(kcp)->kc_next == NULL); + KASSERT(!kc_initialised || KC_GETCSTRUCT(kcp)->kc_refcnt > 0); + KASSERT(!kc_initialised || KC_GETCSTRUCT(kcp)->kc_next == NULL); KASSERT(j < kc_nfields); return ((1 << (i & KC_MASK)) & kcp->bits[j]) != 0; } bool -kcpuset_isotherset(kcpuset_t *kcp, cpuid_t i) +kcpuset_isotherset(const kcpuset_t *kcp, cpuid_t i) { const size_t j2 = i >> KC_SHIFT; const uint32_t mask = ~(1 << (i & KC_MASK)); @@ -392,7 +400,7 @@ kcpuset_isotherset(kcpuset_t *kcp, cpuid } bool -kcpuset_iszero(kcpuset_t *kcp) +kcpuset_iszero(const kcpuset_t *kcp) { for (size_t j = 0; j < kc_nfields; j++) { @@ -410,8 +418,42 @@ kcpuset_match(const kcpuset_t *kcp1, con return memcmp(kcp1, kcp2, kc_bitsize) == 0; } +bool +kcpuset_intersecting_p(const kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + if (kcp1->bits[j] & kcp2->bits[j]) + return true; + } + return false; +} + +cpuid_t +kcpuset_ffs(const kcpuset_t *kcp) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + if (kcp->bits[j]) + return 32 * j + ffs(kcp->bits[j]); + } + return 0; +} + +cpuid_t +kcpuset_ffs_intersecting(const kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + uint32_t bits = kcp1->bits[j] & kcp2->bits[j]; + if (bits) + return 32 * j + ffs(bits); + } + return 0; +} + void -kcpuset_merge(kcpuset_t *kcp1, kcpuset_t *kcp2) +kcpuset_merge(kcpuset_t *kcp1, const kcpuset_t *kcp2) { for (size_t j = 0; j < kc_nfields; j++) { @@ -420,7 +462,7 @@ kcpuset_merge(kcpuset_t *kcp1, kcpuset_t } void -kcpuset_intersect(kcpuset_t *kcp1, kcpuset_t *kcp2) +kcpuset_intersect(kcpuset_t *kcp1, const kcpuset_t *kcp2) { for (size_t j = 0; j < kc_nfields; j++) { @@ -428,6 +470,15 @@ kcpuset_intersect(kcpuset_t *kcp1, kcpus } } +void +kcpuset_remove(kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + kcp1->bits[j] &= ~kcp2->bits[j]; + } +} + int kcpuset_countset(kcpuset_t *kcp) { @@ -460,3 +511,33 @@ kcpuset_atomic_clear(kcpuset_t *kcp, cpu KASSERT(j < kc_nfields); atomic_and_32(&kcp->bits[j], ~(1 << (i & KC_MASK))); } + +void +kcpuset_atomicly_intersect(kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + if (kcp2->bits[j]) + atomic_and_32(&kcp1->bits[j], kcp2->bits[j]); + } +} + +void +kcpuset_atomicly_merge(kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + if (kcp2->bits[j]) + atomic_or_32(&kcp1->bits[j], kcp2->bits[j]); + } +} + +void +kcpuset_atomicly_remove(kcpuset_t *kcp1, const kcpuset_t *kcp2) +{ + + for (size_t j = 0; j < kc_nfields; j++) { + if (kcp2->bits[j]) + atomic_and_32(&kcp1->bits[j], ~kcp2->bits[j]); + } +} Index: src/sys/sys/kcpuset.h diff -u src/sys/sys/kcpuset.h:1.8 src/sys/sys/kcpuset.h:1.9 --- src/sys/sys/kcpuset.h:1.8 Sun Sep 16 22:09:33 2012 +++ src/sys/sys/kcpuset.h Wed Jul 17 22:36:26 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: kcpuset.h,v 1.8 2012/09/16 22:09:33 rmind Exp $ */ +/* $NetBSD: kcpuset.h,v 1.9 2013/07/17 22:36:26 matt Exp $ */ /*- * Copyright (c) 2008, 2011 The NetBSD Foundation, Inc. @@ -42,8 +42,9 @@ typedef struct kcpuset kcpuset_t; void kcpuset_sysinit(void); void kcpuset_create(kcpuset_t **, bool); +void kcpuset_clone(kcpuset_t **, const kcpuset_t *); void kcpuset_destroy(kcpuset_t *); -void kcpuset_copy(kcpuset_t *, kcpuset_t *); +void kcpuset_copy(kcpuset_t *, const kcpuset_t *); void kcpuset_use(kcpuset_t *); void kcpuset_unuse(kcpuset_t *, kcpuset_t **); @@ -56,17 +57,27 @@ void kcpuset_fill(kcpuset_t *); void kcpuset_set(kcpuset_t *, cpuid_t); void kcpuset_clear(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_isset(const kcpuset_t *, cpuid_t); +bool kcpuset_isotherset(const kcpuset_t *, cpuid_t); +bool kcpuset_iszero(const kcpuset_t *); +bool kcpuset_intersecting_p(const kcpuset_t *, const kcpuset_t *); bool kcpuset_match(const kcpuset_t *, const kcpuset_t *); -void kcpuset_merge(kcpuset_t *, kcpuset_t *); -void kcpuset_intersect(kcpuset_t *, kcpuset_t *); +void kcpuset_intersect(kcpuset_t *, const kcpuset_t *); +void kcpuset_merge(kcpuset_t *, const kcpuset_t *); +void kcpuset_remove(kcpuset_t *, const kcpuset_t *); int kcpuset_countset(kcpuset_t *); +cpuid_t kcpuset_ffs(const kcpuset_t *); +cpuid_t kcpuset_ffs_intersecting(const kcpuset_t *, const kcpuset_t *); + void kcpuset_atomic_set(kcpuset_t *, cpuid_t); void kcpuset_atomic_clear(kcpuset_t *, cpuid_t); +void kcpuset_atomicly_zero(kcpuset_t *); +void kcpuset_atomicly_intersect(kcpuset_t *, const kcpuset_t *); +void kcpuset_atomicly_merge(kcpuset_t *, const kcpuset_t *); +void kcpuset_atomicly_remove(kcpuset_t *, const kcpuset_t *); + void kcpuset_export_u32(const kcpuset_t *, uint32_t *, size_t); #endif