Blame view

net/batman-adv/hash.c 1.73 KB
7db7d9f36   Sven Eckelmann   batman-adv: Add S...
1
  // SPDX-License-Identifier: GPL-2.0
7a79d717e   Sven Eckelmann   batman-adv: Updat...
2
  /* Copyright (C) 2006-2019  B.A.T.M.A.N. contributors:
c6c8fea29   Sven Eckelmann   net: Add batman-a...
3
4
   *
   * Simon Wunderlich, Marek Lindner
c6c8fea29   Sven Eckelmann   net: Add batman-a...
5
   */
c6c8fea29   Sven Eckelmann   net: Add batman-a...
6
  #include "hash.h"
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
7
  #include "main.h"
b92b94ac7   Sven Eckelmann   batman-adv: inclu...
8
  #include <linux/gfp.h>
1e2c2a4fe   Sven Eckelmann   batman-adv: Add r...
9
10
  #include <linux/lockdep.h>
  #include <linux/slab.h>
c6c8fea29   Sven Eckelmann   net: Add batman-a...
11
12
  
  /* clears the hash */
5bf74e9ca   Sven Eckelmann   batman-adv: Prefi...
13
  static void batadv_hash_init(struct batadv_hashtable *hash)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
14
  {
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
15
  	u32 i;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
16

cb4cca710   Sven Eckelmann   batman-adv: Remov...
17
  	for (i = 0; i < hash->size; i++) {
c6c8fea29   Sven Eckelmann   net: Add batman-a...
18
  		INIT_HLIST_HEAD(&hash->table[i]);
fb778ea17   Marek Lindner   batman-adv: prote...
19
20
  		spin_lock_init(&hash->list_locks[i]);
  	}
05abd7bcc   Sven Eckelmann   batman-adv: Store...
21
22
  
  	atomic_set(&hash->generation, 0);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
23
  }
ff15c27c9   Sven Eckelmann   batman-adv: Add k...
24
25
26
27
  /**
   * batadv_hash_destroy() - Free only the hashtable and the hash itself
   * @hash: hash object to destroy
   */
5bf74e9ca   Sven Eckelmann   batman-adv: Prefi...
28
  void batadv_hash_destroy(struct batadv_hashtable *hash)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
29
  {
fb778ea17   Marek Lindner   batman-adv: prote...
30
  	kfree(hash->list_locks);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
31
32
33
  	kfree(hash->table);
  	kfree(hash);
  }
ff15c27c9   Sven Eckelmann   batman-adv: Add k...
34
35
36
37
38
39
  /**
   * batadv_hash_new() - Allocates and clears the hashtable
   * @size: number of hash buckets to allocate
   *
   * Return: newly allocated hashtable, NULL on errors
   */
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
40
  struct batadv_hashtable *batadv_hash_new(u32 size)
c6c8fea29   Sven Eckelmann   net: Add batman-a...
41
  {
5bf74e9ca   Sven Eckelmann   batman-adv: Prefi...
42
  	struct batadv_hashtable *hash;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
43

704509b8d   Sven Eckelmann   batman-adv: Calcu...
44
  	hash = kmalloc(sizeof(*hash), GFP_ATOMIC);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
45
46
  	if (!hash)
  		return NULL;
0185dda64   Antonio Quartulli   batman-adv: prefe...
47
  	hash->table = kmalloc_array(size, sizeof(*hash->table), GFP_ATOMIC);
fb778ea17   Marek Lindner   batman-adv: prote...
48
49
  	if (!hash->table)
  		goto free_hash;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
50

0185dda64   Antonio Quartulli   batman-adv: prefe...
51
52
  	hash->list_locks = kmalloc_array(size, sizeof(*hash->list_locks),
  					 GFP_ATOMIC);
fb778ea17   Marek Lindner   batman-adv: prote...
53
54
  	if (!hash->list_locks)
  		goto free_table;
c6c8fea29   Sven Eckelmann   net: Add batman-a...
55

fb778ea17   Marek Lindner   batman-adv: prote...
56
  	hash->size = size;
7f9f02cb8   Sven Eckelmann   batman-adv: Prefi...
57
  	batadv_hash_init(hash);
c6c8fea29   Sven Eckelmann   net: Add batman-a...
58
  	return hash;
fb778ea17   Marek Lindner   batman-adv: prote...
59
60
61
62
63
64
65
  
  free_table:
  	kfree(hash->table);
  free_hash:
  	kfree(hash);
  	return NULL;
  }
5d52dad27   Sven Eckelmann   batman-adv: Initi...
66

ff15c27c9   Sven Eckelmann   batman-adv: Add k...
67
68
69
70
71
  /**
   * batadv_hash_set_lock_class() - Set specific lockdep class for hash spinlocks
   * @hash: hash object to modify
   * @key: lockdep class key address
   */
5bf74e9ca   Sven Eckelmann   batman-adv: Prefi...
72
  void batadv_hash_set_lock_class(struct batadv_hashtable *hash,
5d52dad27   Sven Eckelmann   batman-adv: Initi...
73
74
  				struct lock_class_key *key)
  {
6b5e971a2   Sven Eckelmann   batman-adv: Repla...
75
  	u32 i;
5d52dad27   Sven Eckelmann   batman-adv: Initi...
76
77
78
79
  
  	for (i = 0; i < hash->size; i++)
  		lockdep_set_class(&hash->list_locks[i], key);
  }