···859859 if (repl->valid_hooks & (1 << i))860860 if (check_chainloops(newinfo->hook_entry[i],861861 cl_s, udc_cnt, i, newinfo->entries)) {862862- if (cl_s)863863- vfree(cl_s);862862+ vfree(cl_s);864863 return -EINVAL;865864 }866865···882883 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,883884 ebt_cleanup_entry, &i);884885 }885885- if (cl_s)886886- vfree(cl_s);886886+ vfree(cl_s);887887 return ret;888888}889889···10281030 }10291031 vfree(table);1030103210311031- if (counterstmp)10321032- vfree(counterstmp);10331033+ vfree(counterstmp);10331034 return ret;1034103510351036free_unlock:···10371040 EBT_ENTRY_ITERATE(newinfo->entries, newinfo->entries_size,10381041 ebt_cleanup_entry, NULL);10391042free_counterstmp:10401040- if (counterstmp)10411041- vfree(counterstmp);10431043+ vfree(counterstmp);10421044 /* can be initialized in translate_table() */10431045 if (newinfo->chainstack) {10441046 for (i = 0; i < num_possible_cpus(); i++)···10451049 vfree(newinfo->chainstack);10461050 }10471051free_entries:10481048- if (newinfo->entries)10491049- vfree(newinfo->entries);10521052+ vfree(newinfo->entries);10501053free_newinfo:10511051- if (newinfo)10521052- vfree(newinfo);10541054+ vfree(newinfo);10531055 return ret;10541056}10551057···12071213 down(&ebt_mutex);12081214 LIST_DELETE(&ebt_tables, table);12091215 up(&ebt_mutex);12101210- if (table->private->entries)12111211- vfree(table->private->entries);12161216+ vfree(table->private->entries);12121217 if (table->private->chainstack) {12131218 for (i = 0; i < num_possible_cpus(); i++)12141219 vfree(table->private->chainstack[i]);
+59-21
net/core/netpoll.c
···130130 */131131static void poll_napi(struct netpoll *np)132132{133133+ struct netpoll_info *npinfo = np->dev->npinfo;133134 int budget = 16;134135135136 if (test_bit(__LINK_STATE_RX_SCHED, &np->dev->state) &&136136- np->poll_owner != smp_processor_id() &&137137- spin_trylock(&np->poll_lock)) {138138- np->rx_flags |= NETPOLL_RX_DROP;137137+ npinfo->poll_owner != smp_processor_id() &&138138+ spin_trylock(&npinfo->poll_lock)) {139139+ npinfo->rx_flags |= NETPOLL_RX_DROP;139140 atomic_inc(&trapped);140141141142 np->dev->poll(np->dev, &budget);142143143144 atomic_dec(&trapped);144144- np->rx_flags &= ~NETPOLL_RX_DROP;145145- spin_unlock(&np->poll_lock);145145+ npinfo->rx_flags &= ~NETPOLL_RX_DROP;146146+ spin_unlock(&npinfo->poll_lock);146147 }147148}148149···246245static void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)247246{248247 int status;248248+ struct netpoll_info *npinfo;249249250250repeat:251251 if(!np || !np->dev || !netif_running(np->dev)) {···255253 }256254257255 /* avoid recursion */258258- if(np->poll_owner == smp_processor_id() ||259259- np->dev->xmit_lock_owner == smp_processor_id()) {256256+ npinfo = np->dev->npinfo;257257+ if (npinfo->poll_owner == smp_processor_id() ||258258+ np->dev->xmit_lock_owner == smp_processor_id()) {260259 if (np->drop)261260 np->drop(skb);262261 else···344341345342static void arp_reply(struct sk_buff *skb)346343{344344+ struct netpoll_info *npinfo = skb->dev->npinfo;347345 struct arphdr *arp;348346 unsigned char *arp_ptr;349347 int size, type = ARPOP_REPLY, ptype = ETH_P_ARP;350348 u32 sip, tip;349349+ unsigned long flags;351350 struct sk_buff *send_skb;352352- struct netpoll *np = skb->dev->np;351351+ struct netpoll *np = NULL;353352354354- if (!np) return;353353+ spin_lock_irqsave(&npinfo->rx_lock, flags);354354+ if (npinfo->rx_np && npinfo->rx_np->dev == skb->dev)355355+ np = npinfo->rx_np;356356+ spin_unlock_irqrestore(&npinfo->rx_lock, flags);357357+358358+ if (!np)359359+ return;355360356361 /* No arp on this interface */357362 if (skb->dev->flags & IFF_NOARP)···440429 int proto, len, ulen;441430 struct iphdr *iph;442431 struct udphdr *uh;443443- struct netpoll *np = skb->dev->np;432432+ struct netpoll *np = skb->dev->npinfo->rx_np;444433445445- if (!np->rx_hook)434434+ if (!np)446435 goto out;447436 if (skb->dev->type != ARPHRD_ETHER)448437 goto out;···622611{623612 struct net_device *ndev = NULL;624613 struct in_device *in_dev;625625-626626- np->poll_lock = SPIN_LOCK_UNLOCKED;627627- np->poll_owner = -1;614614+ struct netpoll_info *npinfo;615615+ unsigned long flags;628616629617 if (np->dev_name)630618 ndev = dev_get_by_name(np->dev_name);···634624 }635625636626 np->dev = ndev;637637- ndev->np = np;627627+ if (!ndev->npinfo) {628628+ npinfo = kmalloc(sizeof(*npinfo), GFP_KERNEL);629629+ if (!npinfo)630630+ goto release;631631+632632+ npinfo->rx_np = NULL;633633+ npinfo->poll_lock = SPIN_LOCK_UNLOCKED;634634+ npinfo->poll_owner = -1;635635+ npinfo->rx_lock = SPIN_LOCK_UNLOCKED;636636+ } else637637+ npinfo = ndev->npinfo;638638639639 if (!ndev->poll_controller) {640640 printk(KERN_ERR "%s: %s doesn't support polling, aborting.\n",···712692 np->name, HIPQUAD(np->local_ip));713693 }714694715715- if(np->rx_hook)716716- np->rx_flags = NETPOLL_RX_ENABLED;695695+ if (np->rx_hook) {696696+ spin_lock_irqsave(&npinfo->rx_lock, flags);697697+ npinfo->rx_flags |= NETPOLL_RX_ENABLED;698698+ npinfo->rx_np = np;699699+ spin_unlock_irqrestore(&npinfo->rx_lock, flags);700700+ }701701+ /* last thing to do is link it to the net device structure */702702+ ndev->npinfo = npinfo;717703718704 return 0;719705720706 release:721721- ndev->np = NULL;707707+ if (!ndev->npinfo)708708+ kfree(npinfo);722709 np->dev = NULL;723710 dev_put(ndev);724711 return -1;···733706734707void netpoll_cleanup(struct netpoll *np)735708{736736- if (np->dev)737737- np->dev->np = NULL;738738- dev_put(np->dev);709709+ struct netpoll_info *npinfo;710710+ unsigned long flags;711711+712712+ if (np->dev) {713713+ npinfo = np->dev->npinfo;714714+ if (npinfo && npinfo->rx_np == np) {715715+ spin_lock_irqsave(&npinfo->rx_lock, flags);716716+ npinfo->rx_np = NULL;717717+ npinfo->rx_flags &= ~NETPOLL_RX_ENABLED;718718+ spin_unlock_irqrestore(&npinfo->rx_lock, flags);719719+ }720720+ dev_put(np->dev);721721+ }722722+739723 np->dev = NULL;740724}741725
+1-1
net/ipv4/netfilter/ipt_CLUSTERIP.c
···339339 * error messages (RELATED) and information requests (see below) */340340 if ((*pskb)->nh.iph->protocol == IPPROTO_ICMP341341 && (ctinfo == IP_CT_RELATED 342342- || ctinfo == IP_CT_IS_REPLY+IP_CT_IS_REPLY))342342+ || ctinfo == IP_CT_RELATED+IP_CT_IS_REPLY))343343 return IPT_CONTINUE;344344345345 /* ip_conntrack_icmp guarantees us that we only have ICMP_ECHO,