-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'rhashtable-New-features-in-walk-and-bucket'
Tom Herbert says: ==================== rhashtable: New features in walk and bucket This patch contains some changes to related rhashtable: - Above allow rhashtable_walk_start to return void - Add a functon to peek at the next entry during a walk - Abstract out function to compute a has for a table - A library function to alloc a spinlocks bucket array - Call the above function for rhashtable locks allocation Tested: Exercised using various operations on an ILA xlat table. v2: - Apply feedback from Herbert. Don't change semantics of resize event reporting and -EAGAIN, just simplify API for callers that ignore those. - Add end_of_table in iter to reliably tell when the iterator has reached to the eno. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
- Loading branch information
Showing
19 changed files
with
224 additions
and
160 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
#include <linux/export.h> | ||
#include <linux/kernel.h> | ||
#include <linux/mm.h> | ||
#include <linux/slab.h> | ||
#include <linux/vmalloc.h> | ||
|
||
/* Allocate an array of spinlocks to be accessed by a hash. Two arguments | ||
* indicate the number of elements to allocate in the array. max_size | ||
* gives the maximum number of elements to allocate. cpu_mult gives | ||
* the number of locks per CPU to allocate. The size is rounded up | ||
* to a power of 2 to be suitable as a hash table. | ||
*/ | ||
|
||
int alloc_bucket_spinlocks(spinlock_t **locks, unsigned int *locks_mask, | ||
size_t max_size, unsigned int cpu_mult, gfp_t gfp) | ||
{ | ||
spinlock_t *tlocks = NULL; | ||
unsigned int i, size; | ||
#if defined(CONFIG_PROVE_LOCKING) | ||
unsigned int nr_pcpus = 2; | ||
#else | ||
unsigned int nr_pcpus = num_possible_cpus(); | ||
#endif | ||
|
||
if (cpu_mult) { | ||
nr_pcpus = min_t(unsigned int, nr_pcpus, 64UL); | ||
size = min_t(unsigned int, nr_pcpus * cpu_mult, max_size); | ||
} else { | ||
size = max_size; | ||
} | ||
|
||
if (sizeof(spinlock_t) != 0) { | ||
if (gfpflags_allow_blocking(gfp)) | ||
tlocks = kvmalloc(size * sizeof(spinlock_t), gfp); | ||
else | ||
tlocks = kmalloc_array(size, sizeof(spinlock_t), gfp); | ||
if (!tlocks) | ||
return -ENOMEM; | ||
for (i = 0; i < size; i++) | ||
spin_lock_init(&tlocks[i]); | ||
} | ||
|
||
*locks = tlocks; | ||
*locks_mask = size - 1; | ||
|
||
return 0; | ||
} | ||
EXPORT_SYMBOL(alloc_bucket_spinlocks); | ||
|
||
void free_bucket_spinlocks(spinlock_t *locks) | ||
{ | ||
kvfree(locks); | ||
} | ||
EXPORT_SYMBOL(free_bucket_spinlocks); |
Oops, something went wrong.