aboutsummaryrefslogtreecommitdiffstats
path: root/net/xfrm/xfrm_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/xfrm/xfrm_state.c')
-rw-r--r--net/xfrm/xfrm_state.c21
1 files changed, 1 insertions, 20 deletions
diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c
index 290479d0746d..e845066547c4 100644
--- a/net/xfrm/xfrm_state.c
+++ b/net/xfrm/xfrm_state.c
@@ -372,8 +372,6 @@ static void xfrm_state_gc_task(struct work_struct *work)
372 372
373 hlist_for_each_entry_safe(x, tmp, &gc_list, gclist) 373 hlist_for_each_entry_safe(x, tmp, &gc_list, gclist)
374 xfrm_state_gc_destroy(x); 374 xfrm_state_gc_destroy(x);
375
376 wake_up(&net->xfrm.km_waitq);
377} 375}
378 376
379static inline unsigned long make_jiffies(long secs) 377static inline unsigned long make_jiffies(long secs)
@@ -388,7 +386,6 @@ static enum hrtimer_restart xfrm_timer_handler(struct hrtimer * me)
388{ 386{
389 struct tasklet_hrtimer *thr = container_of(me, struct tasklet_hrtimer, timer); 387 struct tasklet_hrtimer *thr = container_of(me, struct tasklet_hrtimer, timer);
390 struct xfrm_state *x = container_of(thr, struct xfrm_state, mtimer); 388 struct xfrm_state *x = container_of(thr, struct xfrm_state, mtimer);
391 struct net *net = xs_net(x);
392 unsigned long now = get_seconds(); 389 unsigned long now = get_seconds();
393 long next = LONG_MAX; 390 long next = LONG_MAX;
394 int warn = 0; 391 int warn = 0;
@@ -458,12 +455,8 @@ resched:
458 goto out; 455 goto out;
459 456
460expired: 457expired:
461 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0) { 458 if (x->km.state == XFRM_STATE_ACQ && x->id.spi == 0)
462 x->km.state = XFRM_STATE_EXPIRED; 459 x->km.state = XFRM_STATE_EXPIRED;
463 wake_up(&net->xfrm.km_waitq);
464 next = 2;
465 goto resched;
466 }
467 460
468 err = __xfrm_state_delete(x); 461 err = __xfrm_state_delete(x);
469 if (!err) 462 if (!err)
@@ -635,7 +628,6 @@ restart:
635 628
636out: 629out:
637 spin_unlock_bh(&net->xfrm.xfrm_state_lock); 630 spin_unlock_bh(&net->xfrm.xfrm_state_lock);
638 wake_up(&net->xfrm.km_waitq);
639 return err; 631 return err;
640} 632}
641EXPORT_SYMBOL(xfrm_state_flush); 633EXPORT_SYMBOL(xfrm_state_flush);
@@ -948,8 +940,6 @@ static void __xfrm_state_insert(struct xfrm_state *x)
948 if (x->replay_maxage) 940 if (x->replay_maxage)
949 mod_timer(&x->rtimer, jiffies + x->replay_maxage); 941 mod_timer(&x->rtimer, jiffies + x->replay_maxage);
950 942
951 wake_up(&net->xfrm.km_waitq);
952
953 net->xfrm.state_num++; 943 net->xfrm.state_num++;
954 944
955 xfrm_hash_grow_check(net, x->bydst.next != NULL); 945 xfrm_hash_grow_check(net, x->bydst.next != NULL);
@@ -1658,16 +1648,12 @@ EXPORT_SYMBOL(km_state_notify);
1658 1648
1659void km_state_expired(struct xfrm_state *x, int hard, u32 portid) 1649void km_state_expired(struct xfrm_state *x, int hard, u32 portid)
1660{ 1650{
1661 struct net *net = xs_net(x);
1662 struct km_event c; 1651 struct km_event c;
1663 1652
1664 c.data.hard = hard; 1653 c.data.hard = hard;
1665 c.portid = portid; 1654 c.portid = portid;
1666 c.event = XFRM_MSG_EXPIRE; 1655 c.event = XFRM_MSG_EXPIRE;
1667 km_state_notify(x, &c); 1656 km_state_notify(x, &c);
1668
1669 if (hard)
1670 wake_up(&net->xfrm.km_waitq);
1671} 1657}
1672 1658
1673EXPORT_SYMBOL(km_state_expired); 1659EXPORT_SYMBOL(km_state_expired);
@@ -1710,16 +1696,12 @@ EXPORT_SYMBOL(km_new_mapping);
1710 1696
1711void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 portid) 1697void km_policy_expired(struct xfrm_policy *pol, int dir, int hard, u32 portid)
1712{ 1698{
1713 struct net *net = xp_net(pol);
1714 struct km_event c; 1699 struct km_event c;
1715 1700
1716 c.data.hard = hard; 1701 c.data.hard = hard;
1717 c.portid = portid; 1702 c.portid = portid;
1718 c.event = XFRM_MSG_POLEXPIRE; 1703 c.event = XFRM_MSG_POLEXPIRE;
1719 km_policy_notify(pol, dir, &c); 1704 km_policy_notify(pol, dir, &c);
1720
1721 if (hard)
1722 wake_up(&net->xfrm.km_waitq);
1723} 1705}
1724EXPORT_SYMBOL(km_policy_expired); 1706EXPORT_SYMBOL(km_policy_expired);
1725 1707
@@ -2028,7 +2010,6 @@ int __net_init xfrm_state_init(struct net *net)
2028 INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize); 2010 INIT_WORK(&net->xfrm.state_hash_work, xfrm_hash_resize);
2029 INIT_HLIST_HEAD(&net->xfrm.state_gc_list); 2011 INIT_HLIST_HEAD(&net->xfrm.state_gc_list);
2030 INIT_WORK(&net->xfrm.state_gc_work, xfrm_state_gc_task); 2012 INIT_WORK(&net->xfrm.state_gc_work, xfrm_state_gc_task);
2031 init_waitqueue_head(&net->xfrm.km_waitq);
2032 spin_lock_init(&net->xfrm.xfrm_state_lock); 2013 spin_lock_init(&net->xfrm.xfrm_state_lock);
2033 return 0; 2014 return 0;
2034 2015