Changeset 15822


Ignore:
Timestamp:
2009-05-13T14:42:55+02:00 (9 years ago)
Author:
nbd
Message:

reduce the total cpu usage of ipt_do_table under high network load from 3.1% down to 1.6% (tested with oprofile)

Location:
trunk/target/linux/generic-2.6
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/generic-2.6/patches-2.6.28/110-netfilter_match_speedup.patch

    r15574 r15822  
    7676  
    7777 #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ 
     78@@ -332,8 +358,27 @@ ipt_do_table(struct sk_buff *skb, 
     79        struct xt_match_param mtpar; 
     80        struct xt_target_param tgpar; 
     81  
     82-       /* Initialization */ 
     83        ip = ip_hdr(skb); 
     84+ 
     85+       read_lock_bh(&table->lock); 
     86+       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     87+       private = table->private; 
     88+       table_base = (void *)private->entries[smp_processor_id()]; 
     89+       e = get_entry(table_base, private->hook_entry[hook]); 
     90+       if (e->target_offset <= sizeof(struct ipt_entry) && 
     91+               (e->ip.flags & IPT_F_NO_DEF_MATCH)) { 
     92+                       struct ipt_entry_target *t = ipt_get_target(e); 
     93+                       if (!t->u.kernel.target->target) { 
     94+                               int v = ((struct ipt_standard_target *)t)->verdict; 
     95+                               if ((v < 0) && (v != IPT_RETURN)) { 
     96+                                       ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1); 
     97+                                       read_unlock_bh(&table->lock); 
     98+                                       return (unsigned)(-v) - 1; 
     99+                               } 
     100+                       } 
     101+       } 
     102+ 
     103+       /* Initialization */ 
     104        datalen = skb->len - ip->ihl * 4; 
     105        indev = in ? in->name : nulldevname; 
     106        outdev = out ? out->name : nulldevname; 
     107@@ -351,12 +396,6 @@ ipt_do_table(struct sk_buff *skb, 
     108        mtpar.family  = tgpar.family = NFPROTO_IPV4; 
     109        tgpar.hooknum = hook; 
     110  
     111-       read_lock_bh(&table->lock); 
     112-       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     113-       private = table->private; 
     114-       table_base = (void *)private->entries[smp_processor_id()]; 
     115-       e = get_entry(table_base, private->hook_entry[hook]); 
     116- 
     117        /* For return from builtin chain */ 
     118        back = get_entry(table_base, private->underflow[hook]); 
     119  
     120 
  • trunk/target/linux/generic-2.6/patches-2.6.29/110-netfilter_match_speedup.patch

    r15574 r15822  
    7676  
    7777 #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ 
     78@@ -328,8 +354,27 @@ ipt_do_table(struct sk_buff *skb, 
     79        struct xt_match_param mtpar; 
     80        struct xt_target_param tgpar; 
     81  
     82-       /* Initialization */ 
     83        ip = ip_hdr(skb); 
     84+ 
     85+       read_lock_bh(&table->lock); 
     86+       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     87+       private = table->private; 
     88+       table_base = (void *)private->entries[smp_processor_id()]; 
     89+       e = get_entry(table_base, private->hook_entry[hook]); 
     90+       if (e->target_offset <= sizeof(struct ipt_entry) && 
     91+               (e->ip.flags & IPT_F_NO_DEF_MATCH)) { 
     92+                       struct ipt_entry_target *t = ipt_get_target(e); 
     93+                       if (!t->u.kernel.target->target) { 
     94+                               int v = ((struct ipt_standard_target *)t)->verdict; 
     95+                               if ((v < 0) && (v != IPT_RETURN)) { 
     96+                                       ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1); 
     97+                                       read_unlock_bh(&table->lock); 
     98+                                       return (unsigned)(-v) - 1; 
     99+                               } 
     100+                       } 
     101+       } 
     102+ 
     103+       /* Initialization */ 
     104        datalen = skb->len - ip->ihl * 4; 
     105        indev = in ? in->name : nulldevname; 
     106        outdev = out ? out->name : nulldevname; 
     107@@ -347,12 +392,6 @@ ipt_do_table(struct sk_buff *skb, 
     108        mtpar.family  = tgpar.family = NFPROTO_IPV4; 
     109        tgpar.hooknum = hook; 
     110  
     111-       read_lock_bh(&table->lock); 
     112-       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     113-       private = table->private; 
     114-       table_base = (void *)private->entries[smp_processor_id()]; 
     115-       e = get_entry(table_base, private->hook_entry[hook]); 
     116- 
     117        /* For return from builtin chain */ 
     118        back = get_entry(table_base, private->underflow[hook]); 
     119  
  • trunk/target/linux/generic-2.6/patches-2.6.30/110-netfilter_match_speedup.patch

    r15574 r15822  
    7676  
    7777 #if defined(CONFIG_NETFILTER_XT_TARGET_TRACE) || \ 
     78@@ -318,8 +344,28 @@ ipt_do_table(struct sk_buff *skb, 
     79        struct xt_match_param mtpar; 
     80        struct xt_target_param tgpar; 
     81  
     82-       /* Initialization */ 
     83        ip = ip_hdr(skb); 
     84+ 
     85+       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     86+       xt_info_rdlock_bh(); 
     87+       private = table->private; 
     88+       table_base = private->entries[smp_processor_id()]; 
     89+       e = get_entry(table_base, private->hook_entry[hook]); 
     90+ 
     91+       if (e->target_offset <= sizeof(struct ipt_entry) && 
     92+               (e->ip.flags & IPT_F_NO_DEF_MATCH)) { 
     93+                       struct ipt_entry_target *t = ipt_get_target(e); 
     94+                       if (!t->u.kernel.target->target) { 
     95+                               int v = ((struct ipt_standard_target *)t)->verdict; 
     96+                               if ((v < 0) && (v != IPT_RETURN)) { 
     97+                                       ADD_COUNTER(e->counters, ntohs(ip->tot_len), 1); 
     98+                                       read_unlock_bh(&table->lock); 
     99+                                       return (unsigned)(-v) - 1; 
     100+                               } 
     101+                       } 
     102+       } 
     103+ 
     104+       /* Initialization */ 
     105        datalen = skb->len - ip->ihl * 4; 
     106        indev = in ? in->name : nulldevname; 
     107        outdev = out ? out->name : nulldevname; 
     108@@ -337,13 +383,6 @@ ipt_do_table(struct sk_buff *skb, 
     109        mtpar.family  = tgpar.family = NFPROTO_IPV4; 
     110        tgpar.hooknum = hook; 
     111  
     112-       IP_NF_ASSERT(table->valid_hooks & (1 << hook)); 
     113-       xt_info_rdlock_bh(); 
     114-       private = table->private; 
     115-       table_base = private->entries[smp_processor_id()]; 
     116- 
     117-       e = get_entry(table_base, private->hook_entry[hook]); 
     118- 
     119        /* For return from builtin chain */ 
     120        back = get_entry(table_base, private->underflow[hook]); 
     121  
Note: See TracChangeset for help on using the changeset viewer.