mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Per object mutexes may come with significant memory cost while a
global mutex can suffer from unnecessary contention. A sharded mutex
is a compromise where objects are hashed and then a particular mutex
for the hash of the object used. Contention can be controlled by the
number of shards.
v2. Use hashmap.h's hash_bits in case of contention from alignment of
    objects.
Signed-off-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andres Freund <andres@anarazel.de>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Yuan Can <yuancan@huawei.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Huacai Chen <chenhuacai@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Link: https://lore.kernel.org/r/20230615040715.2064350-1-irogers@google.com
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
		
	
			
		
			
				
	
	
		
			29 lines
		
	
	
	
		
			922 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			29 lines
		
	
	
	
		
			922 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef PERF_SHARDED_MUTEX_H
 | 
						|
#define PERF_SHARDED_MUTEX_H
 | 
						|
 | 
						|
#include "mutex.h"
 | 
						|
#include "hashmap.h"
 | 
						|
 | 
						|
/*
 | 
						|
 * In a situation where a lock is needed per object, having a mutex can be
 | 
						|
 * relatively memory expensive (40 bytes on x86-64). If the object can be
 | 
						|
 * constantly hashed, a sharded mutex is an alternative global pool of mutexes
 | 
						|
 * where the mutex is looked up from a hash value. This can lead to collisions
 | 
						|
 * if the number of shards isn't large enough.
 | 
						|
 */
 | 
						|
struct sharded_mutex {
 | 
						|
	/* mutexes array is 1<<cap_bits in size. */
 | 
						|
	unsigned int cap_bits;
 | 
						|
	struct mutex mutexes[];
 | 
						|
};
 | 
						|
 | 
						|
struct sharded_mutex *sharded_mutex__new(size_t num_shards);
 | 
						|
void sharded_mutex__delete(struct sharded_mutex *sm);
 | 
						|
 | 
						|
static inline struct mutex *sharded_mutex__get_mutex(struct sharded_mutex *sm, size_t hash)
 | 
						|
{
 | 
						|
	return &sm->mutexes[hash_bits(hash, sm->cap_bits)];
 | 
						|
}
 | 
						|
 | 
						|
#endif  /* PERF_SHARDED_MUTEX_H */
 |