diff --git a/[refs] b/[refs] index 0b108f5f238e..ba4cd607701c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 02e7cce2bc3ac82b971d1efe489f23ca0b6e1d4a +refs/heads/master: 6b95ed345b9faa4ab3598a82991968f2e9f851bb diff --git a/trunk/arch/powerpc/kernel/perf_event_fsl_emb.c b/trunk/arch/powerpc/kernel/perf_event_fsl_emb.c index 369872f6cf78..babcceecd2ea 100644 --- a/trunk/arch/powerpc/kernel/perf_event_fsl_emb.c +++ b/trunk/arch/powerpc/kernel/perf_event_fsl_emb.c @@ -566,9 +566,9 @@ static void record_and_restart(struct perf_event *event, unsigned long val, * Finally record data if requested. */ if (record) { - struct perf_sample_data data = { - .period = event->hw.last_period, - }; + struct perf_sample_data data; + + perf_sample_data_init(&data, 0); if (perf_event_overflow(event, nmi, &data, regs)) { /* diff --git a/trunk/drivers/net/bnx2x.h b/trunk/drivers/net/bnx2x.h index bb0872a63315..8bd23687c530 100644 --- a/trunk/drivers/net/bnx2x.h +++ b/trunk/drivers/net/bnx2x.h @@ -1062,10 +1062,6 @@ struct bnx2x { /* used to synchronize stats collecting */ int stats_state; - - /* used for synchronization of concurrent threads statistics handling */ - spinlock_t stats_lock; - /* used by dmae command loader */ struct dmae_command stats_dmae; int executer_idx; diff --git a/trunk/drivers/net/bnx2x_main.c b/trunk/drivers/net/bnx2x_main.c index 46167c081727..57ff5b3bcce6 100644 --- a/trunk/drivers/net/bnx2x_main.c +++ b/trunk/drivers/net/bnx2x_main.c @@ -57,8 +57,8 @@ #include "bnx2x_init_ops.h" #include "bnx2x_dump.h" -#define DRV_MODULE_VERSION "1.52.53-2" -#define DRV_MODULE_RELDATE "2010/21/07" +#define DRV_MODULE_VERSION "1.52.53-1" +#define DRV_MODULE_RELDATE "2010/18/04" #define BNX2X_BC_VER 0x040200 #include @@ -3789,8 +3789,6 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) struct eth_query_ramrod_data ramrod_data = {0}; int i, rc; - spin_lock_bh(&bp->stats_lock); - ramrod_data.drv_counter = bp->stats_counter++; ramrod_data.collect_port = bp->port.pmf ? 1 : 0; for_each_queue(bp, i) @@ -3804,8 +3802,6 @@ static void bnx2x_storm_stats_post(struct bnx2x *bp) bp->spq_left++; bp->stats_pending = 1; } - - spin_unlock_bh(&bp->stats_lock); } } @@ -4371,14 +4367,6 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) struct host_func_stats *fstats = bnx2x_sp(bp, func_stats); struct bnx2x_eth_stats *estats = &bp->eth_stats; int i; - u16 cur_stats_counter; - - /* Make sure we use the value of the counter - * used for sending the last stats ramrod. - */ - spin_lock_bh(&bp->stats_lock); - cur_stats_counter = bp->stats_counter - 1; - spin_unlock_bh(&bp->stats_lock); memcpy(&(fstats->total_bytes_received_hi), &(bnx2x_sp(bp, func_stats_base)->total_bytes_received_hi), @@ -4406,22 +4394,25 @@ static int bnx2x_storm_stats_update(struct bnx2x *bp) u32 diff; /* are storm stats valid? */ - if (le16_to_cpu(xclient->stats_counter) != cur_stats_counter) { + if ((u16)(le16_to_cpu(xclient->stats_counter) + 1) != + bp->stats_counter) { DP(BNX2X_MSG_STATS, "[%d] stats not updated by xstorm" " xstorm counter (0x%x) != stats_counter (0x%x)\n", - i, xclient->stats_counter, cur_stats_counter + 1); + i, xclient->stats_counter, bp->stats_counter); return -1; } - if (le16_to_cpu(tclient->stats_counter) != cur_stats_counter) { + if ((u16)(le16_to_cpu(tclient->stats_counter) + 1) != + bp->stats_counter) { DP(BNX2X_MSG_STATS, "[%d] stats not updated by tstorm" " tstorm counter (0x%x) != stats_counter (0x%x)\n", - i, tclient->stats_counter, cur_stats_counter + 1); + i, tclient->stats_counter, bp->stats_counter); return -2; } - if (le16_to_cpu(uclient->stats_counter) != cur_stats_counter) { + if ((u16)(le16_to_cpu(uclient->stats_counter) + 1) != + bp->stats_counter) { DP(BNX2X_MSG_STATS, "[%d] stats not updated by ustorm" " ustorm counter (0x%x) != stats_counter (0x%x)\n", - i, uclient->stats_counter, cur_stats_counter + 1); + i, uclient->stats_counter, bp->stats_counter); return -4; } @@ -4858,18 +4849,16 @@ static const struct { static void bnx2x_stats_handle(struct bnx2x *bp, enum bnx2x_stats_event event) { - enum bnx2x_stats_state state; + enum bnx2x_stats_state state = bp->stats_state; if (unlikely(bp->panic)) return; - /* Protect a state change flow */ - spin_lock_bh(&bp->stats_lock); - state = bp->stats_state; + bnx2x_stats_stm[state][event].action(bp); bp->stats_state = bnx2x_stats_stm[state][event].next_state; - spin_unlock_bh(&bp->stats_lock); - bnx2x_stats_stm[state][event].action(bp); + /* Make sure the state has been "changed" */ + smp_wmb(); if ((event != STATS_EVENT_UPDATE) || netif_msg_timer(bp)) DP(BNX2X_MSG_STATS, "state %d -> event %d -> state %d\n", @@ -9919,7 +9908,6 @@ static int __devinit bnx2x_init_bp(struct bnx2x *bp) mutex_init(&bp->port.phy_mutex); mutex_init(&bp->fw_mb_mutex); - spin_lock_init(&bp->stats_lock); #ifdef BCM_CNIC mutex_init(&bp->cnic_mutex); #endif diff --git a/trunk/drivers/net/bonding/bond_alb.c b/trunk/drivers/net/bonding/bond_alb.c index 8d7dfd2f1e90..df483076eda6 100644 --- a/trunk/drivers/net/bonding/bond_alb.c +++ b/trunk/drivers/net/bonding/bond_alb.c @@ -822,7 +822,7 @@ static int rlb_initialize(struct bonding *bond) /*initialize packet type*/ pk_type->type = cpu_to_be16(ETH_P_ARP); - pk_type->dev = bond->dev; + pk_type->dev = NULL; pk_type->func = rlb_arp_recv; /* register to receive ARPs */ diff --git a/trunk/drivers/net/igb/igb_main.c b/trunk/drivers/net/igb/igb_main.c index cea37e0837ff..3881918f5382 100644 --- a/trunk/drivers/net/igb/igb_main.c +++ b/trunk/drivers/net/igb/igb_main.c @@ -1722,15 +1722,6 @@ static int __devinit igb_probe(struct pci_dev *pdev, u16 eeprom_apme_mask = IGB_EEPROM_APME; u32 part_num; - /* Catch broken hardware that put the wrong VF device ID in - * the PCIe SR-IOV capability. - */ - if (pdev->is_virtfn) { - WARN(1, KERN_ERR "%s (%hx:%hx) should not be a VF!\n", - pci_name(pdev), pdev->vendor, pdev->device); - return -EINVAL; - } - err = pci_enable_device_mem(pdev); if (err) return err; diff --git a/trunk/drivers/net/ixgbe/ixgbe_main.c b/trunk/drivers/net/ixgbe/ixgbe_main.c index 74d9b6df3029..7b5d9764f317 100644 --- a/trunk/drivers/net/ixgbe/ixgbe_main.c +++ b/trunk/drivers/net/ixgbe/ixgbe_main.c @@ -6492,15 +6492,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, #endif u32 part_num, eec; - /* Catch broken hardware that put the wrong VF device ID in - * the PCIe SR-IOV capability. - */ - if (pdev->is_virtfn) { - WARN(1, KERN_ERR "%s (%hx:%hx) should not be a VF!\n", - pci_name(pdev), pdev->vendor, pdev->device); - return -EINVAL; - } - err = pci_enable_device_mem(pdev); if (err) return err; diff --git a/trunk/drivers/net/macvlan.c b/trunk/drivers/net/macvlan.c index f15fe2cf72ae..87e8d4cb4057 100644 --- a/trunk/drivers/net/macvlan.c +++ b/trunk/drivers/net/macvlan.c @@ -499,7 +499,7 @@ static const struct net_device_ops macvlan_netdev_ops = { .ndo_validate_addr = eth_validate_addr, }; -void macvlan_common_setup(struct net_device *dev) +static void macvlan_setup(struct net_device *dev) { ether_setup(dev); @@ -508,12 +508,6 @@ void macvlan_common_setup(struct net_device *dev) dev->destructor = free_netdev; dev->header_ops = &macvlan_hard_header_ops, dev->ethtool_ops = &macvlan_ethtool_ops; -} -EXPORT_SYMBOL_GPL(macvlan_common_setup); - -static void macvlan_setup(struct net_device *dev) -{ - macvlan_common_setup(dev); dev->tx_queue_len = 0; } @@ -711,6 +705,7 @@ int macvlan_link_register(struct rtnl_link_ops *ops) /* common fields */ ops->priv_size = sizeof(struct macvlan_dev); ops->get_tx_queues = macvlan_get_tx_queues; + ops->setup = macvlan_setup; ops->validate = macvlan_validate; ops->maxtype = IFLA_MACVLAN_MAX; ops->policy = macvlan_policy; @@ -724,7 +719,6 @@ EXPORT_SYMBOL_GPL(macvlan_link_register); static struct rtnl_link_ops macvlan_link_ops = { .kind = "macvlan", - .setup = macvlan_setup, .newlink = macvlan_newlink, .dellink = macvlan_dellink, }; diff --git a/trunk/drivers/net/macvtap.c b/trunk/drivers/net/macvtap.c index ff02b836c3c4..a8a94e2f6ddc 100644 --- a/trunk/drivers/net/macvtap.c +++ b/trunk/drivers/net/macvtap.c @@ -180,18 +180,11 @@ static int macvtap_forward(struct net_device *dev, struct sk_buff *skb) { struct macvtap_queue *q = macvtap_get_queue(dev, skb); if (!q) - goto drop; - - if (skb_queue_len(&q->sk.sk_receive_queue) >= dev->tx_queue_len) - goto drop; + return -ENOLINK; skb_queue_tail(&q->sk.sk_receive_queue, skb); wake_up_interruptible_poll(sk_sleep(&q->sk), POLLIN | POLLRDNORM | POLLRDBAND); - return NET_RX_SUCCESS; - -drop: - kfree_skb(skb); - return NET_RX_DROP; + return 0; } /* @@ -242,15 +235,8 @@ static void macvtap_dellink(struct net_device *dev, macvlan_dellink(dev, head); } -static void macvtap_setup(struct net_device *dev) -{ - macvlan_common_setup(dev); - dev->tx_queue_len = TUN_READQ_SIZE; -} - static struct rtnl_link_ops macvtap_link_ops __read_mostly = { .kind = "macvtap", - .setup = macvtap_setup, .newlink = macvtap_newlink, .dellink = macvtap_dellink, }; diff --git a/trunk/drivers/net/s2io.h b/trunk/drivers/net/s2io.h index 7f3a53dcc6ef..5e52c75892df 100644 --- a/trunk/drivers/net/s2io.h +++ b/trunk/drivers/net/s2io.h @@ -65,7 +65,7 @@ static int debug_level = ERR_DBG; /* DEBUG message print. */ #define DBG_PRINT(dbg_level, fmt, args...) do { \ - if (dbg_level <= debug_level) \ + if (dbg_level >= debug_level) \ pr_info(fmt, ##args); \ } while (0) diff --git a/trunk/drivers/net/tun.c b/trunk/drivers/net/tun.c index 63042596f0cf..6ad6fe706312 100644 --- a/trunk/drivers/net/tun.c +++ b/trunk/drivers/net/tun.c @@ -736,18 +736,8 @@ static __inline__ ssize_t tun_put_user(struct tun_struct *tun, gso.gso_type = VIRTIO_NET_HDR_GSO_TCPV6; else if (sinfo->gso_type & SKB_GSO_UDP) gso.gso_type = VIRTIO_NET_HDR_GSO_UDP; - else { - printk(KERN_ERR "tun: unexpected GSO type: " - "0x%x, gso_size %d, hdr_len %d\n", - sinfo->gso_type, gso.gso_size, - gso.hdr_len); - print_hex_dump(KERN_ERR, "tun: ", - DUMP_PREFIX_NONE, - 16, 1, skb->head, - min((int)gso.hdr_len, 64), true); - WARN_ON_ONCE(1); - return -EINVAL; - } + else + BUG(); if (sinfo->gso_type & SKB_GSO_TCP_ECN) gso.gso_type |= VIRTIO_NET_HDR_GSO_ECN; } else diff --git a/trunk/drivers/net/wimax/i2400m/i2400m-usb.h b/trunk/drivers/net/wimax/i2400m/i2400m-usb.h index eb80243e22df..2d7c96d7e865 100644 --- a/trunk/drivers/net/wimax/i2400m/i2400m-usb.h +++ b/trunk/drivers/net/wimax/i2400m/i2400m-usb.h @@ -152,7 +152,6 @@ enum { /* Device IDs */ USB_DEVICE_ID_I6050 = 0x0186, USB_DEVICE_ID_I6050_2 = 0x0188, - USB_DEVICE_ID_I6250 = 0x0187, }; diff --git a/trunk/drivers/net/wimax/i2400m/usb.c b/trunk/drivers/net/wimax/i2400m/usb.c index d3365ac85dde..0d5081d77dc0 100644 --- a/trunk/drivers/net/wimax/i2400m/usb.c +++ b/trunk/drivers/net/wimax/i2400m/usb.c @@ -491,7 +491,6 @@ int i2400mu_probe(struct usb_interface *iface, switch (id->idProduct) { case USB_DEVICE_ID_I6050: case USB_DEVICE_ID_I6050_2: - case USB_DEVICE_ID_I6250: i2400mu->i6050 = 1; break; default: @@ -740,7 +739,6 @@ static struct usb_device_id i2400mu_id_table[] = { { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050) }, { USB_DEVICE(0x8086, USB_DEVICE_ID_I6050_2) }, - { USB_DEVICE(0x8086, USB_DEVICE_ID_I6250) }, { USB_DEVICE(0x8086, 0x0181) }, { USB_DEVICE(0x8086, 0x1403) }, { USB_DEVICE(0x8086, 0x1405) }, diff --git a/trunk/drivers/net/wireless/ath/ath9k/recv.c b/trunk/drivers/net/wireless/ath/ath9k/recv.c index e3e52913d83a..ca6065b71b46 100644 --- a/trunk/drivers/net/wireless/ath/ath9k/recv.c +++ b/trunk/drivers/net/wireless/ath/ath9k/recv.c @@ -844,9 +844,9 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) int dma_type; if (edma) - dma_type = DMA_BIDIRECTIONAL; - else dma_type = DMA_FROM_DEVICE; + else + dma_type = DMA_BIDIRECTIONAL; qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; spin_lock_bh(&sc->rx.rxbuflock); diff --git a/trunk/drivers/power/ds2782_battery.c b/trunk/drivers/power/ds2782_battery.c index 84d3c43cf2bc..2afbeec8b791 100644 --- a/trunk/drivers/power/ds2782_battery.c +++ b/trunk/drivers/power/ds2782_battery.c @@ -43,9 +43,10 @@ struct ds278x_info; struct ds278x_battery_ops { - int (*get_battery_current)(struct ds278x_info *info, int *current_uA); - int (*get_battery_voltage)(struct ds278x_info *info, int *voltage_uA); - int (*get_battery_capacity)(struct ds278x_info *info, int *capacity_uA); + int (*get_current)(struct ds278x_info *info, int *current_uA); + int (*get_voltage)(struct ds278x_info *info, int *voltage_uA); + int (*get_capacity)(struct ds278x_info *info, int *capacity_uA); + }; #define to_ds278x_info(x) container_of(x, struct ds278x_info, battery) @@ -212,11 +213,11 @@ static int ds278x_get_status(struct ds278x_info *info, int *status) int current_uA; int capacity; - err = info->ops->get_battery_current(info, ¤t_uA); + err = info->ops->get_current(info, ¤t_uA); if (err) return err; - err = info->ops->get_battery_capacity(info, &capacity); + err = info->ops->get_capacity(info, &capacity); if (err) return err; @@ -245,15 +246,15 @@ static int ds278x_battery_get_property(struct power_supply *psy, break; case POWER_SUPPLY_PROP_CAPACITY: - ret = info->ops->get_battery_capacity(info, &val->intval); + ret = info->ops->get_capacity(info, &val->intval); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: - ret = info->ops->get_battery_voltage(info, &val->intval); + ret = info->ops->get_voltage(info, &val->intval); break; case POWER_SUPPLY_PROP_CURRENT_NOW: - ret = info->ops->get_battery_current(info, &val->intval); + ret = info->ops->get_current(info, &val->intval); break; case POWER_SUPPLY_PROP_TEMP: @@ -306,14 +307,14 @@ enum ds278x_num_id { static struct ds278x_battery_ops ds278x_ops[] = { [DS2782] = { - .get_battery_current = ds2782_get_current, - .get_battery_voltage = ds2782_get_voltage, - .get_battery_capacity = ds2782_get_capacity, + .get_current = ds2782_get_current, + .get_voltage = ds2782_get_voltage, + .get_capacity = ds2782_get_capacity, }, [DS2786] = { - .get_battery_current = ds2786_get_current, - .get_battery_voltage = ds2786_get_voltage, - .get_battery_capacity = ds2786_get_capacity, + .get_current = ds2786_get_current, + .get_voltage = ds2786_get_voltage, + .get_capacity = ds2786_get_capacity, } }; diff --git a/trunk/include/linux/if_macvlan.h b/trunk/include/linux/if_macvlan.h index 1ffaeffeff74..9ea047aca795 100644 --- a/trunk/include/linux/if_macvlan.h +++ b/trunk/include/linux/if_macvlan.h @@ -67,8 +67,6 @@ static inline void macvlan_count_rx(const struct macvlan_dev *vlan, } } -extern void macvlan_common_setup(struct net_device *dev); - extern int macvlan_common_newlink(struct net *src_net, struct net_device *dev, struct nlattr *tb[], struct nlattr *data[], int (*receive)(struct sk_buff *skb), diff --git a/trunk/include/net/tc_act/tc_mirred.h b/trunk/include/net/tc_act/tc_mirred.h index cfe2943690ff..ceac661cdfd5 100644 --- a/trunk/include/net/tc_act/tc_mirred.h +++ b/trunk/include/net/tc_act/tc_mirred.h @@ -9,7 +9,6 @@ struct tcf_mirred { int tcfm_ifindex; int tcfm_ok_push; struct net_device *tcfm_dev; - struct list_head tcfm_list; }; #define to_mirred(pc) \ container_of(pc, struct tcf_mirred, common) diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 1f466e82ac33..0ea10f849be8 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -1488,7 +1488,6 @@ static inline void net_timestamp_check(struct sk_buff *skb) int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) { skb_orphan(skb); - nf_reset(skb); if (!(dev->flags & IFF_UP) || (skb->len > (dev->mtu + dev->hard_header_len))) { diff --git a/trunk/net/core/skbuff.c b/trunk/net/core/skbuff.c index ce88293a34e2..34432b4e96bb 100644 --- a/trunk/net/core/skbuff.c +++ b/trunk/net/core/skbuff.c @@ -843,9 +843,7 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, skb->network_header += off; if (skb_mac_header_was_set(skb)) skb->mac_header += off; - /* Only adjust this if it actually is csum_start rather than csum */ - if (skb->ip_summed == CHECKSUM_PARTIAL) - skb->csum_start += nhead; + skb->csum_start += nhead; skb->cloned = 0; skb->hdr_len = 0; skb->nohdr = 0; @@ -932,8 +930,7 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, copy_skb_header(n, skb); off = newheadroom - oldheadroom; - if (n->ip_summed == CHECKSUM_PARTIAL) - n->csum_start += off; + n->csum_start += off; #ifdef NET_SKBUFF_DATA_USES_OFFSET n->transport_header += off; n->network_header += off; diff --git a/trunk/net/ipv6/addrconf.c b/trunk/net/ipv6/addrconf.c index 784f34d11fdd..e1a698df5706 100644 --- a/trunk/net/ipv6/addrconf.c +++ b/trunk/net/ipv6/addrconf.c @@ -1760,10 +1760,7 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) idev = ipv6_find_idev(dev); if (!idev) - return ERR_PTR(-ENOBUFS); - - if (idev->cnf.disable_ipv6) - return ERR_PTR(-EACCES); + return NULL; /* Add default multicast route */ addrconf_add_mroute(dev); @@ -2132,9 +2129,8 @@ static int inet6_addr_add(struct net *net, int ifindex, struct in6_addr *pfx, if (!dev) return -ENODEV; - idev = addrconf_add_dev(dev); - if (IS_ERR(idev)) - return PTR_ERR(idev); + if ((idev = addrconf_add_dev(dev)) == NULL) + return -ENOBUFS; scope = ipv6_addr_scope(pfx); @@ -2381,7 +2377,7 @@ static void addrconf_dev_config(struct net_device *dev) } idev = addrconf_add_dev(dev); - if (IS_ERR(idev)) + if (idev == NULL) return; memset(&addr, 0, sizeof(struct in6_addr)); @@ -2472,7 +2468,7 @@ static void addrconf_ip6_tnl_config(struct net_device *dev) ASSERT_RTNL(); idev = addrconf_add_dev(dev); - if (IS_ERR(idev)) { + if (!idev) { printk(KERN_DEBUG "init ip6-ip6: add_dev failed\n"); return; } diff --git a/trunk/net/mac80211/cfg.c b/trunk/net/mac80211/cfg.c index 67ee34f57df7..c7000a6ca379 100644 --- a/trunk/net/mac80211/cfg.c +++ b/trunk/net/mac80211/cfg.c @@ -632,7 +632,7 @@ static void ieee80211_send_layer2_update(struct sta_info *sta) skb->dev = sta->sdata->dev; skb->protocol = eth_type_trans(skb, sta->sdata->dev); memset(skb->cb, 0, sizeof(skb->cb)); - netif_rx_ni(skb); + netif_rx(skb); } static void sta_apply_parameters(struct ieee80211_local *local, diff --git a/trunk/net/sched/act_mirred.c b/trunk/net/sched/act_mirred.c index 1980b71c283f..c0b6863e3b87 100644 --- a/trunk/net/sched/act_mirred.c +++ b/trunk/net/sched/act_mirred.c @@ -33,7 +33,6 @@ static struct tcf_common *tcf_mirred_ht[MIRRED_TAB_MASK + 1]; static u32 mirred_idx_gen; static DEFINE_RWLOCK(mirred_lock); -static LIST_HEAD(mirred_list); static struct tcf_hashinfo mirred_hash_info = { .htab = tcf_mirred_ht, @@ -48,9 +47,7 @@ static inline int tcf_mirred_release(struct tcf_mirred *m, int bind) m->tcf_bindcnt--; m->tcf_refcnt--; if(!m->tcf_bindcnt && m->tcf_refcnt <= 0) { - list_del(&m->tcfm_list); - if (m->tcfm_dev) - dev_put(m->tcfm_dev); + dev_put(m->tcfm_dev); tcf_hash_destroy(&m->common, &mirred_hash_info); return 1; } @@ -137,10 +134,8 @@ static int tcf_mirred_init(struct nlattr *nla, struct nlattr *est, m->tcfm_ok_push = ok_push; } spin_unlock_bh(&m->tcf_lock); - if (ret == ACT_P_CREATED) { - list_add(&m->tcfm_list, &mirred_list); + if (ret == ACT_P_CREATED) tcf_hash_insert(pc, &mirred_hash_info); - } return ret; } @@ -167,14 +162,9 @@ static int tcf_mirred(struct sk_buff *skb, struct tc_action *a, m->tcf_tm.lastuse = jiffies; dev = m->tcfm_dev; - if (!dev) { - printk_once(KERN_NOTICE "tc mirred: target device is gone\n"); - goto out; - } - if (!(dev->flags & IFF_UP)) { if (net_ratelimit()) - pr_notice("tc mirred to Houston: device %s is down\n", + pr_notice("tc mirred to Houston: device %s is gone!\n", dev->name); goto out; } @@ -242,28 +232,6 @@ static int tcf_mirred_dump(struct sk_buff *skb, struct tc_action *a, int bind, i return -1; } -static int mirred_device_event(struct notifier_block *unused, - unsigned long event, void *ptr) -{ - struct net_device *dev = ptr; - struct tcf_mirred *m; - - if (event == NETDEV_UNREGISTER) - list_for_each_entry(m, &mirred_list, tcfm_list) { - if (m->tcfm_dev == dev) { - dev_put(dev); - m->tcfm_dev = NULL; - } - } - - return NOTIFY_DONE; -} - -static struct notifier_block mirred_device_notifier = { - .notifier_call = mirred_device_event, -}; - - static struct tc_action_ops act_mirred_ops = { .kind = "mirred", .hinfo = &mirred_hash_info, @@ -284,17 +252,12 @@ MODULE_LICENSE("GPL"); static int __init mirred_init_module(void) { - int err = register_netdevice_notifier(&mirred_device_notifier); - if (err) - return err; - pr_info("Mirror/redirect action on\n"); return tcf_register_action(&act_mirred_ops); } static void __exit mirred_cleanup_module(void) { - unregister_netdevice_notifier(&mirred_device_notifier); tcf_unregister_action(&act_mirred_ops); }