Skip to content

Commit

Permalink
[NET]: Make macro to specify the ptype_base size
Browse files Browse the repository at this point in the history
Currently this size is 16, but as the comment says this
is so only because all the chains (except one) has the
length 1. I think, that some day this may change, so
growing this hash will be much easier.

Besides, symbolic names are read better than magic constants.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Pavel Emelyanov authored and David S. Miller committed Jan 28, 2008
1 parent 8d8ad9d commit 82d8a86
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,11 @@
* 86DD IPv6
*/

#define PTYPE_HASH_SIZE (16)
#define PTYPE_HASH_MASK (PTYPE_HASH_SIZE - 1)

static DEFINE_SPINLOCK(ptype_lock);
static struct list_head ptype_base[16] __read_mostly; /* 16 way hashed list */
static struct list_head ptype_base[PTYPE_HASH_SIZE] __read_mostly;
static struct list_head ptype_all __read_mostly; /* Taps */

#ifdef CONFIG_NET_DMA
Expand Down Expand Up @@ -362,7 +365,7 @@ void dev_add_pack(struct packet_type *pt)
if (pt->type == htons(ETH_P_ALL))
list_add_rcu(&pt->list, &ptype_all);
else {
hash = ntohs(pt->type) & 15;
hash = ntohs(pt->type) & PTYPE_HASH_MASK;
list_add_rcu(&pt->list, &ptype_base[hash]);
}
spin_unlock_bh(&ptype_lock);
Expand Down Expand Up @@ -391,7 +394,7 @@ void __dev_remove_pack(struct packet_type *pt)
if (pt->type == htons(ETH_P_ALL))
head = &ptype_all;
else
head = &ptype_base[ntohs(pt->type) & 15];
head = &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK];

list_for_each_entry(pt1, head, list) {
if (pt == pt1) {
Expand Down Expand Up @@ -1420,7 +1423,8 @@ struct sk_buff *skb_gso_segment(struct sk_buff *skb, int features)
}

rcu_read_lock();
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type) & 15], list) {
list_for_each_entry_rcu(ptype,
&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {
if (ptype->type == type && !ptype->dev && ptype->gso_segment) {
if (unlikely(skb->ip_summed != CHECKSUM_PARTIAL)) {
err = ptype->gso_send_check(skb);
Expand Down Expand Up @@ -2077,7 +2081,8 @@ int netif_receive_skb(struct sk_buff *skb)
goto out;

type = skb->protocol;
list_for_each_entry_rcu(ptype, &ptype_base[ntohs(type)&15], list) {
list_for_each_entry_rcu(ptype,
&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {
if (ptype->type == type &&
(!ptype->dev || ptype->dev == skb->dev)) {
if (pt_prev)
Expand Down Expand Up @@ -2525,7 +2530,7 @@ static void *ptype_get_idx(loff_t pos)
++i;
}

for (t = 0; t < 16; t++) {
for (t = 0; t < PTYPE_HASH_SIZE; t++) {
list_for_each_entry_rcu(pt, &ptype_base[t], list) {
if (i == pos)
return pt;
Expand Down Expand Up @@ -2559,10 +2564,10 @@ static void *ptype_seq_next(struct seq_file *seq, void *v, loff_t *pos)
hash = 0;
nxt = ptype_base[0].next;
} else
hash = ntohs(pt->type) & 15;
hash = ntohs(pt->type) & PTYPE_HASH_MASK;

while (nxt == &ptype_base[hash]) {
if (++hash >= 16)
if (++hash >= PTYPE_HASH_SIZE)
return NULL;
nxt = ptype_base[hash].next;
}
Expand Down Expand Up @@ -4398,7 +4403,7 @@ static int __init net_dev_init(void)
goto out;

INIT_LIST_HEAD(&ptype_all);
for (i = 0; i < 16; i++)
for (i = 0; i < PTYPE_HASH_SIZE; i++)
INIT_LIST_HEAD(&ptype_base[i]);

if (register_pernet_subsys(&netdev_net_ops))
Expand Down

0 comments on commit 82d8a86

Please sign in to comment.