24
24
#include "xfrm_inout.h"
25
25
26
26
struct xfrm_trans_tasklet {
27
- struct tasklet_struct tasklet ;
27
+ struct work_struct work ;
28
+ spinlock_t queue_lock ;
28
29
struct sk_buff_head queue ;
29
30
};
30
31
@@ -760,18 +761,22 @@ int xfrm_input_resume(struct sk_buff *skb, int nexthdr)
760
761
}
761
762
EXPORT_SYMBOL (xfrm_input_resume );
762
763
763
- static void xfrm_trans_reinject (struct tasklet_struct * t )
764
+ static void xfrm_trans_reinject (struct work_struct * work )
764
765
{
765
- struct xfrm_trans_tasklet * trans = from_tasklet ( trans , t , tasklet );
766
+ struct xfrm_trans_tasklet * trans = container_of ( work , struct xfrm_trans_tasklet , work );
766
767
struct sk_buff_head queue ;
767
768
struct sk_buff * skb ;
768
769
769
770
__skb_queue_head_init (& queue );
771
+ spin_lock_bh (& trans -> queue_lock );
770
772
skb_queue_splice_init (& trans -> queue , & queue );
773
+ spin_unlock_bh (& trans -> queue_lock );
771
774
775
+ local_bh_disable ();
772
776
while ((skb = __skb_dequeue (& queue )))
773
777
XFRM_TRANS_SKB_CB (skb )-> finish (XFRM_TRANS_SKB_CB (skb )-> net ,
774
778
NULL , skb );
779
+ local_bh_enable ();
775
780
}
776
781
777
782
int xfrm_trans_queue_net (struct net * net , struct sk_buff * skb ,
@@ -789,8 +794,10 @@ int xfrm_trans_queue_net(struct net *net, struct sk_buff *skb,
789
794
790
795
XFRM_TRANS_SKB_CB (skb )-> finish = finish ;
791
796
XFRM_TRANS_SKB_CB (skb )-> net = net ;
797
+ spin_lock_bh (& trans -> queue_lock );
792
798
__skb_queue_tail (& trans -> queue , skb );
793
- tasklet_schedule (& trans -> tasklet );
799
+ spin_unlock_bh (& trans -> queue_lock );
800
+ schedule_work (& trans -> work );
794
801
return 0 ;
795
802
}
796
803
EXPORT_SYMBOL (xfrm_trans_queue_net );
@@ -817,7 +824,8 @@ void __init xfrm_input_init(void)
817
824
struct xfrm_trans_tasklet * trans ;
818
825
819
826
trans = & per_cpu (xfrm_trans_tasklet , i );
827
+ spin_lock_init (& trans -> queue_lock );
820
828
__skb_queue_head_init (& trans -> queue );
821
- tasklet_setup (& trans -> tasklet , xfrm_trans_reinject );
829
+ INIT_WORK (& trans -> work , xfrm_trans_reinject );
822
830
}
823
831
}
0 commit comments