Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

Conflicts:
drivers/net/ethernet/atheros/atlx/atl1.c
drivers/net/ethernet/atheros/atlx/atl1.h

Resolved a conflict between a DMA error bug fix and NAPI
support changes in the atl1 driver.

Signed-off-by: David S. Miller <davem@davemloft.net>

+167 -99
+2 -2
MAINTAINERS
··· 7572 7572 F: fs/xfs/ 7573 7573 7574 7574 XILINX AXI ETHERNET DRIVER 7575 - M: Ariane Keller <ariane.keller@tik.ee.ethz.ch> 7576 - M: Daniel Borkmann <daniel.borkmann@tik.ee.ethz.ch> 7575 + M: Anirudha Sarangi <anirudh@xilinx.com> 7576 + M: John Linn <John.Linn@xilinx.com> 7577 7577 S: Maintained 7578 7578 F: drivers/net/ethernet/xilinx/xilinx_axienet* 7579 7579
+5 -7
drivers/net/ethernet/atheros/atlx/atl1.c
··· 2528 2528 "pcie phy link down %x\n", status); 2529 2529 if (netif_running(adapter->netdev)) { /* reset MAC */ 2530 2530 atlx_irq_disable(adapter); 2531 - schedule_work(&adapter->pcie_dma_to_rst_task); 2531 + schedule_work(&adapter->reset_dev_task); 2532 2532 return IRQ_HANDLED; 2533 2533 } 2534 2534 } ··· 2540 2540 "pcie DMA r/w error (status = 0x%x)\n", 2541 2541 status); 2542 2542 atlx_irq_disable(adapter); 2543 - schedule_work(&adapter->pcie_dma_to_rst_task); 2543 + schedule_work(&adapter->reset_dev_task); 2544 2544 return IRQ_HANDLED; 2545 2545 } 2546 2546 ··· 2681 2681 atl1_clean_rx_ring(adapter); 2682 2682 } 2683 2683 2684 - static void atl1_tx_timeout_task(struct work_struct *work) 2684 + static void atl1_reset_dev_task(struct work_struct *work) 2685 2685 { 2686 2686 struct atl1_adapter *adapter = 2687 - container_of(work, struct atl1_adapter, tx_timeout_task); 2687 + container_of(work, struct atl1_adapter, reset_dev_task); 2688 2688 struct net_device *netdev = adapter->netdev; 2689 2689 2690 2690 netif_device_detach(netdev); ··· 3087 3087 (unsigned long)adapter); 3088 3088 adapter->phy_timer_pending = false; 3089 3089 3090 - INIT_WORK(&adapter->tx_timeout_task, atl1_tx_timeout_task); 3090 + INIT_WORK(&adapter->reset_dev_task, atl1_reset_dev_task); 3091 3091 3092 3092 INIT_WORK(&adapter->link_chg_task, atlx_link_chg_task); 3093 - 3094 - INIT_WORK(&adapter->pcie_dma_to_rst_task, atl1_tx_timeout_task); 3095 3093 3096 3094 err = register_netdev(netdev); 3097 3095 if (err)
+1 -1
drivers/net/ethernet/atheros/atlx/atl1.h
··· 764 764 spinlock_t lock; 765 765 struct napi_struct napi; 766 766 struct work_struct tx_timeout_task; 767 + struct work_struct reset_dev_task; 767 768 struct work_struct link_chg_task; 768 - struct work_struct pcie_dma_to_rst_task; 769 769 770 770 struct timer_list phy_config_timer; 771 771 bool phy_timer_pending;
+1 -1
drivers/net/ethernet/atheros/atlx/atlx.c
··· 201 201 { 202 202 struct atlx_adapter *adapter = netdev_priv(netdev); 203 203 /* Do the reset outside of interrupt context */ 204 - schedule_work(&adapter->tx_timeout_task); 204 + schedule_work(&adapter->reset_dev_task); 205 205 } 206 206 207 207 /*
+10 -5
drivers/net/ethernet/intel/e1000e/ich8lan.c
··· 1310 1310 1311 1311 if (mac_reg & E1000_PHY_CTRL_D0A_LPLU) 1312 1312 oem_reg |= HV_OEM_BITS_LPLU; 1313 - 1314 - /* Set Restart auto-neg to activate the bits */ 1315 - if (!hw->phy.ops.check_reset_block(hw)) 1316 - oem_reg |= HV_OEM_BITS_RESTART_AN; 1317 1313 } else { 1318 1314 if (mac_reg & (E1000_PHY_CTRL_GBE_DISABLE | 1319 1315 E1000_PHY_CTRL_NOND0A_GBE_DISABLE)) ··· 1319 1323 E1000_PHY_CTRL_NOND0A_LPLU)) 1320 1324 oem_reg |= HV_OEM_BITS_LPLU; 1321 1325 } 1326 + 1327 + /* Set Restart auto-neg to activate the bits */ 1328 + if ((d0_state || (hw->mac.type != e1000_pchlan)) && 1329 + !hw->phy.ops.check_reset_block(hw)) 1330 + oem_reg |= HV_OEM_BITS_RESTART_AN; 1322 1331 1323 1332 ret_val = hw->phy.ops.write_reg_locked(hw, HV_OEM_BITS, oem_reg); 1324 1333 ··· 3683 3682 3684 3683 if (hw->mac.type >= e1000_pchlan) { 3685 3684 e1000_oem_bits_config_ich8lan(hw, false); 3686 - e1000_phy_hw_reset_ich8lan(hw); 3685 + 3686 + /* Reset PHY to activate OEM bits on 82577/8 */ 3687 + if (hw->mac.type == e1000_pchlan) 3688 + e1000e_phy_hw_reset_generic(hw); 3689 + 3687 3690 ret_val = hw->phy.ops.acquire(hw); 3688 3691 if (ret_val) 3689 3692 return;
+10
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
··· 4865 4865 if (wufc) { 4866 4866 ixgbe_set_rx_mode(netdev); 4867 4867 4868 + /* 4869 + * enable the optics for both mult-speed fiber and 4870 + * 82599 SFP+ fiber as we can WoL. 4871 + */ 4872 + if (hw->mac.ops.enable_tx_laser && 4873 + (hw->phy.multispeed_fiber || 4874 + (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_fiber && 4875 + hw->mac.type == ixgbe_mac_82599EB))) 4876 + hw->mac.ops.enable_tx_laser(hw); 4877 + 4868 4878 /* turn on all-multi mode if wake on multicast is enabled */ 4869 4879 if (wufc & IXGBE_WUFC_MC) { 4870 4880 fctrl = IXGBE_READ_REG(hw, IXGBE_FCTRL);
+4 -4
drivers/net/ethernet/micrel/ks8851.c
··· 1418 1418 struct net_device *ndev; 1419 1419 struct ks8851_net *ks; 1420 1420 int ret; 1421 + unsigned cider; 1421 1422 1422 1423 ndev = alloc_etherdev(sizeof(struct ks8851_net)); 1423 1424 if (!ndev) ··· 1485 1484 ks8851_soft_reset(ks, GRR_GSR); 1486 1485 1487 1486 /* simple check for a valid chip being connected to the bus */ 1488 - 1489 - if ((ks8851_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { 1487 + cider = ks8851_rdreg16(ks, KS_CIDER); 1488 + if ((cider & ~CIDER_REV_MASK) != CIDER_ID) { 1490 1489 dev_err(&spi->dev, "failed to read device ID\n"); 1491 1490 ret = -ENODEV; 1492 1491 goto err_id; ··· 1517 1516 } 1518 1517 1519 1518 netdev_info(ndev, "revision %d, MAC %pM, IRQ %d, %s EEPROM\n", 1520 - CIDER_REV_GET(ks8851_rdreg16(ks, KS_CIDER)), 1521 - ndev->dev_addr, ndev->irq, 1519 + CIDER_REV_GET(cider), ndev->dev_addr, ndev->irq, 1522 1520 ks->rc_ccr & CCR_EEPROM ? "has" : "no"); 1523 1521 1524 1522 return 0;
+1 -1
drivers/net/ethernet/micrel/ks8851_mll.c
··· 40 40 #define DRV_NAME "ks8851_mll" 41 41 42 42 static u8 KS_DEFAULT_MAC_ADDRESS[] = { 0x00, 0x10, 0xA1, 0x86, 0x95, 0x11 }; 43 - #define MAX_RECV_FRAMES 32 43 + #define MAX_RECV_FRAMES 255 44 44 #define MAX_BUF_SIZE 2048 45 45 #define TX_BUF_SIZE 2000 46 46 #define RX_BUF_SIZE 2000
+8 -2
drivers/net/ethernet/realtek/8139cp.c
··· 961 961 cpw8(Cmd, RxOn | TxOn); 962 962 } 963 963 964 + static void cp_enable_irq(struct cp_private *cp) 965 + { 966 + cpw16_f(IntrMask, cp_intr_mask); 967 + } 968 + 964 969 static void cp_init_hw (struct cp_private *cp) 965 970 { 966 971 struct net_device *dev = cp->dev; ··· 1004 999 cpw32_f(TxRingAddr + 4, (ring_dma >> 16) >> 16); 1005 1000 1006 1001 cpw16(MultiIntr, 0); 1007 - 1008 - cpw16_f(IntrMask, cp_intr_mask); 1009 1002 1010 1003 cpw8_f(Cfg9346, Cfg9346_Lock); 1011 1004 } ··· 1136 1133 rc = request_irq(irq, cp_interrupt, IRQF_SHARED, dev->name, dev); 1137 1134 if (rc) 1138 1135 goto err_out_hw; 1136 + 1137 + cp_enable_irq(cp); 1139 1138 1140 1139 netif_carrier_off(dev); 1141 1140 mii_check_media(&cp->mii_if, netif_msg_link(cp), true); ··· 2037 2032 /* FIXME: sh*t may happen if the Rx ring buffer is depleted */ 2038 2033 cp_init_rings_index (cp); 2039 2034 cp_init_hw (cp); 2035 + cp_enable_irq(cp); 2040 2036 netif_start_queue (dev); 2041 2037 2042 2038 spin_lock_irqsave (&cp->lock, flags);
+5 -9
drivers/net/ethernet/smsc/smsc911x.c
··· 1166 1166 1167 1167 /* Quickly dumps bad packets */ 1168 1168 static void 1169 - smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktbytes) 1169 + smsc911x_rx_fastforward(struct smsc911x_data *pdata, unsigned int pktwords) 1170 1170 { 1171 - unsigned int pktwords = (pktbytes + NET_IP_ALIGN + 3) >> 2; 1172 - 1173 1171 if (likely(pktwords >= 4)) { 1174 1172 unsigned int timeout = 500; 1175 1173 unsigned int val; ··· 1231 1233 continue; 1232 1234 } 1233 1235 1234 - skb = netdev_alloc_skb(dev, pktlength + NET_IP_ALIGN); 1236 + skb = netdev_alloc_skb(dev, pktwords << 2); 1235 1237 if (unlikely(!skb)) { 1236 1238 SMSC_WARN(pdata, rx_err, 1237 1239 "Unable to allocate skb for rx packet"); ··· 1241 1243 break; 1242 1244 } 1243 1245 1244 - skb->data = skb->head; 1245 - skb_reset_tail_pointer(skb); 1246 + pdata->ops->rx_readfifo(pdata, 1247 + (unsigned int *)skb->data, pktwords); 1246 1248 1247 1249 /* Align IP on 16B boundary */ 1248 1250 skb_reserve(skb, NET_IP_ALIGN); 1249 1251 skb_put(skb, pktlength - 4); 1250 - pdata->ops->rx_readfifo(pdata, 1251 - (unsigned int *)skb->head, pktwords); 1252 1252 skb->protocol = eth_type_trans(skb, dev); 1253 1253 skb_checksum_none_assert(skb); 1254 1254 netif_receive_skb(skb); ··· 1561 1565 smsc911x_reg_write(pdata, FIFO_INT, temp); 1562 1566 1563 1567 /* set RX Data offset to 2 bytes for alignment */ 1564 - smsc911x_reg_write(pdata, RX_CFG, (2 << 8)); 1568 + smsc911x_reg_write(pdata, RX_CFG, (NET_IP_ALIGN << 8)); 1565 1569 1566 1570 /* enable NAPI polling before enabling RX interrupts */ 1567 1571 napi_enable(&pdata->napi);
+1 -3
drivers/net/ethernet/xilinx/xilinx_axienet.h
··· 2 2 * Definitions for Xilinx Axi Ethernet device driver. 3 3 * 4 4 * Copyright (c) 2009 Secret Lab Technologies, Ltd. 5 - * Copyright (c) 2010 Xilinx, Inc. All rights reserved. 6 - * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch> 7 - * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch> 5 + * Copyright (c) 2010 - 2012 Xilinx, Inc. All rights reserved. 8 6 */ 9 7 10 8 #ifndef XILINX_AXIENET_H
+3 -3
drivers/net/ethernet/xilinx/xilinx_axienet_main.c
··· 4 4 * Copyright (c) 2008 Nissin Systems Co., Ltd., Yoshio Kashiwagi 5 5 * Copyright (c) 2005-2008 DLA Systems, David H. Lynch Jr. <dhlii@dlasys.net> 6 6 * Copyright (c) 2008-2009 Secret Lab Technologies Ltd. 7 - * Copyright (c) 2010 Xilinx, Inc. All rights reserved. 8 - * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch> 9 - * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch> 7 + * Copyright (c) 2010 - 2011 Michal Simek <monstr@monstr.eu> 8 + * Copyright (c) 2010 - 2011 PetaLogix 9 + * Copyright (c) 2010 - 2012 Xilinx, Inc. All rights reserved. 10 10 * 11 11 * This is a driver for the Xilinx Axi Ethernet which is used in the Virtex6 12 12 * and Spartan6.
+3 -3
drivers/net/ethernet/xilinx/xilinx_axienet_mdio.c
··· 2 2 * MDIO bus driver for the Xilinx Axi Ethernet device 3 3 * 4 4 * Copyright (c) 2009 Secret Lab Technologies, Ltd. 5 - * Copyright (c) 2010 Xilinx, Inc. All rights reserved. 6 - * Copyright (c) 2012 Daniel Borkmann, <daniel.borkmann@tik.ee.ethz.ch> 7 - * Copyright (c) 2012 Ariane Keller, <ariane.keller@tik.ee.ethz.ch> 5 + * Copyright (c) 2010 - 2011 Michal Simek <monstr@monstr.eu> 6 + * Copyright (c) 2010 - 2011 PetaLogix 7 + * Copyright (c) 2010 - 2012 Xilinx, Inc. All rights reserved. 8 8 */ 9 9 10 10 #include <linux/of_address.h>
+6 -9
drivers/net/ppp/ppp_generic.c
··· 235 235 /* Prototypes. */ 236 236 static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, 237 237 struct file *file, unsigned int cmd, unsigned long arg); 238 - static int ppp_xmit_process(struct ppp *ppp); 238 + static void ppp_xmit_process(struct ppp *ppp); 239 239 static void ppp_send_frame(struct ppp *ppp, struct sk_buff *skb); 240 240 static void ppp_push(struct ppp *ppp); 241 241 static void ppp_channel_push(struct channel *pch); ··· 969 969 put_unaligned_be16(proto, pp); 970 970 971 971 skb_queue_tail(&ppp->file.xq, skb); 972 - if (!ppp_xmit_process(ppp)) 973 - netif_stop_queue(dev); 972 + ppp_xmit_process(ppp); 974 973 return NETDEV_TX_OK; 975 974 976 975 outf: ··· 1047 1048 * Called to do any work queued up on the transmit side 1048 1049 * that can now be done. 1049 1050 */ 1050 - static int 1051 + static void 1051 1052 ppp_xmit_process(struct ppp *ppp) 1052 1053 { 1053 1054 struct sk_buff *skb; 1054 - int ret = 0; 1055 1055 1056 1056 ppp_xmit_lock(ppp); 1057 1057 if (!ppp->closing) { ··· 1060 1062 ppp_send_frame(ppp, skb); 1061 1063 /* If there's no work left to do, tell the core net 1062 1064 code that we can accept some more. */ 1063 - if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) { 1065 + if (!ppp->xmit_pending && !skb_peek(&ppp->file.xq)) 1064 1066 netif_wake_queue(ppp->dev); 1065 - ret = 1; 1066 - } 1067 + else 1068 + netif_stop_queue(ppp->dev); 1067 1069 } 1068 1070 ppp_xmit_unlock(ppp); 1069 - return ret; 1070 1071 } 1071 1072 1072 1073 static inline struct sk_buff *
+1 -1
drivers/vhost/net.c
··· 238 238 239 239 vq->heads[vq->upend_idx].len = len; 240 240 ubuf->callback = vhost_zerocopy_callback; 241 - ubuf->arg = vq->ubufs; 241 + ubuf->ctx = vq->ubufs; 242 242 ubuf->desc = vq->upend_idx; 243 243 msg.msg_control = ubuf; 244 244 msg.msg_controllen = sizeof(ubuf);
+2 -3
drivers/vhost/vhost.c
··· 1598 1598 kfree(ubufs); 1599 1599 } 1600 1600 1601 - void vhost_zerocopy_callback(void *arg) 1601 + void vhost_zerocopy_callback(struct ubuf_info *ubuf) 1602 1602 { 1603 - struct ubuf_info *ubuf = arg; 1604 - struct vhost_ubuf_ref *ubufs = ubuf->arg; 1603 + struct vhost_ubuf_ref *ubufs = ubuf->ctx; 1605 1604 struct vhost_virtqueue *vq = ubufs->vq; 1606 1605 1607 1606 /* set len = 1 to mark this desc buffers done DMA */
+1 -1
drivers/vhost/vhost.h
··· 188 188 189 189 int vhost_log_write(struct vhost_virtqueue *vq, struct vhost_log *log, 190 190 unsigned int log_num, u64 len); 191 - void vhost_zerocopy_callback(void *arg); 191 + void vhost_zerocopy_callback(struct ubuf_info *); 192 192 int vhost_zerocopy_signal_used(struct vhost_virtqueue *vq); 193 193 194 194 #define vq_err(vq, fmt, ...) do { \
+4 -3
include/linux/skbuff.h
··· 238 238 /* 239 239 * The callback notifies userspace to release buffers when skb DMA is done in 240 240 * lower device, the skb last reference should be 0 when calling this. 241 - * The desc is used to track userspace buffer index. 241 + * The ctx field is used to track device context. 242 + * The desc field is used to track userspace buffer index. 242 243 */ 243 244 struct ubuf_info { 244 - void (*callback)(void *); 245 - void *arg; 245 + void (*callback)(struct ubuf_info *); 246 + void *ctx; 246 247 unsigned long desc; 247 248 }; 248 249
+5 -1
include/net/dst.h
··· 36 36 struct net_device *dev; 37 37 struct dst_ops *ops; 38 38 unsigned long _metrics; 39 - unsigned long expires; 39 + union { 40 + unsigned long expires; 41 + /* point to where the dst_entry copied from */ 42 + struct dst_entry *from; 43 + }; 40 44 struct dst_entry *path; 41 45 struct neighbour __rcu *_neighbour; 42 46 #ifdef CONFIG_XFRM
+42
include/net/ip6_fib.h
··· 123 123 return ((struct rt6_info *)dst)->rt6i_idev; 124 124 } 125 125 126 + static inline void rt6_clean_expires(struct rt6_info *rt) 127 + { 128 + if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) 129 + dst_release(rt->dst.from); 130 + 131 + rt->rt6i_flags &= ~RTF_EXPIRES; 132 + rt->dst.expires = 0; 133 + } 134 + 135 + static inline void rt6_set_expires(struct rt6_info *rt, unsigned long expires) 136 + { 137 + if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) 138 + dst_release(rt->dst.from); 139 + 140 + rt->rt6i_flags |= RTF_EXPIRES; 141 + rt->dst.expires = expires; 142 + } 143 + 144 + static inline void rt6_update_expires(struct rt6_info *rt, int timeout) 145 + { 146 + if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) 147 + dst_release(rt->dst.from); 148 + 149 + dst_set_expires(&rt->dst, timeout); 150 + rt->rt6i_flags |= RTF_EXPIRES; 151 + } 152 + 153 + static inline void rt6_set_from(struct rt6_info *rt, struct rt6_info *from) 154 + { 155 + struct dst_entry *new = (struct dst_entry *) from; 156 + 157 + if (!(rt->rt6i_flags & RTF_EXPIRES) && rt->dst.from) { 158 + if (new == rt->dst.from) 159 + return; 160 + dst_release(rt->dst.from); 161 + } 162 + 163 + rt->rt6i_flags &= ~RTF_EXPIRES; 164 + rt->dst.from = new; 165 + dst_hold(new); 166 + } 167 + 126 168 struct fib6_walker_t { 127 169 struct list_head lh; 128 170 struct fib6_node *root, *node;
+3 -6
net/ipv6/addrconf.c
··· 802 802 ip6_del_rt(rt); 803 803 rt = NULL; 804 804 } else if (!(rt->rt6i_flags & RTF_EXPIRES)) { 805 - rt->dst.expires = expires; 806 - rt->rt6i_flags |= RTF_EXPIRES; 805 + rt6_set_expires(rt, expires); 807 806 } 808 807 } 809 808 dst_release(&rt->dst); ··· 1885 1886 rt = NULL; 1886 1887 } else if (addrconf_finite_timeout(rt_expires)) { 1887 1888 /* not infinity */ 1888 - rt->dst.expires = jiffies + rt_expires; 1889 - rt->rt6i_flags |= RTF_EXPIRES; 1889 + rt6_set_expires(rt, jiffies + rt_expires); 1890 1890 } else { 1891 - rt->rt6i_flags &= ~RTF_EXPIRES; 1892 - rt->dst.expires = 0; 1891 + rt6_clean_expires(rt); 1893 1892 } 1894 1893 } else if (valid_lft) { 1895 1894 clock_t expires = 0;
+4 -5
net/ipv6/ip6_fib.c
··· 673 673 &rt->rt6i_gateway)) { 674 674 if (!(iter->rt6i_flags & RTF_EXPIRES)) 675 675 return -EEXIST; 676 - iter->dst.expires = rt->dst.expires; 677 - if (!(rt->rt6i_flags & RTF_EXPIRES)) { 678 - iter->rt6i_flags &= ~RTF_EXPIRES; 679 - iter->dst.expires = 0; 680 - } 676 + if (!(rt->rt6i_flags & RTF_EXPIRES)) 677 + rt6_clean_expires(iter); 678 + else 679 + rt6_set_expires(iter, rt->dst.expires); 681 680 return -EEXIST; 682 681 } 683 682 }
+1 -2
net/ipv6/ndisc.c
··· 1267 1267 } 1268 1268 1269 1269 if (rt) 1270 - rt->dst.expires = jiffies + (HZ * lifetime); 1271 - 1270 + rt6_set_expires(rt, jiffies + (HZ * lifetime)); 1272 1271 if (ra_msg->icmph.icmp6_hop_limit) { 1273 1272 in6_dev->cnf.hop_limit = ra_msg->icmph.icmp6_hop_limit; 1274 1273 if (rt)
+44 -27
net/ipv6/route.c
··· 62 62 #include <linux/sysctl.h> 63 63 #endif 64 64 65 - static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, 65 + static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, 66 66 const struct in6_addr *dest); 67 67 static struct dst_entry *ip6_dst_check(struct dst_entry *dst, u32 cookie); 68 68 static unsigned int ip6_default_advmss(const struct dst_entry *dst); ··· 285 285 rt->rt6i_idev = NULL; 286 286 in6_dev_put(idev); 287 287 } 288 + 289 + if (!(rt->rt6i_flags & RTF_EXPIRES) && dst->from) 290 + dst_release(dst->from); 291 + 288 292 if (peer) { 289 293 rt->rt6i_peer = NULL; 290 294 inet_putpeer(peer); ··· 333 329 334 330 static __inline__ int rt6_check_expired(const struct rt6_info *rt) 335 331 { 336 - return (rt->rt6i_flags & RTF_EXPIRES) && 337 - time_after(jiffies, rt->dst.expires); 332 + struct rt6_info *ort = NULL; 333 + 334 + if (rt->rt6i_flags & RTF_EXPIRES) { 335 + if (time_after(jiffies, rt->dst.expires)) 336 + return 1; 337 + } else if (rt->dst.from) { 338 + ort = (struct rt6_info *) rt->dst.from; 339 + return (ort->rt6i_flags & RTF_EXPIRES) && 340 + time_after(jiffies, ort->dst.expires); 341 + } 342 + return 0; 338 343 } 339 344 340 345 static inline int rt6_need_strict(const struct in6_addr *daddr) ··· 633 620 (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref); 634 621 635 622 if (rt) { 636 - if (!addrconf_finite_timeout(lifetime)) { 637 - rt->rt6i_flags &= ~RTF_EXPIRES; 638 - } else { 639 - rt->dst.expires = jiffies + HZ * lifetime; 640 - rt->rt6i_flags |= RTF_EXPIRES; 641 - } 623 + if (!addrconf_finite_timeout(lifetime)) 624 + rt6_clean_expires(rt); 625 + else 626 + rt6_set_expires(rt, jiffies + HZ * lifetime); 627 + 642 628 dst_release(&rt->dst); 643 629 } 644 630 return 0; ··· 742 730 return __ip6_ins_rt(rt, &info); 743 731 } 744 732 745 - static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort, 733 + static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, 746 734 const struct in6_addr *daddr, 747 735 const struct in6_addr *saddr) 748 736 { ··· 966 954 rt->rt6i_idev = ort->rt6i_idev; 967 955 if (rt->rt6i_idev) 968 956 in6_dev_hold(rt->rt6i_idev); 969 - rt->dst.expires = 0; 970 957 971 958 rt->rt6i_gateway = ort->rt6i_gateway; 972 - rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; 959 + rt->rt6i_flags = ort->rt6i_flags; 960 + rt6_clean_expires(rt); 973 961 rt->rt6i_metric = 0; 974 962 975 963 memcpy(&rt->rt6i_dst, &ort->rt6i_dst, sizeof(struct rt6key)); ··· 1031 1019 1032 1020 rt = (struct rt6_info *) skb_dst(skb); 1033 1021 if (rt) { 1034 - if (rt->rt6i_flags & RTF_CACHE) { 1035 - dst_set_expires(&rt->dst, 0); 1036 - rt->rt6i_flags |= RTF_EXPIRES; 1037 - } else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) 1022 + if (rt->rt6i_flags & RTF_CACHE) 1023 + rt6_update_expires(rt, 0); 1024 + else if (rt->rt6i_node && (rt->rt6i_flags & RTF_DEFAULT)) 1038 1025 rt->rt6i_node->fn_sernum = -1; 1039 1026 } 1040 1027 } ··· 1300 1289 } 1301 1290 1302 1291 rt->dst.obsolete = -1; 1303 - rt->dst.expires = (cfg->fc_flags & RTF_EXPIRES) ? 1304 - jiffies + clock_t_to_jiffies(cfg->fc_expires) : 1305 - 0; 1292 + 1293 + if (cfg->fc_flags & RTF_EXPIRES) 1294 + rt6_set_expires(rt, jiffies + 1295 + clock_t_to_jiffies(cfg->fc_expires)); 1296 + else 1297 + rt6_clean_expires(rt); 1306 1298 1307 1299 if (cfg->fc_protocol == RTPROT_UNSPEC) 1308 1300 cfg->fc_protocol = RTPROT_BOOT; ··· 1750 1736 features |= RTAX_FEATURE_ALLFRAG; 1751 1737 dst_metric_set(&rt->dst, RTAX_FEATURES, features); 1752 1738 } 1753 - dst_set_expires(&rt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); 1754 - rt->rt6i_flags |= RTF_MODIFIED|RTF_EXPIRES; 1739 + rt6_update_expires(rt, net->ipv6.sysctl.ip6_rt_mtu_expires); 1740 + rt->rt6i_flags |= RTF_MODIFIED; 1755 1741 goto out; 1756 1742 } 1757 1743 ··· 1779 1765 * which is 10 mins. After 10 mins the decreased pmtu is expired 1780 1766 * and detecting PMTU increase will be automatically happened. 1781 1767 */ 1782 - dst_set_expires(&nrt->dst, net->ipv6.sysctl.ip6_rt_mtu_expires); 1783 - nrt->rt6i_flags |= RTF_DYNAMIC|RTF_EXPIRES; 1784 - 1768 + rt6_update_expires(nrt, net->ipv6.sysctl.ip6_rt_mtu_expires); 1769 + nrt->rt6i_flags |= RTF_DYNAMIC; 1785 1770 ip6_ins_rt(nrt); 1786 1771 } 1787 1772 out: ··· 1812 1799 * Misc support functions 1813 1800 */ 1814 1801 1815 - static struct rt6_info *ip6_rt_copy(const struct rt6_info *ort, 1802 + static struct rt6_info *ip6_rt_copy(struct rt6_info *ort, 1816 1803 const struct in6_addr *dest) 1817 1804 { 1818 1805 struct net *net = dev_net(ort->dst.dev); ··· 1832 1819 if (rt->rt6i_idev) 1833 1820 in6_dev_hold(rt->rt6i_idev); 1834 1821 rt->dst.lastuse = jiffies; 1835 - rt->dst.expires = 0; 1836 1822 1837 1823 rt->rt6i_gateway = ort->rt6i_gateway; 1838 - rt->rt6i_flags = ort->rt6i_flags & ~RTF_EXPIRES; 1824 + rt->rt6i_flags = ort->rt6i_flags; 1825 + if ((ort->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) == 1826 + (RTF_DEFAULT | RTF_ADDRCONF)) 1827 + rt6_set_from(rt, ort); 1828 + else 1829 + rt6_clean_expires(rt); 1839 1830 rt->rt6i_metric = 0; 1840 1831 1841 1832 #ifdef CONFIG_IPV6_SUBTREES