Skip to content

Commit

Permalink
net neigh: RCU conversion of neigh hash table
Browse files Browse the repository at this point in the history
David

This is the first step for RCU conversion of neigh code.

Next patches will convert hash_buckets[] and "struct neighbour" to RCU
protected objects.

Thanks

[PATCH net-next] net neigh: RCU conversion of neigh hash table

Instead of storing hash_buckets, hash_mask and hash_rnd in "struct
neigh_table", a new structure is defined :

struct neigh_hash_table {
       struct neighbour        **hash_buckets;
       unsigned int            hash_mask;
       __u32                   hash_rnd;
       struct rcu_head         rcu;
};

And "struct neigh_table" has an RCU protected pointer to such a
neigh_hash_table.

This means the signature of (*hash)() function changed: We need to add a
third parameter with the actual hash_rnd value, since this is not
anymore a neigh_table field.

Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Eric Dumazet authored and davem330 committed Oct 5, 2010
1 parent 110b249 commit d6bf781
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 100 deletions.
16 changes: 12 additions & 4 deletions include/net/neighbour.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,13 +138,22 @@ struct pneigh_entry {
* neighbour table manipulation
*/

struct neigh_hash_table {
struct neighbour **hash_buckets;
unsigned int hash_mask;
__u32 hash_rnd;
struct rcu_head rcu;
};


struct neigh_table {
struct neigh_table *next;
int family;
int entry_size;
int key_len;
__u32 (*hash)(const void *pkey, const struct net_device *);
__u32 (*hash)(const void *pkey,
const struct net_device *dev,
__u32 hash_rnd);
int (*constructor)(struct neighbour *);
int (*pconstructor)(struct pneigh_entry *);
void (*pdestructor)(struct pneigh_entry *);
Expand All @@ -165,9 +174,7 @@ struct neigh_table {
unsigned long last_rand;
struct kmem_cache *kmem_cachep;
struct neigh_statistics __percpu *stats;
struct neighbour **hash_buckets;
unsigned int hash_mask;
__u32 hash_rnd;
struct neigh_hash_table __rcu *nht;
struct pneigh_entry **phash_buckets;
};

Expand Down Expand Up @@ -237,6 +244,7 @@ extern void pneigh_for_each(struct neigh_table *tbl, void (*cb)(struct pneigh_en
struct neigh_seq_state {
struct seq_net_private p;
struct neigh_table *tbl;
struct neigh_hash_table *nht;
void *(*neigh_sub_iter)(struct neigh_seq_state *state,
struct neighbour *n, loff_t *pos);
unsigned int bucket;
Expand Down
4 changes: 2 additions & 2 deletions net/atm/clip.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,9 +310,9 @@ static int clip_constructor(struct neighbour *neigh)
return 0;
}

static u32 clip_hash(const void *pkey, const struct net_device *dev)
static u32 clip_hash(const void *pkey, const struct net_device *dev, __u32 rnd)
{
return jhash_2words(*(u32 *) pkey, dev->ifindex, clip_tbl.hash_rnd);
return jhash_2words(*(u32 *) pkey, dev->ifindex, rnd);
}

static struct neigh_table clip_tbl = {
Expand Down
Loading

0 comments on commit d6bf781

Please sign in to comment.