forked from Minki/linux
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6: [TG3]: Update version and reldate [TG3]: Fix bug in nvram write [TG3]: Add reset_phy parameter to chip reset functions [TG3]: Reset chip when changing MAC address [TG3]: Add phy workaround [TG3]: Call netif_carrier_off() during phy reset [IPV6]: Fix race in route selection. [XFRM]: fix incorrect xfrm_policy_afinfo_lock use [XFRM]: fix incorrect xfrm_state_afinfo_lock use [TCP]: Fix unlikely usage in tcp_transmit_skb() [XFRM]: fix softirq-unsafe xfrm typemap->lock use [IPSEC]: Fix IP ID selection [NET]: use hlist_unhashed() [IPV4]: inet_init() -> fs_initcall [NETLINK]: cleanup unused macro in net/netlink/af_netlink.c [PKT_SCHED] netem: fix loss [X25]: fix for spinlock recurse and spinlock lockup with timer handler
This commit is contained in:
commit
1f4a90670b
@ -69,8 +69,8 @@
|
||||
|
||||
#define DRV_MODULE_NAME "tg3"
|
||||
#define PFX DRV_MODULE_NAME ": "
|
||||
#define DRV_MODULE_VERSION "3.56"
|
||||
#define DRV_MODULE_RELDATE "Apr 1, 2006"
|
||||
#define DRV_MODULE_VERSION "3.57"
|
||||
#define DRV_MODULE_RELDATE "Apr 28, 2006"
|
||||
|
||||
#define TG3_DEF_MAC_MODE 0
|
||||
#define TG3_DEF_RX_MODE 0
|
||||
@ -974,6 +974,8 @@ static int tg3_phy_reset_5703_4_5(struct tg3 *tp)
|
||||
return err;
|
||||
}
|
||||
|
||||
static void tg3_link_report(struct tg3 *);
|
||||
|
||||
/* This will reset the tigon3 PHY if there is no valid
|
||||
* link unless the FORCE argument is non-zero.
|
||||
*/
|
||||
@ -987,6 +989,11 @@ static int tg3_phy_reset(struct tg3 *tp)
|
||||
if (err != 0)
|
||||
return -EBUSY;
|
||||
|
||||
if (netif_running(tp->dev) && netif_carrier_ok(tp->dev)) {
|
||||
netif_carrier_off(tp->dev);
|
||||
tg3_link_report(tp);
|
||||
}
|
||||
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5703 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705) {
|
||||
@ -1023,6 +1030,12 @@ out:
|
||||
tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x14e2);
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
|
||||
}
|
||||
else if (tp->tg3_flags2 & TG3_FLG2_PHY_JITTER_BUG) {
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0c00);
|
||||
tg3_writephy(tp, MII_TG3_DSP_ADDRESS, 0x000a);
|
||||
tg3_writephy(tp, MII_TG3_DSP_RW_PORT, 0x010b);
|
||||
tg3_writephy(tp, MII_TG3_AUX_CTRL, 0x0400);
|
||||
}
|
||||
/* Set Extended packet length bit (bit 14) on all chips that */
|
||||
/* support jumbo frames */
|
||||
if ((tp->phy_id & PHY_ID_MASK) == PHY_ID_BCM5401) {
|
||||
@ -3531,7 +3544,7 @@ static irqreturn_t tg3_test_isr(int irq, void *dev_id,
|
||||
return IRQ_RETVAL(0);
|
||||
}
|
||||
|
||||
static int tg3_init_hw(struct tg3 *);
|
||||
static int tg3_init_hw(struct tg3 *, int);
|
||||
static int tg3_halt(struct tg3 *, int, int);
|
||||
|
||||
#ifdef CONFIG_NET_POLL_CONTROLLER
|
||||
@ -3567,7 +3580,7 @@ static void tg3_reset_task(void *_data)
|
||||
tp->tg3_flags2 &= ~TG3_FLG2_RESTART_TIMER;
|
||||
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 0);
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
|
||||
tg3_netif_start(tp);
|
||||
|
||||
@ -4042,7 +4055,7 @@ static int tg3_change_mtu(struct net_device *dev, int new_mtu)
|
||||
|
||||
tg3_set_mtu(dev, tp, new_mtu);
|
||||
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 0);
|
||||
|
||||
tg3_netif_start(tp);
|
||||
|
||||
@ -5719,9 +5732,23 @@ static int tg3_set_mac_addr(struct net_device *dev, void *p)
|
||||
if (!netif_running(dev))
|
||||
return 0;
|
||||
|
||||
if (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) {
|
||||
/* Reset chip so that ASF can re-init any MAC addresses it
|
||||
* needs.
|
||||
*/
|
||||
tg3_netif_stop(tp);
|
||||
tg3_full_lock(tp, 1);
|
||||
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
tg3_init_hw(tp, 0);
|
||||
|
||||
tg3_netif_start(tp);
|
||||
tg3_full_unlock(tp);
|
||||
} else {
|
||||
spin_lock_bh(&tp->lock);
|
||||
__tg3_set_mac_addr(tp);
|
||||
spin_unlock_bh(&tp->lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -5771,7 +5798,7 @@ static void __tg3_set_coalesce(struct tg3 *tp, struct ethtool_coalesce *ec)
|
||||
}
|
||||
|
||||
/* tp->lock is held. */
|
||||
static int tg3_reset_hw(struct tg3 *tp)
|
||||
static int tg3_reset_hw(struct tg3 *tp, int reset_phy)
|
||||
{
|
||||
u32 val, rdmac_mode;
|
||||
int i, err, limit;
|
||||
@ -5786,7 +5813,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
||||
tg3_abort_hw(tp, 1);
|
||||
}
|
||||
|
||||
if (tp->tg3_flags2 & TG3_FLG2_MII_SERDES)
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_MII_SERDES) && reset_phy)
|
||||
tg3_phy_reset(tp);
|
||||
|
||||
err = tg3_chip_reset(tp);
|
||||
@ -6327,7 +6354,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
||||
tw32(GRC_LOCAL_CTRL, tp->grc_local_ctrl);
|
||||
}
|
||||
|
||||
err = tg3_setup_phy(tp, 1);
|
||||
err = tg3_setup_phy(tp, reset_phy);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -6400,7 +6427,7 @@ static int tg3_reset_hw(struct tg3 *tp)
|
||||
/* Called at device open time to get the chip ready for
|
||||
* packet processing. Invoked with tp->lock held.
|
||||
*/
|
||||
static int tg3_init_hw(struct tg3 *tp)
|
||||
static int tg3_init_hw(struct tg3 *tp, int reset_phy)
|
||||
{
|
||||
int err;
|
||||
|
||||
@ -6413,7 +6440,7 @@ static int tg3_init_hw(struct tg3 *tp)
|
||||
|
||||
tw32(TG3PCI_MEM_WIN_BASE_ADDR, 0);
|
||||
|
||||
err = tg3_reset_hw(tp);
|
||||
err = tg3_reset_hw(tp, reset_phy);
|
||||
|
||||
out:
|
||||
return err;
|
||||
@ -6683,7 +6710,7 @@ static int tg3_test_msi(struct tg3 *tp)
|
||||
tg3_full_lock(tp, 1);
|
||||
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
err = tg3_init_hw(tp);
|
||||
err = tg3_init_hw(tp, 1);
|
||||
|
||||
tg3_full_unlock(tp);
|
||||
|
||||
@ -6748,7 +6775,7 @@ static int tg3_open(struct net_device *dev)
|
||||
|
||||
tg3_full_lock(tp, 0);
|
||||
|
||||
err = tg3_init_hw(tp);
|
||||
err = tg3_init_hw(tp, 1);
|
||||
if (err) {
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
tg3_free_rings(tp);
|
||||
@ -7839,7 +7866,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
|
||||
|
||||
if (netif_running(dev)) {
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
tg3_netif_start(tp);
|
||||
}
|
||||
|
||||
@ -7884,7 +7911,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
|
||||
|
||||
if (netif_running(dev)) {
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
tg3_netif_start(tp);
|
||||
}
|
||||
|
||||
@ -8522,7 +8549,7 @@ static int tg3_test_loopback(struct tg3 *tp)
|
||||
if (!netif_running(tp->dev))
|
||||
return TG3_LOOPBACK_FAILED;
|
||||
|
||||
tg3_reset_hw(tp);
|
||||
tg3_reset_hw(tp, 1);
|
||||
|
||||
if (tg3_run_loopback(tp, TG3_MAC_LOOPBACK))
|
||||
err |= TG3_MAC_LOOPBACK_FAILED;
|
||||
@ -8596,7 +8623,7 @@ static void tg3_self_test(struct net_device *dev, struct ethtool_test *etest,
|
||||
tg3_halt(tp, RESET_KIND_SHUTDOWN, 1);
|
||||
if (netif_running(dev)) {
|
||||
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
tg3_netif_start(tp);
|
||||
}
|
||||
|
||||
@ -9377,7 +9404,7 @@ static int tg3_nvram_write_block_buffered(struct tg3 *tp, u32 offset, u32 len,
|
||||
|
||||
if ((page_off == 0) || (i == 0))
|
||||
nvram_cmd |= NVRAM_CMD_FIRST;
|
||||
else if (page_off == (tp->nvram_pagesize - 4))
|
||||
if (page_off == (tp->nvram_pagesize - 4))
|
||||
nvram_cmd |= NVRAM_CMD_LAST;
|
||||
|
||||
if (i == (len - 4))
|
||||
@ -10353,10 +10380,13 @@ static int __devinit tg3_get_invariants(struct tg3 *tp)
|
||||
if (tp->pci_chip_rev_id == CHIPREV_ID_5704_A0)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_5704_A0_BUG;
|
||||
|
||||
if ((tp->tg3_flags2 & TG3_FLG2_5705_PLUS) &&
|
||||
(GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5755) &&
|
||||
(GET_ASIC_REV(tp->pci_chip_rev_id) != ASIC_REV_5787))
|
||||
if (tp->tg3_flags2 & TG3_FLG2_5705_PLUS) {
|
||||
if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5755 ||
|
||||
GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5787)
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_JITTER_BUG;
|
||||
else
|
||||
tp->tg3_flags2 |= TG3_FLG2_PHY_BER_BUG;
|
||||
}
|
||||
|
||||
tp->coalesce_mode = 0;
|
||||
if (GET_CHIP_REV(tp->pci_chip_rev_id) != CHIPREV_5700_AX &&
|
||||
@ -11569,7 +11599,7 @@ static int tg3_suspend(struct pci_dev *pdev, pm_message_t state)
|
||||
tg3_full_lock(tp, 0);
|
||||
|
||||
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
|
||||
tp->timer.expires = jiffies + tp->timer_offset;
|
||||
add_timer(&tp->timer);
|
||||
@ -11603,7 +11633,7 @@ static int tg3_resume(struct pci_dev *pdev)
|
||||
tg3_full_lock(tp, 0);
|
||||
|
||||
tp->tg3_flags |= TG3_FLAG_INIT_COMPLETE;
|
||||
tg3_init_hw(tp);
|
||||
tg3_init_hw(tp, 1);
|
||||
|
||||
tp->timer.expires = jiffies + tp->timer_offset;
|
||||
add_timer(&tp->timer);
|
||||
|
@ -2215,6 +2215,7 @@ struct tg3 {
|
||||
#define TG3_FLG2_HW_TSO_2 0x08000000
|
||||
#define TG3_FLG2_HW_TSO (TG3_FLG2_HW_TSO_1 | TG3_FLG2_HW_TSO_2)
|
||||
#define TG3_FLG2_1SHOT_MSI 0x10000000
|
||||
#define TG3_FLG2_PHY_JITTER_BUG 0x20000000
|
||||
|
||||
u32 split_mode_max_reqs;
|
||||
#define SPLIT_MODE_5704_MAX_REQ 3
|
||||
|
@ -619,7 +619,7 @@ static inline void hlist_del_rcu(struct hlist_node *n)
|
||||
|
||||
static inline void hlist_del_init(struct hlist_node *n)
|
||||
{
|
||||
if (n->pprev) {
|
||||
if (!hlist_unhashed(n)) {
|
||||
__hlist_del(n);
|
||||
INIT_HLIST_NODE(n);
|
||||
}
|
||||
|
@ -150,7 +150,7 @@ static inline void inet_twsk_add_bind_node(struct inet_timewait_sock *tw,
|
||||
|
||||
static inline int inet_twsk_dead_hashed(const struct inet_timewait_sock *tw)
|
||||
{
|
||||
return tw->tw_death_node.pprev != NULL;
|
||||
return !hlist_unhashed(&tw->tw_death_node);
|
||||
}
|
||||
|
||||
static inline void inet_twsk_dead_node_init(struct inet_timewait_sock *tw)
|
||||
|
@ -279,7 +279,7 @@ static inline int sk_unhashed(const struct sock *sk)
|
||||
|
||||
static inline int sk_hashed(const struct sock *sk)
|
||||
{
|
||||
return sk->sk_node.pprev != NULL;
|
||||
return !sk_unhashed(sk);
|
||||
}
|
||||
|
||||
static __inline__ void sk_node_init(struct hlist_node *node)
|
||||
|
@ -1257,7 +1257,7 @@ out_unregister_udp_proto:
|
||||
goto out;
|
||||
}
|
||||
|
||||
module_init(inet_init);
|
||||
fs_initcall(inet_init);
|
||||
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
|
@ -465,7 +465,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
||||
TCP_INC_STATS(TCP_MIB_OUTSEGS);
|
||||
|
||||
err = icsk->icsk_af_ops->queue_xmit(skb, 0);
|
||||
if (unlikely(err <= 0))
|
||||
if (likely(err <= 0))
|
||||
return err;
|
||||
|
||||
tcp_enter_cwr(sk);
|
||||
|
@ -62,7 +62,7 @@ static void xfrm4_encap(struct sk_buff *skb)
|
||||
top_iph->frag_off = (flags & XFRM_STATE_NOPMTUDISC) ?
|
||||
0 : (iph->frag_off & htons(IP_DF));
|
||||
if (!top_iph->frag_off)
|
||||
__ip_select_ident(top_iph, dst, 0);
|
||||
__ip_select_ident(top_iph, dst->child, 0);
|
||||
|
||||
top_iph->ttl = dst_metric(dst->child, RTAX_HOPLIMIT);
|
||||
|
||||
|
@ -317,7 +317,7 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif,
|
||||
__FUNCTION__, head, head ? *head : NULL, oif);
|
||||
|
||||
for (rt = rt0, metric = rt0->rt6i_metric;
|
||||
rt && rt->rt6i_metric == metric;
|
||||
rt && rt->rt6i_metric == metric && (!last || rt != rt0);
|
||||
rt = rt->u.next) {
|
||||
int m;
|
||||
|
||||
@ -343,9 +343,12 @@ static struct rt6_info *rt6_select(struct rt6_info **head, int oif,
|
||||
(strict & RT6_SELECT_F_REACHABLE) &&
|
||||
last && last != rt0) {
|
||||
/* no entries matched; do round-robin */
|
||||
static spinlock_t lock = SPIN_LOCK_UNLOCKED;
|
||||
spin_lock(&lock);
|
||||
*head = rt0->u.next;
|
||||
rt0->u.next = last->u.next;
|
||||
last->u.next = rt0;
|
||||
spin_unlock(&lock);
|
||||
}
|
||||
|
||||
RT6_TRACE("%s() => %p, score=%d\n",
|
||||
|
@ -61,7 +61,6 @@
|
||||
#include <net/scm.h>
|
||||
#include <net/netlink.h>
|
||||
|
||||
#define Nprintk(a...)
|
||||
#define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8)
|
||||
|
||||
struct netlink_sock {
|
||||
|
@ -167,7 +167,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch)
|
||||
if (count == 0) {
|
||||
sch->qstats.drops++;
|
||||
kfree_skb(skb);
|
||||
return NET_XMIT_DROP;
|
||||
return NET_XMIT_BYPASS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -114,8 +114,9 @@ static void x25_heartbeat_expiry(unsigned long param)
|
||||
if (sock_flag(sk, SOCK_DESTROY) ||
|
||||
(sk->sk_state == TCP_LISTEN &&
|
||||
sock_flag(sk, SOCK_DEAD))) {
|
||||
bh_unlock_sock(sk);
|
||||
x25_destroy_socket(sk);
|
||||
goto unlock;
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
@ -128,7 +129,6 @@ static void x25_heartbeat_expiry(unsigned long param)
|
||||
}
|
||||
restart_heartbeat:
|
||||
x25_start_heartbeat(sk);
|
||||
unlock:
|
||||
bh_unlock_sock(sk);
|
||||
}
|
||||
|
||||
|
@ -57,12 +57,12 @@ int xfrm_register_type(struct xfrm_type *type, unsigned short family)
|
||||
return -EAFNOSUPPORT;
|
||||
typemap = afinfo->type_map;
|
||||
|
||||
write_lock(&typemap->lock);
|
||||
write_lock_bh(&typemap->lock);
|
||||
if (likely(typemap->map[type->proto] == NULL))
|
||||
typemap->map[type->proto] = type;
|
||||
else
|
||||
err = -EEXIST;
|
||||
write_unlock(&typemap->lock);
|
||||
write_unlock_bh(&typemap->lock);
|
||||
xfrm_policy_put_afinfo(afinfo);
|
||||
return err;
|
||||
}
|
||||
@ -78,12 +78,12 @@ int xfrm_unregister_type(struct xfrm_type *type, unsigned short family)
|
||||
return -EAFNOSUPPORT;
|
||||
typemap = afinfo->type_map;
|
||||
|
||||
write_lock(&typemap->lock);
|
||||
write_lock_bh(&typemap->lock);
|
||||
if (unlikely(typemap->map[type->proto] != type))
|
||||
err = -ENOENT;
|
||||
else
|
||||
typemap->map[type->proto] = NULL;
|
||||
write_unlock(&typemap->lock);
|
||||
write_unlock_bh(&typemap->lock);
|
||||
xfrm_policy_put_afinfo(afinfo);
|
||||
return err;
|
||||
}
|
||||
@ -1251,7 +1251,7 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
return -EINVAL;
|
||||
if (unlikely(afinfo->family >= NPROTO))
|
||||
return -EAFNOSUPPORT;
|
||||
write_lock(&xfrm_policy_afinfo_lock);
|
||||
write_lock_bh(&xfrm_policy_afinfo_lock);
|
||||
if (unlikely(xfrm_policy_afinfo[afinfo->family] != NULL))
|
||||
err = -ENOBUFS;
|
||||
else {
|
||||
@ -1268,7 +1268,7 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
afinfo->garbage_collect = __xfrm_garbage_collect;
|
||||
xfrm_policy_afinfo[afinfo->family] = afinfo;
|
||||
}
|
||||
write_unlock(&xfrm_policy_afinfo_lock);
|
||||
write_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_register_afinfo);
|
||||
@ -1280,7 +1280,7 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
return -EINVAL;
|
||||
if (unlikely(afinfo->family >= NPROTO))
|
||||
return -EAFNOSUPPORT;
|
||||
write_lock(&xfrm_policy_afinfo_lock);
|
||||
write_lock_bh(&xfrm_policy_afinfo_lock);
|
||||
if (likely(xfrm_policy_afinfo[afinfo->family] != NULL)) {
|
||||
if (unlikely(xfrm_policy_afinfo[afinfo->family] != afinfo))
|
||||
err = -EINVAL;
|
||||
@ -1294,7 +1294,7 @@ int xfrm_policy_unregister_afinfo(struct xfrm_policy_afinfo *afinfo)
|
||||
afinfo->garbage_collect = NULL;
|
||||
}
|
||||
}
|
||||
write_unlock(&xfrm_policy_afinfo_lock);
|
||||
write_unlock_bh(&xfrm_policy_afinfo_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
|
||||
|
@ -1061,7 +1061,7 @@ int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
|
||||
return -EINVAL;
|
||||
if (unlikely(afinfo->family >= NPROTO))
|
||||
return -EAFNOSUPPORT;
|
||||
write_lock(&xfrm_state_afinfo_lock);
|
||||
write_lock_bh(&xfrm_state_afinfo_lock);
|
||||
if (unlikely(xfrm_state_afinfo[afinfo->family] != NULL))
|
||||
err = -ENOBUFS;
|
||||
else {
|
||||
@ -1069,7 +1069,7 @@ int xfrm_state_register_afinfo(struct xfrm_state_afinfo *afinfo)
|
||||
afinfo->state_byspi = xfrm_state_byspi;
|
||||
xfrm_state_afinfo[afinfo->family] = afinfo;
|
||||
}
|
||||
write_unlock(&xfrm_state_afinfo_lock);
|
||||
write_unlock_bh(&xfrm_state_afinfo_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_state_register_afinfo);
|
||||
@ -1081,7 +1081,7 @@ int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
|
||||
return -EINVAL;
|
||||
if (unlikely(afinfo->family >= NPROTO))
|
||||
return -EAFNOSUPPORT;
|
||||
write_lock(&xfrm_state_afinfo_lock);
|
||||
write_lock_bh(&xfrm_state_afinfo_lock);
|
||||
if (likely(xfrm_state_afinfo[afinfo->family] != NULL)) {
|
||||
if (unlikely(xfrm_state_afinfo[afinfo->family] != afinfo))
|
||||
err = -EINVAL;
|
||||
@ -1091,7 +1091,7 @@ int xfrm_state_unregister_afinfo(struct xfrm_state_afinfo *afinfo)
|
||||
afinfo->state_bydst = NULL;
|
||||
}
|
||||
}
|
||||
write_unlock(&xfrm_state_afinfo_lock);
|
||||
write_unlock_bh(&xfrm_state_afinfo_lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(xfrm_state_unregister_afinfo);
|
||||
|
Loading…
Reference in New Issue
Block a user