net/batman-adv/hash.h
Source file repositories/reference/linux-study-clean/net/batman-adv/hash.h
File Facts
- System
- Linux kernel
- Corpus path
net/batman-adv/hash.h- Extension
.h- Size
- 3966 bytes
- Lines
- 158
- Domain
- Networking Core
- Bucket
- Sockets, Protocols, Packet Path, And Network Policy
- Inferred role
- Networking Core: implementation source
- Status
- source implementation candidate
Why This File Exists
Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Networking stack implementation surface: socket APIs, protocol dispatch, packet flow, routing, filtering, and network namespaces.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
main.hlinux/atomic.hlinux/compiler.hlinux/list.hlinux/lockdep.hlinux/rculist.hlinux/spinlock.hlinux/stddef.hlinux/types.h
Detected Declarations
struct batadv_hashtablefunction batadv_hash_addfunction hlist_for_eachfunction batadv_hash_remove
Annotated Snippet
struct batadv_hashtable {
/** @table: the hashtable itself with the buckets */
struct hlist_head *table;
/** @list_locks: spinlock for each hash list entry */
spinlock_t *list_locks;
/** @size: size of hashtable */
u32 size;
/** @generation: current (generation) sequence number */
atomic_t generation;
};
/* allocates and clears the hash */
struct batadv_hashtable *batadv_hash_new(u32 size);
/* set class key for all locks */
void batadv_hash_set_lock_class(struct batadv_hashtable *hash,
struct lock_class_key *key);
/* free only the hashtable and the hash itself. */
void batadv_hash_destroy(struct batadv_hashtable *hash);
/**
* batadv_hash_add() - adds data to the hashtable
* @hash: storage hash table
* @compare: callback to determine if 2 hash elements are identical
* @choose: callback calculating the hash index
* @data: data passed to the aforementioned callbacks as argument
* @data_node: to be added element
*
* Return: 0 on success, 1 if the element already is in the hash
* and -1 on error.
*/
static inline int batadv_hash_add(struct batadv_hashtable *hash,
batadv_hashdata_compare_cb compare,
batadv_hashdata_choose_cb choose,
const void *data,
struct hlist_node *data_node)
{
u32 index;
int ret = -1;
struct hlist_head *head;
struct hlist_node *node;
spinlock_t *list_lock; /* spinlock to protect write access */
if (!hash)
goto out;
index = choose(data, hash->size);
head = &hash->table[index];
list_lock = &hash->list_locks[index];
spin_lock_bh(list_lock);
hlist_for_each(node, head) {
if (!compare(node, data))
continue;
ret = 1;
goto unlock;
}
/* no duplicate found in list, add new element */
hlist_add_head_rcu(data_node, head);
atomic_inc(&hash->generation);
ret = 0;
unlock:
spin_unlock_bh(list_lock);
out:
return ret;
}
/**
* batadv_hash_remove() - Removes data from hash, if found
* @hash: hash table
* @compare: callback to determine if 2 hash elements are identical
* @choose: callback calculating the hash index
* @data: data passed to the aforementioned callbacks as argument
*
* data could be the structure you use with just the key filled, we just need
* the key for comparing.
*
* Return: returns pointer to data on success, so you can remove the used
* structure yourself, or NULL on error
*/
static inline void *batadv_hash_remove(struct batadv_hashtable *hash,
Annotation
- Immediate include surface: `main.h`, `linux/atomic.h`, `linux/compiler.h`, `linux/list.h`, `linux/lockdep.h`, `linux/rculist.h`, `linux/spinlock.h`, `linux/stddef.h`.
- Detected declarations: `struct batadv_hashtable`, `function batadv_hash_add`, `function hlist_for_each`, `function batadv_hash_remove`.
- Atlas domain: Networking Core / Sockets, Protocols, Packet Path, And Network Policy.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.