svn commit: r205266 - head/sys/vm

Bjoern A. Zeeb bz at FreeBSD.org
Thu Mar 18 09:35:07 UTC 2010


On Wed, 17 Mar 2010, Kip Macy wrote:

> Author: kmacy
> Date: Wed Mar 17 21:18:28 2010
> New Revision: 205266
> URL: http://svn.freebsd.org/changeset/base/205266
>
> Log:
>  Cache line align various structures and move volatile counters to
>  not share a cache line with (mostly) immutable state
>
>  Reviewed by:	jeff@
>  MFC after:	7 days


I think that this would require a rebuild of some user space parts
query uma statistics and in general, though we try to hide everything
with accessor functions, there might be modules directly accessing
uma_zone_t * fileds.  I think this at least needs an entry in
UPDATING, if not a __FreeBSD_version bump.




> Modified:
>  head/sys/vm/uma_int.h
>
> Modified: head/sys/vm/uma_int.h
> ==============================================================================
> --- head/sys/vm/uma_int.h	Wed Mar 17 21:11:48 2010	(r205265)
> +++ head/sys/vm/uma_int.h	Wed Mar 17 21:18:28 2010	(r205266)
> @@ -160,6 +160,11 @@ struct uma_hash {
> };
>
> /*
> + * align field or structure to cache line
> + */
> +#define UMA_ALIGN		__aligned(CACHE_LINE_SIZE)
> +
> +/*
>  * Structures for per cpu queues.
>  */
>
> @@ -168,7 +173,7 @@ struct uma_bucket {
> 	int16_t	ub_cnt;				/* Count of free items. */
> 	int16_t	ub_entries;			/* Max items. */
> 	void	*ub_bucket[];			/* actual allocation storage */
> -};
> +} UMA_ALIGN;
>
> typedef struct uma_bucket * uma_bucket_t;
>
> @@ -177,7 +182,7 @@ struct uma_cache {
> 	uma_bucket_t	uc_allocbucket;	/* Bucket to allocate from */
> 	u_int64_t	uc_allocs;	/* Count of allocations */
> 	u_int64_t	uc_frees;	/* Count of frees */
> -};
> +} UMA_ALIGN;
>
> typedef struct uma_cache * uma_cache_t;
>
> @@ -312,11 +317,12 @@ struct uma_zone {
> 	uma_init	uz_init;	/* Initializer for each item */
> 	uma_fini	uz_fini;	/* Discards memory */
>
> -	u_int64_t	uz_allocs;	/* Total number of allocations */
> -	u_int64_t	uz_frees;	/* Total number of frees */
> -	u_int64_t	uz_fails;	/* Total number of alloc failures */
> 	u_int32_t	uz_flags;	/* Flags inherited from kegs */
> 	u_int32_t	uz_size;	/* Size inherited from kegs */
> +
> +	u_int64_t	uz_allocs UMA_ALIGN; /* Total number of allocations */
> +	u_int64_t	uz_frees;	/* Total number of frees */
> +	u_int64_t	uz_fails;	/* Total number of alloc failures */
> 	uint16_t	uz_fills;	/* Outstanding bucket fills */
> 	uint16_t	uz_count;	/* Highest value ub_ptr can have */
>
> @@ -324,7 +330,7 @@ struct uma_zone {
> 	 * This HAS to be the last item because we adjust the zone size
> 	 * based on NCPU and then allocate the space for the zones.
> 	 */
> -	struct uma_cache	uz_cpu[1];	/* Per cpu caches */
> +	struct uma_cache	uz_cpu[1] UMA_ALIGN; /* Per cpu caches */
> };
>
> /*
> @@ -341,6 +347,8 @@ struct uma_zone {
> #define	UMA_ZFLAG_INHERIT	(UMA_ZFLAG_INTERNAL | UMA_ZFLAG_CACHEONLY | \
> 				    UMA_ZFLAG_BUCKET)
>
> +#undef UMA_ALIGN
> +
> #ifdef _KERNEL
> /* Internal prototypes */
> static __inline uma_slab_t hash_sfind(struct uma_hash *hash, u_int8_t *data);
>

-- 
Bjoern A. Zeeb         It will not break if you know what you are doing.


More information about the svn-src-head mailing list