mirror of
https://github.com/opnsense/src.git
synced 2026-03-22 10:50:09 -04:00
only constraint that they have a lock cookie named mtx_lock. This name, then, becames reserved from the struct that wants to use the mtx(9) KPI and other locking primitives cannot reuse it for their members. Namely such structs are the current struct mtx and the new struct mtx_padalign. The new structure will define an object which is the same as the same layout of a struct mtx but will be allocated in areas aligned to the cache line size and will be as big as a cache line. This is supposed to give higher performance for highly contented mutexes both spin or sleep (because of the adaptive spinning), where the cache line contention results in too much traffic on the system bus. The struct mtx_padalign can be used in a completely transparent way with the mtx(9) KPI. At the moment, a possibility to MFC the patch should be carefully evaluated because this patch breaks the low level KPI (not its representation though). Discussed with: jhb Reviewed by: jeff, andre Reviewed by: mdf (earlier version) Tested by: jimharris
64 lines
2.7 KiB
C
64 lines
2.7 KiB
C
/*-
|
|
* Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Berkeley Software Design Inc's name may not be used to endorse or
|
|
* promote products derived from this software without specific prior
|
|
* written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN INC ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN INC BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
#ifndef _SYS__MUTEX_H_
|
|
#define _SYS__MUTEX_H_
|
|
|
|
#include <machine/param.h>
|
|
|
|
/*
|
|
* Sleep/spin mutex.
|
|
*
|
|
* The layout of the first 2 members of struct mtx* is considered fixed.
|
|
* More specifically, it is assumed that there is a member called mtx_lock
|
|
* for every struct mtx* and that other locking primitive structures are
|
|
* not allowed to use such name for their members.
|
|
* If this needs to change, the bits in the mutex implementation might be
|
|
* modified appropriately.
|
|
*/
|
|
struct mtx {
|
|
struct lock_object lock_object; /* Common lock properties. */
|
|
volatile uintptr_t mtx_lock; /* Owner and flags. */
|
|
};
|
|
|
|
/*
|
|
* Members of struct mtx_padalign must mirror members of struct mtx.
|
|
* mtx_padalign mutexes can use mtx(9) KPI transparently, without modifies.
|
|
* When using pad-aligned mutexes within structures, they should generally
|
|
* stay as the first member of the struct. This is because otherwise the
|
|
* compiler can generate ever more padding for the struct to keep a correct
|
|
* alignment for the mutex.
|
|
*/
|
|
struct mtx_padalign {
|
|
struct lock_object lock_object; /* Common lock properties. */
|
|
volatile uintptr_t mtx_lock; /* Owner and flags. */
|
|
} __aligned(CACHE_LINE_SIZE);
|
|
|
|
#endif /* !_SYS__MUTEX_H_ */
|