svn commit: r272925 - head/sys/kern

John Baldwin jhb at freebsd.org
Sat Oct 11 11:44:49 UTC 2014


On Saturday, October 11, 2014 02:02:59 AM Marcel Moolenaar wrote:
> Author: marcel
> Date: Sat Oct 11 02:02:58 2014
> New Revision: 272925
> URL: https://svnweb.freebsd.org/changeset/base/272925
> 
> Log:
>   Turn WITNESS_COUNT into a tunable and sysctl. This allows adjusting
>   the value without recompiling the kernel.  This is useful when
>   recompiling is not possible as an immediate solution. When we run out
>   of witness objects, witness is completely disabled. Not having an
>   immediate solution can therefore be problematic.
> 
>   Submitted by:	Sreekanth Rupavatharam <rupavath at juniper.net>
>   Obtained from:	Juniper Networks, Inc.

Thanks, just a few nits:

> Modified:
>   head/sys/kern/subr_witness.c
> 
> @@ -416,6 +414,13 @@ int	witness_skipspin = 0;
>  #endif
>  SYSCTL_INT(_debug_witness, OID_AUTO, skipspin, CTLFLAG_RDTUN,
> &witness_skipspin, 0, "");
> 
> +/* tunable for Witness count */
> +int witness_count = WITNESS_COUNT;
> +int badstack_sbuf_size = WITNESS_COUNT * 256;

This assignment isn't needed (it always gets overwritten).  Also, style-wise,
FreeBSD code tends to group a SYSCTL with its variable.  The comment also
just duplicates the code.

> +
> +SYSCTL_INT(_debug_witness, OID_AUTO, witness_count, CTLFLAG_RDTUN,
> +    &witness_count, 0, "");
> +
>  /*
>   * Call this to print out the relations between locks.
>   */
> @@ -450,7 +455,7 @@ SYSCTL_INT(_debug_witness, OID_AUTO, sle
>      "");
> 
>  static struct witness *w_data;
> -static uint8_t w_rmatrix[WITNESS_COUNT+1][WITNESS_COUNT+1];
> +static uint8_t **w_rmatrix;
>  static struct lock_list_entry w_locklistdata[LOCK_CHILDCOUNT];
>  static struct witness_hash w_hash;	/* The witness hash table. */
> 
> @@ -726,9 +731,18 @@ witness_initialize(void *dummy __unused)
>  	struct witness *w, *w1;
>  	int i;
> 
> -	w_data = malloc(sizeof (struct witness) * WITNESS_COUNT, M_WITNESS,
> +	w_data = malloc(sizeof (struct witness) * witness_count, M_WITNESS,
>  	    M_NOWAIT | M_ZERO);
> 
> +	w_rmatrix = malloc(sizeof(uint8_t *) * (witness_count+1),
> +	    M_WITNESS, M_NOWAIT | M_ZERO);
> +
> +	for(i = 0; i < witness_count+1; i++) {

Please use a space after 'for' and around '+' in 'witness_count + 1' (you do
Below).

> +		w_rmatrix[i] = malloc(sizeof(uint8_t) * (witness_count + 1),
> +		    M_WITNESS, M_NOWAIT | M_ZERO);

The malloc of w_rmatrix() used M_NOWAIT, but you didn't check its return
Value, so this will fault.  Either check the return value or use M_WAITOK.

> +	}
> +	badstack_sbuf_size = witness_count * 256;
> +
>  	/*
>  	 * We have to release Giant before initializing its witness
>  	 * structure so that WITNESS doesn't get confused.
> @@ -739,7 +753,7 @@ witness_initialize(void *dummy __unused)
>  	CTR1(KTR_WITNESS, "%s: initializing witness", __func__);
>  	mtx_init(&w_mtx, "witness lock", NULL, MTX_SPIN | MTX_QUIET |
>  	    MTX_NOWITNESS | MTX_NOPROFILE);
> -	for (i = WITNESS_COUNT - 1; i >= 0; i--) {
> +	for (i = witness_count - 1; i >= 0; i--) {
>  		w = &w_data[i];
>  		memset(w, 0, sizeof(*w));
>  		w_data[i].w_index = i;	/* Witness index never changes. */
> @@ -752,8 +766,10 @@ witness_initialize(void *dummy __unused)
>  	STAILQ_REMOVE_HEAD(&w_free, w_list);
>  	w_free_cnt--;
> 
> -	memset(w_rmatrix, 0,
> -	    (sizeof(**w_rmatrix) * (WITNESS_COUNT+1) * (WITNESS_COUNT+1)));
> +	for(i = 0; i < witness_count; i++) {
> +		memset(w_rmatrix[i], 0, sizeof(uint8_t) *
> +		    (witness_count + 1));
> +	}

More 'space after for'.  Also, 'sizeof(*w_rmatrix[i])' would more closely
match the old code.  Using 'sizeof(uint8_t)' means you still have to fix
this if you change the base matrix type later.

-- 
John Baldwin


More information about the svn-src-head mailing list