diff options
| author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-23 02:35:16 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-09-23 02:35:16 -0700 |
| commit | c8fab1b610a781a27932e8217cda711ce79e02da (patch) | |
| tree | 136284d8992311468d840201d47683d2172a5f14 | |
| parent | 5efa19a809ba89a6797ec48a3ae9675761f6e3d2 (diff) | |
| parent | 559b540de3d2d92c26e0753e473b4fcbd03116fd (diff) | |
Merge bk://kernel.bkbits.net/davem/net-2.6
into ppc970.osdl.org:/home/torvalds/v2.6/linux
| -rw-r--r-- | drivers/atm/ambassador.c | 5 | ||||
| -rw-r--r-- | drivers/atm/eni.c | 73 | ||||
| -rw-r--r-- | drivers/atm/eni.h | 20 | ||||
| -rw-r--r-- | drivers/atm/fore200e.h | 2 | ||||
| -rw-r--r-- | drivers/atm/lanai.c | 2 | ||||
| -rw-r--r-- | drivers/net/arcnet/arcnet.c | 3 | ||||
| -rw-r--r-- | include/linux/skbuff.h | 2 | ||||
| -rw-r--r-- | net/core/pktgen.c | 101 | ||||
| -rw-r--r-- | net/ipv4/Makefile | 1 | ||||
| -rw-r--r-- | net/ipv4/fib_hash.c | 20 | ||||
| -rw-r--r-- | net/ipv4/netfilter/ip_nat_helper.c | 2 | ||||
| -rw-r--r-- | net/xfrm/xfrm_state.c | 1 |
12 files changed, 125 insertions, 107 deletions
diff --git a/drivers/atm/ambassador.c b/drivers/atm/ambassador.c index fe809480e299..9be4013f540a 100644 --- a/drivers/atm/ambassador.c +++ b/drivers/atm/ambassador.c @@ -2291,11 +2291,10 @@ static int __init do_pci_device(struct pci_dev *pci_dev) // read resources from PCI configuration space u8 irq = pci_dev->irq; - u32 * membase = bus_to_virt (pci_resource_start (pci_dev, 0)); - u32 iobase = pci_resource_start (pci_dev, 1); PRINTD (DBG_INFO, "found Madge ATM adapter (amb) at" - " IO %x, IRQ %u, MEM %p", iobase, irq, membase); + " IO %x, IRQ %u, MEM %p", pci_resource_start(pci_dev, 1), + irq, bus_to_virt(pci_resource_start(pci_dev, 0))); // check IO region err = pci_request_region(pci_dev, 1, DEV_LABEL); diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c index 8b137034d22b..81127d178d1f 100644 --- a/drivers/atm/eni.c +++ b/drivers/atm/eni.c @@ -173,7 +173,7 @@ static void dump_mem(struct eni_dev *eni_dev) int i; for (i = 0; i < eni_dev->free_len; i++) - printk(KERN_DEBUG " %d: 0x%lx %d\n",i, + printk(KERN_DEBUG " %d: %p %d\n",i, eni_dev->free_list[i].start, 1 << eni_dev->free_list[i].order); } @@ -191,19 +191,19 @@ static void dump(struct atm_dev *dev) printk(KERN_NOTICE "TX buffers\n"); for (i = 0; i < NR_CHAN; i++) if (eni_dev->tx[i].send) - printk(KERN_NOTICE " TX %d @ 0x%lx: %ld\n",i, + printk(KERN_NOTICE " TX %d @ %p: %ld\n",i, eni_dev->tx[i].send,eni_dev->tx[i].words*4); printk(KERN_NOTICE "RX buffers\n"); for (i = 0; i < 1024; i++) if (eni_dev->rx_map[i] && ENI_VCC(eni_dev->rx_map[i])->rx) - printk(KERN_NOTICE " RX %d @ 0x%lx: %ld\n",i, + printk(KERN_NOTICE " RX %d @ %p: %ld\n",i, ENI_VCC(eni_dev->rx_map[i])->recv, ENI_VCC(eni_dev->rx_map[i])->words*4); printk(KERN_NOTICE "----\n"); } -static void eni_put_free(struct eni_dev *eni_dev,unsigned long start, +static void eni_put_free(struct eni_dev *eni_dev, void __iomem *start, unsigned long size) { struct eni_free *list; @@ -215,17 +215,17 @@ static void eni_put_free(struct eni_dev *eni_dev,unsigned long start, len = eni_dev->free_len; while (size) { if (len >= eni_dev->free_list_size) { - printk(KERN_CRIT "eni_put_free overflow (0x%lx,%ld)\n", + printk(KERN_CRIT "eni_put_free overflow (%p,%ld)\n", start,size); break; } - for (order = 0; !((start | size) & (1 << order)); order++); + for (order = 0; !(((unsigned long)start | size) & (1 << order)); order++); if (MID_MIN_BUF_SIZE > (1 << order)) { printk(KERN_CRIT "eni_put_free: order %d too small\n", order); break; } - list[len].start = start; + list[len].start = (void __iomem *) start; list[len].order = order; len++; start += 1 << order; @@ -236,10 +236,10 @@ static void eni_put_free(struct eni_dev *eni_dev,unsigned long start, } -static unsigned long eni_alloc_mem(struct eni_dev *eni_dev,unsigned long *size) +static void __iomem *eni_alloc_mem(struct eni_dev *eni_dev, unsigned long *size) { struct eni_free *list; - unsigned long start; + void __iomem *start; int len,i,order,best_order,index; list = eni_dev->free_list; @@ -273,7 +273,7 @@ static unsigned long eni_alloc_mem(struct eni_dev *eni_dev,unsigned long *size) } -static void eni_free_mem(struct eni_dev *eni_dev,unsigned long start, +static void eni_free_mem(struct eni_dev *eni_dev, void __iomem *start, unsigned long size) { struct eni_free *list; @@ -283,20 +283,20 @@ static void eni_free_mem(struct eni_dev *eni_dev,unsigned long start, list = eni_dev->free_list; len = eni_dev->free_len; for (order = -1; size; order++) size >>= 1; - DPRINTK("eni_free_mem: 0x%lx+0x%lx (order %d)\n",start,size,order); + DPRINTK("eni_free_mem: %p+0x%lx (order %d)\n",start,size,order); for (i = 0; i < len; i++) - if (list[i].start == (start^(1 << order)) && + if (((unsigned long) list[i].start) == ((unsigned long)start^(1 << order)) && list[i].order == order) { DPRINTK("match[%d]: 0x%lx/0x%lx(0x%x), %d/%d\n",i, list[i].start,start,1 << order,list[i].order,order); list[i] = list[--len]; - start &= ~(unsigned long) (1 << order); + start = (void __iomem *) ((unsigned long) start & ~(unsigned long) (1 << order)); order++; i = -1; continue; } if (len >= eni_dev->free_list_size) { - printk(KERN_ALERT "eni_free_mem overflow (0x%lx,%d)\n",start, + printk(KERN_ALERT "eni_free_mem overflow (%p,%d)\n",start, order); return; } @@ -333,7 +333,7 @@ static void rx_ident_err(struct atm_vcc *vcc) printk(KERN_ALERT " host descr 0x%lx, rx pos 0x%lx, descr value " "0x%x\n",eni_vcc->descr,eni_vcc->rx_pos, (unsigned) readl(eni_vcc->recv+eni_vcc->descr*4)); - printk(KERN_ALERT " last 0x%p, servicing %d\n",eni_vcc->last, + printk(KERN_ALERT " last %p, servicing %d\n",eni_vcc->last, eni_vcc->servicing); EVENT("---dump ends here---\n",0,0); printk(KERN_NOTICE "---recent events---\n"); @@ -617,7 +617,8 @@ static int rx_aal5(struct atm_vcc *vcc) static inline int rx_vcc(struct atm_vcc *vcc) { - unsigned long vci_dsc,tmp; + void __iomem *vci_dsc; + unsigned long tmp; struct eni_vcc *eni_vcc; eni_vcc = ENI_VCC(vcc); @@ -728,7 +729,7 @@ static void dequeue_rx(struct atm_dev *dev) struct eni_vcc *eni_vcc; struct atm_vcc *vcc; struct sk_buff *skb; - unsigned long vci_dsc; + void __iomem *vci_dsc; int first; eni_dev = ENI_DEV(dev); @@ -808,7 +809,7 @@ static int open_rx_first(struct atm_vcc *vcc) static int open_rx_second(struct atm_vcc *vcc) { - unsigned long here; + void __iomem *here; struct eni_dev *eni_dev; struct eni_vcc *eni_vcc; unsigned long size; @@ -840,7 +841,7 @@ static int open_rx_second(struct atm_vcc *vcc) static void close_rx(struct atm_vcc *vcc) { DECLARE_WAITQUEUE(wait,current); - unsigned long here; + void __iomem *here; struct eni_dev *eni_dev; struct eni_vcc *eni_vcc; @@ -1289,7 +1290,8 @@ static int reserve_or_set_tx(struct atm_vcc *vcc,struct atm_trafprm *txtp, struct eni_dev *eni_dev = ENI_DEV(vcc->dev); struct eni_vcc *eni_vcc = ENI_VCC(vcc); struct eni_tx *tx; - unsigned long size,mem; + unsigned long size; + void __iomem *mem; int rate,ubr,unlimited,new_tx; int pre,res,order; int error; @@ -1687,9 +1689,9 @@ static int __devinit get_esi_asic(struct atm_dev *dev) #undef GET_SEPROM -static int __devinit get_esi_fpga(struct atm_dev *dev,unsigned long base) +static int __devinit get_esi_fpga(struct atm_dev *dev, void __iomem *base) { - unsigned long mac_base; + void __iomem *mac_base; int i; mac_base = base+EPROM_SIZE-sizeof(struct midway_eprom); @@ -1703,7 +1705,8 @@ static int __devinit eni_do_init(struct atm_dev *dev) struct midway_eprom *eprom; struct eni_dev *eni_dev; struct pci_dev *pci_dev; - unsigned long real_base,base; + unsigned long real_base; + void __iomem *base; unsigned char revision; int error,i,last; @@ -1730,13 +1733,13 @@ static int __devinit eni_do_init(struct atm_dev *dev) } printk(KERN_NOTICE DEV_LABEL "(itf %d): rev.%d,base=0x%lx,irq=%d,", dev->number,revision,real_base,eni_dev->irq); - if (!(base = (unsigned long) ioremap_nocache(real_base,MAP_MAX_SIZE))) { + if (!(base = ioremap_nocache(real_base,MAP_MAX_SIZE))) { printk("\n"); printk(KERN_ERR DEV_LABEL "(itf %d): can't set up page " "mapping\n",dev->number); return error; } - eni_dev->base_diff = real_base-base; + eni_dev->base_diff = real_base - (unsigned long) base; /* id may not be present in ASIC Tonga boards - check this @@@ */ if (!eni_dev->asic) { eprom = (struct midway_eprom *) (base+EPROM_SIZE-sizeof(struct @@ -1790,7 +1793,9 @@ static int __devinit eni_do_init(struct atm_dev *dev) static int __devinit eni_start(struct atm_dev *dev) { struct eni_dev *eni_dev; - unsigned long buf,buffer_mem; + + void __iomem *buf; + unsigned long buffer_mem; int error; DPRINTK(">eni_start\n"); @@ -1828,7 +1833,7 @@ static int __devinit eni_start(struct atm_dev *dev) tasklet_init(&eni_dev->task,eni_tasklet,(unsigned long) dev); eni_dev->events = 0; /* initialize memory management */ - buffer_mem = eni_dev->mem-(buf-eni_dev->ram); + buffer_mem = eni_dev->mem - (buf - eni_dev->ram); eni_dev->free_list_size = buffer_mem/MID_MIN_BUF_SIZE/2; eni_dev->free_list = (struct eni_free *) kmalloc( sizeof(struct eni_free)*(eni_dev->free_list_size+1),GFP_KERNEL); @@ -1955,7 +1960,7 @@ static int eni_change_qos(struct atm_vcc *vcc,struct atm_qos *qos,int flgs) */ tasklet_disable(&eni_dev->task); skb_queue_walk(&eni_dev->tx_queue, skb) { - unsigned long dsc; + void __iomem *dsc; if (ATM_SKB(skb)->vcc != vcc) continue; dsc = tx->send+ENI_PRV_POS(skb)*4; @@ -2136,9 +2141,9 @@ static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) if (!tx->send) continue; if (!--left) { - return sprintf(page,"tx[%d]: 0x%06lx-0x%06lx " + return sprintf(page,"tx[%d]: 0x%ld-0x%ld " "(%6ld bytes), rsv %d cps, shp %d cps%s\n",i, - tx->send-eni_dev->ram, + (unsigned long) (tx->send - eni_dev->ram), tx->send-eni_dev->ram+tx->words*4-1,tx->words*4, tx->reserved,tx->shaping, tx == eni_dev->ubr ? " (UBR)" : ""); @@ -2162,9 +2167,9 @@ static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) if (--left) continue; length = sprintf(page,"vcc %4d: ",vcc->vci); if (eni_vcc->rx) { - length += sprintf(page+length,"0x%06lx-0x%06lx " + length += sprintf(page+length,"0x%ld-0x%ld " "(%6ld bytes)", - eni_vcc->recv-eni_dev->ram, + (unsigned long) (eni_vcc->recv - eni_dev->ram), eni_vcc->recv-eni_dev->ram+eni_vcc->words*4-1, eni_vcc->words*4); if (eni_vcc->tx) length += sprintf(page+length,", "); @@ -2183,8 +2188,8 @@ static int eni_proc_read(struct atm_dev *dev,loff_t *pos,char *page) unsigned long offset; if (--left) continue; - offset = eni_dev->ram+eni_dev->base_diff; - return sprintf(page,"free 0x%06lx-0x%06lx (%6d bytes)\n", + offset = (unsigned long) eni_dev->ram+eni_dev->base_diff; + return sprintf(page,"free %p-%p (%6d bytes)\n", fe->start-offset,fe->start-offset+(1 << fe->order)-1, 1 << fe->order); } diff --git a/drivers/atm/eni.h b/drivers/atm/eni.h index e7af66bd8bd2..385090c2a580 100644 --- a/drivers/atm/eni.h +++ b/drivers/atm/eni.h @@ -33,12 +33,12 @@ struct eni_free { - unsigned long start; /* counting in bytes */ + void __iomem *start; /* counting in bytes */ int order; }; struct eni_tx { - unsigned long send; /* base, 0 if unused */ + void __iomem *send; /* base, 0 if unused */ int prescaler; /* shaping prescaler */ int resolution; /* shaping divider */ unsigned long tx_pos; /* current TX write position */ @@ -51,7 +51,7 @@ struct eni_tx { struct eni_vcc { int (*rx)(struct atm_vcc *vcc); /* RX function, NULL if none */ - unsigned long recv; /* receive buffer */ + void __iomem *recv; /* receive buffer */ unsigned long words; /* its size in words */ unsigned long descr; /* next descriptor (RX) */ unsigned long rx_pos; /* current RX descriptor pos */ @@ -72,13 +72,13 @@ struct eni_dev { u32 events; /* pending events */ /*-------------------------------- base pointers into Midway address space */ - unsigned long phy; /* PHY interface chip registers */ - unsigned long reg; /* register base */ - unsigned long ram; /* RAM base */ - unsigned long vci; /* VCI table */ - unsigned long rx_dma; /* RX DMA queue */ - unsigned long tx_dma; /* TX DMA queue */ - unsigned long service; /* service list */ + void __iomem *phy; /* PHY interface chip registers */ + void __iomem *reg; /* register base */ + void __iomem *ram; /* RAM base */ + void __iomem *vci; /* VCI table */ + void __iomem *rx_dma; /* RX DMA queue */ + void __iomem *tx_dma; /* TX DMA queue */ + void __iomem *service; /* service list */ /*-------------------------------- TX part */ struct eni_tx tx[NR_CHAN]; /* TX channels */ struct eni_tx *ubr; /* UBR channel */ diff --git a/drivers/atm/fore200e.h b/drivers/atm/fore200e.h index aca550b66419..420216561b8c 100644 --- a/drivers/atm/fore200e.h +++ b/drivers/atm/fore200e.h @@ -565,7 +565,7 @@ typedef struct host_cmdq_entry { typedef struct chunk { void* alloc_addr; /* base address of allocated chunk */ void* align_addr; /* base address of aligned chunk */ - u32 dma_addr; /* DMA address of aligned chunk */ + dma_addr_t dma_addr; /* DMA address of aligned chunk */ int direction; /* direction of DMA mapping */ u32 alloc_size; /* length of allocated chunk */ u32 align_size; /* length of aligned chunk */ diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c index 0dc2d3903d52..e23d3f714dd2 100644 --- a/drivers/atm/lanai.c +++ b/drivers/atm/lanai.c @@ -813,7 +813,7 @@ static void lanai_shutdown_tx_vci(struct lanai_dev *lanai, DPRINTK("read, write = %d, %d\n", read, write); break; } - msleep(4); + msleep(40); } /* 15.2.2 - clear out all tx registers */ cardvcc_write(lvcc, 0, vcc_txreadptr); diff --git a/drivers/net/arcnet/arcnet.c b/drivers/net/arcnet/arcnet.c index 5912a24a3670..5d304676f3df 100644 --- a/drivers/net/arcnet/arcnet.c +++ b/drivers/net/arcnet/arcnet.c @@ -401,7 +401,8 @@ static int arcnet_open(struct net_device *dev) lp->rfc1201.sequence = 1; /* bring up the hardware driver */ - lp->hw.open(dev); + if (lp->hw.open) + lp->hw.open(dev); if (dev->dev_addr[0] == 0) BUGMSG(D_NORMAL, "WARNING! Station address 00 is reserved " diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index e689c26b1ada..aae68c5017b6 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -271,7 +271,7 @@ struct sk_buff { #ifdef CONFIG_NET_CLS_ACT __u32 tc_verd; /* traffic control verdict */ __u32 tc_classid; /* traffic control classid */ - #endif +#endif #endif diff --git a/net/core/pktgen.c b/net/core/pktgen.c index f95ce4c2f521..1d1c5451f303 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c @@ -52,6 +52,9 @@ * * Fixed unaligned access on IA-64 Grant Grundler <grundler@parisc-linux.org> * + * New xmit() return, do_div and misc clean up by Stephen Hemminger + * <shemminger@osdl.org> 040923 + * * See Documentation/networking/pktgen.txt for how to use this. */ @@ -94,7 +97,7 @@ #define VERSION "pktgen version 1.32" static char version[] __initdata = - "pktgen.c: v1.3: Packet Generator for packet performance testing.\n"; + "pktgen.c: v1.4: Packet Generator for packet performance testing.\n"; /* Used to help with determining the pkts on receive */ @@ -584,15 +587,48 @@ static struct sk_buff *fill_packet(struct net_device *odev, struct pktgen_info* return skb; } +static void show_results(struct pktgen_info* info, int nr_frags) +{ + __u64 total, bps, mbps, pps; + unsigned long idle; + int size = info->pkt_size + 4; /* incl 32bit ethernet CRC */ + char *p = info->result; + + total = (info->stopped_at.tv_sec - info->started_at.tv_sec) * 1000000ull + + info->stopped_at.tv_usec - info->started_at.tv_usec; + + BUG_ON(cpu_speed == 0); + + idle = info->idle_acc; + do_div(idle, cpu_speed); + + p += sprintf(p, "OK: %llu(c%llu+d%lu) usec, %llu (%dbyte,%dfrags)\n", + total, total - idle, idle, + info->sofar, size, nr_frags); + + pps = info->sofar * USEC_PER_SEC; + + while ((total >> 32) != 0) { + pps >>= 1; + total >>= 1; + } + + do_div(pps, total); + + bps = pps * 8 * size; + + mbps = bps; + do_div(mbps, 1000000); + p += sprintf(p, " %llupps %lluMb/sec (%llubps) errors: %llu", + pps, mbps, bps, info->errors); +} static void inject(struct pktgen_info* info) { - struct net_device *odev = NULL; + struct net_device *odev; struct sk_buff *skb = NULL; - __u64 total = 0; - __u64 idle = 0; __u64 lcount = 0; - int nr_frags = 0; + int ret; int last_ok = 1; /* Was last skb sent? * Or a failed transmit of some sort? This will keep * sequence numbers in order, for example. @@ -632,28 +668,30 @@ static void inject(struct pktgen_info* info) } } - nr_frags = skb_shinfo(skb)->nr_frags; - if (!(odev->features & NETIF_F_LLTX)) spin_lock_bh(&odev->xmit_lock); if (!netif_queue_stopped(odev)) { atomic_inc(&skb->users); - if (odev->hard_start_xmit(skb, odev)) { - + retry: + ret = odev->hard_start_xmit(skb, odev); + if (likely(ret == NETDEV_TX_OK)) { + last_ok = 1; + info->sofar++; + info->seq_num++; + } else if (ret == NETDEV_TX_LOCKED + && (odev->features & NETIF_F_LLTX)) { + cpu_relax(); + goto retry; + } else { atomic_dec(&skb->users); - if (net_ratelimit()) { + if (debug && net_ratelimit()) { printk(KERN_INFO "Hard xmit error\n"); } info->errors++; last_ok = 0; } - else { - last_ok = 1; - info->sofar++; - info->seq_num++; - } } else { /* Re-try it next time */ @@ -725,38 +763,7 @@ static void inject(struct pktgen_info* info) do_gettimeofday(&(info->stopped_at)); - total = (info->stopped_at.tv_sec - info->started_at.tv_sec) * 1000000 + - info->stopped_at.tv_usec - info->started_at.tv_usec; - - idle = (__u32)(info->idle_acc)/(__u32)(cpu_speed); - - { - char *p = info->result; - __u64 bps, pps = 0; - - if (total > 1000) - pps = (__u32)(info->sofar * 1000) / ((__u32)(total) / 1000); - else if(total > 100) - pps = (__u32)(info->sofar * 10000) / ((__u32)(total) / 100); - else if(total > 10) - pps = (__u32)(info->sofar * 100000) / ((__u32)(total) / 10); - else if(total > 1) - pps = (__u32)(info->sofar * 1000000) / (__u32)total; - - bps = pps * 8 * (info->pkt_size + 4); /* take 32bit ethernet CRC into account */ - p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags) %llupps %lluMb/sec (%llubps) errors: %llu", - (unsigned long long) total, - (unsigned long long) (total - idle), - (unsigned long long) idle, - (unsigned long long) info->sofar, - skb->len + 4, /* Add 4 to account for the ethernet checksum */ - nr_frags, - (unsigned long long) pps, - (unsigned long long) (bps / (u64) 1024 / (u64) 1024), - (unsigned long long) bps, - (unsigned long long) info->errors - ); - } + show_results(info, skb_shinfo(skb)->nr_frags); kfree_skb(skb); diff --git a/net/ipv4/Makefile b/net/ipv4/Makefile index a7a7a35574d4..38f75099674f 100644 --- a/net/ipv4/Makefile +++ b/net/ipv4/Makefile @@ -11,7 +11,6 @@ obj-y := utils.o route.o inetpeer.o protocol.o \ obj-$(CONFIG_PROC_FS) += proc.o obj-$(CONFIG_IP_MULTIPLE_TABLES) += fib_rules.o -obj-$(CONFIG_IP_ROUTE_NAT) += ip_nat_dumb.o obj-$(CONFIG_IP_MROUTE) += ipmr.o obj-$(CONFIG_NET_IPIP) += ipip.o obj-$(CONFIG_NET_IPGRE) += ip_gre.o diff --git a/net/ipv4/fib_hash.c b/net/ipv4/fib_hash.c index a7ef851edb1d..15cd8e55b796 100644 --- a/net/ipv4/fib_hash.c +++ b/net/ipv4/fib_hash.c @@ -109,7 +109,7 @@ static struct hlist_head *fz_hash_alloc(int divisor) { unsigned long size = divisor * sizeof(struct hlist_head); - if (divisor <= 1024) { + if (size <= PAGE_SIZE) { return kmalloc(size, GFP_KERNEL); } else { return (struct hlist_head *) @@ -141,11 +141,12 @@ static inline void fn_rebuild_zone(struct fn_zone *fz, static void fz_hash_free(struct hlist_head *hash, int divisor) { - if (divisor <= 1024) + unsigned long size = divisor * sizeof(struct hlist_head); + + if (size <= PAGE_SIZE) kfree(hash); else - free_pages((unsigned long) hash, - get_order(divisor * sizeof(struct hlist_head))); + free_pages((unsigned long)hash, get_order(size)); } static void fn_rehash_zone(struct fn_zone *fz) @@ -447,7 +448,7 @@ static struct fib_alias *fib_find_alias(struct fib_node *fn, u8 tos, u32 prio) if (prio <= fa->fa_info->fib_priority) break; } - return fa; + return prev_fa; } return NULL; } @@ -537,6 +538,8 @@ fn_hash_insert(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, */ fa_orig = fa; list_for_each_entry(fa, fa_orig->fa_list.prev, fa_list) { + if (fa->fa_tos != tos) + break; if (fa->fa_info->fib_priority != fi->fib_priority) break; if (fa->fa_type == type && @@ -608,6 +611,7 @@ fn_hash_delete(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, struct fn_hash *table = (struct fn_hash*)tb->tb_data; struct fib_node *f; struct fib_alias *fa, *fa_to_delete; + struct list_head *fa_head; int z = r->rtm_dst_len; struct fn_zone *fz; u32 key; @@ -633,9 +637,13 @@ fn_hash_delete(struct fib_table *tb, struct rtmsg *r, struct kern_rta *rta, return -ESRCH; fa_to_delete = NULL; - list_for_each_entry(fa, fa->fa_list.prev, fa_list) { + fa_head = fa->fa_list.prev; + list_for_each_entry(fa, fa_head, fa_list) { struct fib_info *fi = fa->fa_info; + if (fa->fa_tos != tos) + break; + if ((!r->rtm_type || fa->fa_type == r->rtm_type) && (r->rtm_scope == RT_SCOPE_NOWHERE || diff --git a/net/ipv4/netfilter/ip_nat_helper.c b/net/ipv4/netfilter/ip_nat_helper.c index ede6757e5401..e065a1ed0922 100644 --- a/net/ipv4/netfilter/ip_nat_helper.c +++ b/net/ipv4/netfilter/ip_nat_helper.c @@ -73,7 +73,7 @@ adjust_tcp_sequence(u32 seq, LOCK_BH(&ip_nat_seqofs_lock); - /* SYN adjust. If it's uninitialized, of this is after last + /* SYN adjust. If it's uninitialized, or this is after last * correction, record it: we don't handle more than one * adjustment in the window, but do deal with common case of a * retransmit */ diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c index 835c92afcdcf..2317ae179be9 100644 --- a/net/xfrm/xfrm_state.c +++ b/net/xfrm/xfrm_state.c @@ -592,7 +592,6 @@ static struct xfrm_state *__xfrm_find_acq_byseq(u32 seq) list_for_each_entry(x, xfrm_state_bydst+i, bydst) { if (x->km.seq == seq) { xfrm_state_hold(x); - spin_unlock_bh(&xfrm_state_lock); return x; } } |
