File tree Expand file tree Collapse file tree 3 files changed +63
-0
lines changed Expand file tree Collapse file tree 3 files changed +63
-0
lines changed Original file line number Diff line number Diff line change @@ -145,6 +145,7 @@ perf-y += mem2node.o
145
145
perf-y += clockid.o
146
146
perf-y += list_sort.o
147
147
perf-y += mutex.o
148
+ perf-y += sharded_mutex.o
148
149
149
150
perf-$(CONFIG_LIBBPF) += bpf-loader.o
150
151
perf-$(CONFIG_LIBBPF) += bpf_map.o
Original file line number Diff line number Diff line change
1
+ // SPDX-License-Identifier: GPL-2.0
2
+ #include "sharded_mutex.h"
3
+
4
+ #include <stdlib.h>
5
+
6
+ struct sharded_mutex * sharded_mutex__new (size_t num_shards )
7
+ {
8
+ struct sharded_mutex * result ;
9
+ size_t size ;
10
+ unsigned int bits ;
11
+
12
+ for (bits = 0 ; ((size_t )1 << bits ) < num_shards ; bits ++ )
13
+ ;
14
+
15
+ size = sizeof (* result ) + sizeof (struct mutex ) * (1 << bits );
16
+ result = malloc (size );
17
+ if (!result )
18
+ return NULL ;
19
+
20
+ result -> cap_bits = bits ;
21
+ for (size_t i = 0 ; i < ((size_t )1 << bits ); i ++ )
22
+ mutex_init (& result -> mutexes [i ]);
23
+
24
+ return result ;
25
+ }
26
+
27
+ void sharded_mutex__delete (struct sharded_mutex * sm )
28
+ {
29
+ for (size_t i = 0 ; i < ((size_t )1 << sm -> cap_bits ); i ++ )
30
+ mutex_destroy (& sm -> mutexes [i ]);
31
+
32
+ free (sm );
33
+ }
Original file line number Diff line number Diff line change
1
+ /* SPDX-License-Identifier: GPL-2.0 */
2
+ #ifndef PERF_SHARDED_MUTEX_H
3
+ #define PERF_SHARDED_MUTEX_H
4
+
5
+ #include "mutex.h"
6
+ #include "hashmap.h"
7
+
8
+ /*
9
+ * In a situation where a lock is needed per object, having a mutex can be
10
+ * relatively memory expensive (40 bytes on x86-64). If the object can be
11
+ * constantly hashed, a sharded mutex is an alternative global pool of mutexes
12
+ * where the mutex is looked up from a hash value. This can lead to collisions
13
+ * if the number of shards isn't large enough.
14
+ */
15
+ struct sharded_mutex {
16
+ /* mutexes array is 1<<cap_bits in size. */
17
+ unsigned int cap_bits ;
18
+ struct mutex mutexes [];
19
+ };
20
+
21
+ struct sharded_mutex * sharded_mutex__new (size_t num_shards );
22
+ void sharded_mutex__delete (struct sharded_mutex * sm );
23
+
24
+ static inline struct mutex * sharded_mutex__get_mutex (struct sharded_mutex * sm , size_t hash )
25
+ {
26
+ return & sm -> mutexes [hash_bits (hash , sm -> cap_bits )];
27
+ }
28
+
29
+ #endif /* PERF_SHARDED_MUTEX_H */
You can’t perform that action at this time.
0 commit comments