cos its not resizing the allocation, its allocating them for new cpus.
the same goes for counters_realloc being named counters_alloc_ncpus.
this adds doco for them too.
ok?
Index: share/man/man9/counters_alloc.9
===================================================================
RCS file: /cvs/src/share/man/man9/counters_alloc.9,v
retrieving revision 1.2
diff -u -p -r1.2 counters_alloc.9
--- share/man/man9/counters_alloc.9 21 Oct 2016 12:39:13 -0000 1.2
+++ share/man/man9/counters_alloc.9 24 Oct 2016 04:43:33 -0000
@@ -20,6 +20,9 @@
.Sh NAME
.Nm counters_alloc ,
.Nm counters_free ,
+.Nm COUNTERS_BOOT_MEMORY ,
+.Nm COUNTERS_BOOT_INITIALIZER ,
+.Nm counters_alloc_ncpus ,
.Nm counters_enter ,
.Nm counters_leave ,
.Nm counters_read ,
@@ -31,6 +34,14 @@
.Fn counters_alloc "unsigned int ncounters" "int type"
.Ft void
.Fn counters_free "struct cpumem *cm" "unsigned int ncounters" "int type"
+.Fn COUNTERS_BOOT_MEMORY "NAME" "unsigned int ncounters"
+.Fn COUNTERS_BOOT_INITIALIZER "NAME"
+.Ft struct cpumemt *
+.Fo counters_alloc_ncpus
+.Fa "struct cpumem *cm"
+.Fa "unsigned int ncounters"
+.Fa "int type"
+.Fc
.Ft uint64_t *
.Fn counters_enter "struct counters_ref *ref" "struct cpumem *cm"
.Ft void
@@ -84,6 +95,60 @@ arguments type originally provided to
must be passed to
.Fn counters_free .
.Pp
+If a set of per CPU counters needs to be usable as soon as the
+kernel is booted, instead of after devices (which includes CPUs)
+are attached, a cpumem pointer and counters for the boot CPU may be
+statically allocated.
+.Pp
+.Fn COUNTERS_BOOT_MEMORY
+allocates counters for use by the boot CPU in the kernel and before
+the other CPUs are attached and run.
+The allocation is identified by
+.Fa NAME ,
+and provides memory for the number of counters specified by
+.Fa ncounters .
+.Pp
+.Pp
+.Fn COUNTERS_BOOT_INITIALIZER
+is used to initialise a cpumem pointer with the memory that was previously
+allocated using
+.Fn COUNTERS_BOOT_MEMORY
+and identified by
+.Fa NAME .
+.Pp
+.Fn counters_alloc_ncpus
+allocates additional per CPU counters for the CPUs that were attached
+during boot to the cpumem structure
+.Fa cm
+that was previously allocated statically using
+.Fn COUNTERS_BOOT_MEMORY
+and initialised with
+.Fn COUNTERS_BOOT_INITIALIZER .
+.Fn counters_alloc_ncpus
+allocates space for a number of counters specified by
+.Fa ncounters .
+The
+.Fa type
+argument specifies the type of memory that the counters will be
+allocated as via
+.Xr malloc 9 .
+The memory will be zeroed on allocation by passing
+.Fn M_ZERO
+to
+.Xr malloc 9 .
+The same number of counters originally passed to
+.Fa COUNTERS_BOOT_MEMORY
+must be specified by
+.Fa ncounters .
+.Pp
+Counters that have been allocated with
+.Fn COUNTERS_BOOT_MEMORY
+and
+.Fn counters_alloc_ncpus
+cannot be deallocated with
+.Fa counters_free .
+Any attempt to do so will lead to undefined behaviour.
+.Pp
.Fn counters_enter
provides access to the current CPU's set of counters referenced by
.Fa cm .
@@ -119,6 +184,7 @@ up to the caller to serialise this call
.Sh CONTEXT
.Fn counters_alloc ,
.Fn counters_free ,
+.Fn counters_alloc_ncpus ,
and
.Fn counters_read
may be called during autoconf, or from process context.
@@ -136,7 +202,9 @@ It is up to the caller to provide approp
around calls to these functions to prevent concurrent access to the
relevant data structures.
.Sh RETURN VALUES
-.Fn counters_get
+.Fn counters_alloc
+and
+.Fn counters_alloc_ncpus
will return an opaque cpumem pointer that references each CPU's
set of counters.
.Pp
Index: share/man/man9/cpumem_get.9
===================================================================
RCS file: /cvs/src/share/man/man9/cpumem_get.9,v
retrieving revision 1.5
diff -u -p -r1.5 cpumem_get.9
--- share/man/man9/cpumem_get.9 21 Oct 2016 15:00:30 -0000 1.5
+++ share/man/man9/cpumem_get.9 24 Oct 2016 04:43:33 -0000
@@ -21,7 +21,10 @@
.Nm cpumem_get ,
.Nm cpumem_put ,
.Nm cpumem_malloc ,
+.Nm cpumem_malloc_ncpus ,
.Nm cpumem_free ,
+.Nm CPUMEM_BOOT_MEMORY ,
+.Nm CPUMEM_BOOT_INITIALIZER ,
.Nm cpumem_enter ,
.Nm cpumem_leave ,
.Nm cpumem_first ,
@@ -37,6 +40,10 @@
.Fn cpumem_malloc "size_t sz" "int type"
.Ft void
.Fn cpumem_free "struct cpumem *cm" "int type" "size_t sz"
+.Fn CPUMEM_BOOT_MEMORY "NAME" "size_t sz"
+.Fn CPUMEM_BOOT_INITIALIZER "NAME"
+.Ft struct cpumem *
+.Fn cpumem_malloc_ncpus "struct cpumem *cm" "size_t sz" "int type"
.Ft void *
.Fn cpumem_enter "struct cpumem *cm"
.Ft void
@@ -100,6 +107,59 @@ must be specified by
and
.Fa type
respectively.
+.Pp
+If a per CPU memory allocation needs to be usable as soon as the
+kernel is booted, instead of after devices (which includes CPUs)
+are attached, a cpumem pointer and memory for the boot CPU may be
+statically allocated.
+.Pp
+.Fn CPUMEM_BOOT_MEMORY
+allocates memory for use by the boot CPU in the kernel and before
+the other CPUs are attached and run. The allocation is identified
+by
+.Fn NAME ,
+and provides
+.Fn sz
+bytes as the boot CPUs memory allocation.
+.Pp
+.Fn CPUMEM_BOOT_INITIALIZER
+is used to initialise a cpumem pointer with the memory that was previously
+allocated using
+.Fn CPUMEM_BOOT_MEMORY
+and identified by
+.Fa NAME .
+.Pp
+.Fn cpumem_malloc_ncpus
+allocates additional per CPU memory for the additional CPUs that
+were attached by the kernel during boot to the cpumem structure
+.Fa cm
+that was previously allocated statically using
+.Fn CPUMEM_BOOT_MEMORY and
+initialized with
+.Fn CPUMEM_BOOT_INITIALIZER .
+.Fn cpumem_malloc_ncpus
+allocates
+.Fa sz
+bytes of
+.Fa type
+memory for each additional CPU using
+.Xr malloc 9 .
+The memory will be zeroed on allocation by passing
+.Fn M_ZERO
+to
+.Xr malloc 9 .
+The same object size originally passed to
+.Fa CPUMEM_BOOT_MEMORY
+must be specified by
+.Fa sz .
+.Pp
+Memory that has been allocated with
+.Fn CPUMEM_BOOT_MEMORY
+and
+.Fn cpumem_malloc_ncpus
+cannot be deallocated with
+.Fa cpumem_free .
+Any attempt to do so will lead to undefined behaviour.
.Ss Per CPU Memory Access
.Fn cpumem_enter
provides access to the current CPU's memory allocation referenced by
@@ -136,8 +196,9 @@ to each CPU's allocation in turn.
.Fn cpumem_get ,
.Fn cpumem_put ,
.Fn cpumem_malloc ,
+.Fn cpumem_free ,
and
-.Fn cpumem_free
+.Fn cpumem_malloc_ncpus
may be called during autoconf, or from process context.
.Pp
.Fn cpumem_enter ,
@@ -154,9 +215,10 @@ It is up to the caller to provide approp
around calls to these functions to prevent concurrent access to the
relevant data structures.
.Sh RETURN VALUES
-.Fn cpumem_get
+.Fn cpumem_get ,
+.Fn cpumem_malloc ,
and
-.Fn cpumem_malloc
+.Fn cpumem_malloc_ncpus
will return an opaque cpumem pointer that references each CPU's
memory allocation.
.Pp
Index: sys/kern/subr_percpu.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_percpu.c,v
retrieving revision 1.3
diff -u -p -r1.3 subr_percpu.c
--- sys/kern/subr_percpu.c 24 Oct 2016 03:15:38 -0000 1.3
+++ sys/kern/subr_percpu.c 24 Oct 2016 04:43:34 -0000
@@ -76,7 +76,7 @@ cpumem_malloc(size_t sz, int type)
}
struct cpumem *
-cpumem_realloc(struct cpumem *bootcm, size_t sz, int type)
+cpumem_alloc_ncpus(struct cpumem *bootcm, size_t sz, int type)
{
struct cpumem *cm;
unsigned int cpu;
@@ -146,10 +146,10 @@ counters_alloc(unsigned int n, int type)
}
struct cpumem *
-counters_realloc(struct cpumem *cm, unsigned int n, int type)
+counters_alloc_ncpus(struct cpumem *cm, unsigned int n, int type)
{
n++; /* the generation number */
- return (cpumem_realloc(cm, n * sizeof(uint64_t), type));
+ return (cpumem_alloc_ncpus(cm, n * sizeof(uint64_t), type));
}
void
@@ -259,7 +259,7 @@ cpumem_malloc(size_t sz, int type)
}
struct cpumem *
-cpumem_realloc(struct cpumem *cm, size_t sz, int type)
+cpumem_alloc_ncpus(struct cpumem *cm, size_t sz, int type)
{
return (cm);
}
@@ -291,10 +291,10 @@ counters_alloc(unsigned int n, int type)
}
struct cpumem *
-counters_realloc(struct cpumem *cm, unsigned int n, int type)
+counters_alloc_ncpus(struct cpumem *cm, unsigned int n, int type)
{
/* this is unecessary, but symmetrical */
- return (cpumem_realloc(cm, n * sizeof(uint64_t), type));
+ return (cpumem_alloc_ncpus(cm, n * sizeof(uint64_t), type));
}
void
Index: sys/kern/uipc_mbuf.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_mbuf.c,v
retrieving revision 1.234
diff -u -p -r1.234 uipc_mbuf.c
--- sys/kern/uipc_mbuf.c 24 Oct 2016 04:38:44 -0000 1.234
+++ sys/kern/uipc_mbuf.c 24 Oct 2016 04:43:34 -0000
@@ -178,7 +178,7 @@ mbinit(void)
void
mbcpuinit()
{
- mbstat = counters_realloc(mbstat, MBSTAT_COUNT, M_DEVBUF);
+ mbstat = counters_alloc_ncpus(mbstat, MBSTAT_COUNT, M_DEVBUF);
}
void
Index: sys/sys/percpu.h
===================================================================
RCS file: /cvs/src/sys/sys/percpu.h,v
retrieving revision 1.2
diff -u -p -r1.2 percpu.h
--- sys/sys/percpu.h 24 Oct 2016 03:15:35 -0000 1.2
+++ sys/sys/percpu.h 24 Oct 2016 04:43:34 -0000
@@ -54,7 +54,7 @@ struct cpumem *cpumem_get(struct pool *)
void cpumem_put(struct pool *, struct cpumem *);
struct cpumem *cpumem_malloc(size_t, int);
-struct cpumem *cpumem_realloc(struct cpumem *, size_t, int);
+struct cpumem *cpumem_malloc_ncpus(struct cpumem *, size_t, int);
void cpumem_free(struct cpumem *, int, size_t);
void *cpumem_first(struct cpumem_iter *, struct cpumem *);
@@ -111,7 +111,7 @@ static struct {
\
*/
struct cpumem *counters_alloc(unsigned int, int);
-struct cpumem *counters_realloc(struct cpumem *, unsigned int, int);
+struct cpumem *counters_alloc_ncpus(struct cpumem *, unsigned int, int);
void counters_free(struct cpumem *, int, unsigned int);
void counters_read(struct cpumem *, uint64_t *, unsigned int);
void counters_zero(struct cpumem *, unsigned int);