@@ -896,8 +896,10 @@ struct Qdisc *qdisc_create_dflt(struct netdev_queue *dev_queue,
896896 }
897897 sch -> parent = parentid ;
898898
899- if (!ops -> init || ops -> init (sch , NULL , extack ) == 0 )
899+ if (!ops -> init || ops -> init (sch , NULL , extack ) == 0 ) {
900+ trace_qdisc_create (ops , dev_queue -> dev , parentid );
900901 return sch ;
902+ }
901903
902904 qdisc_put (sch );
903905 return NULL ;
@@ -911,6 +913,8 @@ void qdisc_reset(struct Qdisc *qdisc)
911913 const struct Qdisc_ops * ops = qdisc -> ops ;
912914 struct sk_buff * skb , * tmp ;
913915
916+ trace_qdisc_reset (qdisc );
917+
914918 if (ops -> reset )
915919 ops -> reset (qdisc );
916920
@@ -949,31 +953,23 @@ static void qdisc_free_cb(struct rcu_head *head)
949953static void qdisc_destroy (struct Qdisc * qdisc )
950954{
951955 const struct Qdisc_ops * ops = qdisc -> ops ;
952- struct sk_buff * skb , * tmp ;
953956
954957#ifdef CONFIG_NET_SCHED
955958 qdisc_hash_del (qdisc );
956959
957960 qdisc_put_stab (rtnl_dereference (qdisc -> stab ));
958961#endif
959962 gen_kill_estimator (& qdisc -> rate_est );
960- if (ops -> reset )
961- ops -> reset (qdisc );
963+
964+ qdisc_reset (qdisc );
965+
962966 if (ops -> destroy )
963967 ops -> destroy (qdisc );
964968
965969 module_put (ops -> owner );
966970 dev_put (qdisc_dev (qdisc ));
967971
968- skb_queue_walk_safe (& qdisc -> gso_skb , skb , tmp ) {
969- __skb_unlink (skb , & qdisc -> gso_skb );
970- kfree_skb_list (skb );
971- }
972-
973- skb_queue_walk_safe (& qdisc -> skb_bad_txq , skb , tmp ) {
974- __skb_unlink (skb , & qdisc -> skb_bad_txq );
975- kfree_skb_list (skb );
976- }
972+ trace_qdisc_destroy (qdisc );
977973
978974 call_rcu (& qdisc -> rcu , qdisc_free_cb );
979975}
@@ -1132,6 +1128,28 @@ void dev_activate(struct net_device *dev)
11321128}
11331129EXPORT_SYMBOL (dev_activate );
11341130
1131+ static void qdisc_deactivate (struct Qdisc * qdisc )
1132+ {
1133+ bool nolock = qdisc -> flags & TCQ_F_NOLOCK ;
1134+
1135+ if (qdisc -> flags & TCQ_F_BUILTIN )
1136+ return ;
1137+ if (test_bit (__QDISC_STATE_DEACTIVATED , & qdisc -> state ))
1138+ return ;
1139+
1140+ if (nolock )
1141+ spin_lock_bh (& qdisc -> seqlock );
1142+ spin_lock_bh (qdisc_lock (qdisc ));
1143+
1144+ set_bit (__QDISC_STATE_DEACTIVATED , & qdisc -> state );
1145+
1146+ qdisc_reset (qdisc );
1147+
1148+ spin_unlock_bh (qdisc_lock (qdisc ));
1149+ if (nolock )
1150+ spin_unlock_bh (& qdisc -> seqlock );
1151+ }
1152+
11351153static void dev_deactivate_queue (struct net_device * dev ,
11361154 struct netdev_queue * dev_queue ,
11371155 void * _qdisc_default )
@@ -1141,21 +1159,8 @@ static void dev_deactivate_queue(struct net_device *dev,
11411159
11421160 qdisc = rtnl_dereference (dev_queue -> qdisc );
11431161 if (qdisc ) {
1144- bool nolock = qdisc -> flags & TCQ_F_NOLOCK ;
1145-
1146- if (nolock )
1147- spin_lock_bh (& qdisc -> seqlock );
1148- spin_lock_bh (qdisc_lock (qdisc ));
1149-
1150- if (!(qdisc -> flags & TCQ_F_BUILTIN ))
1151- set_bit (__QDISC_STATE_DEACTIVATED , & qdisc -> state );
1152-
1162+ qdisc_deactivate (qdisc );
11531163 rcu_assign_pointer (dev_queue -> qdisc , qdisc_default );
1154- qdisc_reset (qdisc );
1155-
1156- spin_unlock_bh (qdisc_lock (qdisc ));
1157- if (nolock )
1158- spin_unlock_bh (& qdisc -> seqlock );
11591164 }
11601165}
11611166
@@ -1186,16 +1191,6 @@ static bool some_qdisc_is_busy(struct net_device *dev)
11861191 return false;
11871192}
11881193
1189- static void dev_qdisc_reset (struct net_device * dev ,
1190- struct netdev_queue * dev_queue ,
1191- void * none )
1192- {
1193- struct Qdisc * qdisc = dev_queue -> qdisc_sleeping ;
1194-
1195- if (qdisc )
1196- qdisc_reset (qdisc );
1197- }
1198-
11991194/**
12001195 * dev_deactivate_many - deactivate transmissions on several devices
12011196 * @head: list of devices to deactivate
@@ -1232,12 +1227,6 @@ void dev_deactivate_many(struct list_head *head)
12321227 */
12331228 schedule_timeout_uninterruptible (1 );
12341229 }
1235- /* The new qdisc is assigned at this point so we can safely
1236- * unwind stale skb lists and qdisc statistics
1237- */
1238- netdev_for_each_tx_queue (dev , dev_qdisc_reset , NULL );
1239- if (dev_ingress_queue (dev ))
1240- dev_qdisc_reset (dev , dev_ingress_queue (dev ), NULL );
12411230 }
12421231}
12431232
0 commit comments