sch_generic.c (542898c5aa5c6a3179dffb1d1606884a63f75fed) | sch_generic.c (5891cd5ec46c2c2eb6427cb54d214b149635dd0e) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * net/sched/sch_generic.c Generic packet scheduler routines. 4 * 5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 6 * Jamal Hadi Salim, <hadi@cyberus.ca> 990601 7 * - Ingress support 8 */ --- 1150 unchanged lines hidden (view full) --- 1159 struct netdev_queue *txq; 1160 struct Qdisc *qdisc; 1161 1162 txq = netdev_get_tx_queue(dev, 0); 1163 1164 if (!netif_is_multiqueue(dev) || 1165 dev->priv_flags & IFF_NO_QUEUE) { 1166 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* 3 * net/sched/sch_generic.c Generic packet scheduler routines. 4 * 5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 6 * Jamal Hadi Salim, <hadi@cyberus.ca> 990601 7 * - Ingress support 8 */ --- 1150 unchanged lines hidden (view full) --- 1159 struct netdev_queue *txq; 1160 struct Qdisc *qdisc; 1161 1162 txq = netdev_get_tx_queue(dev, 0); 1163 1164 if (!netif_is_multiqueue(dev) || 1165 dev->priv_flags & IFF_NO_QUEUE) { 1166 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); |
1167 dev->qdisc = txq->qdisc_sleeping; 1168 qdisc_refcount_inc(dev->qdisc); | 1167 qdisc = txq->qdisc_sleeping; 1168 rcu_assign_pointer(dev->qdisc, qdisc); 1169 qdisc_refcount_inc(qdisc); |
1169 } else { 1170 qdisc = qdisc_create_dflt(txq, &mq_qdisc_ops, TC_H_ROOT, NULL); 1171 if (qdisc) { | 1170 } else { 1171 qdisc = qdisc_create_dflt(txq, &mq_qdisc_ops, TC_H_ROOT, NULL); 1172 if (qdisc) { |
1172 dev->qdisc = qdisc; | 1173 rcu_assign_pointer(dev->qdisc, qdisc); |
1173 qdisc->ops->attach(qdisc); 1174 } 1175 } | 1174 qdisc->ops->attach(qdisc); 1175 } 1176 } |
1177 qdisc = rtnl_dereference(dev->qdisc); |
|
1176 1177 /* Detect default qdisc setup/init failed and fallback to "noqueue" */ | 1178 1179 /* Detect default qdisc setup/init failed and fallback to "noqueue" */ |
1178 if (dev->qdisc == &noop_qdisc) { | 1180 if (qdisc == &noop_qdisc) { |
1179 netdev_warn(dev, "default qdisc (%s) fail, fallback to %s\n", 1180 default_qdisc_ops->id, noqueue_qdisc_ops.id); 1181 dev->priv_flags |= IFF_NO_QUEUE; 1182 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); | 1181 netdev_warn(dev, "default qdisc (%s) fail, fallback to %s\n", 1182 default_qdisc_ops->id, noqueue_qdisc_ops.id); 1183 dev->priv_flags |= IFF_NO_QUEUE; 1184 netdev_for_each_tx_queue(dev, attach_one_default_qdisc, NULL); |
1183 dev->qdisc = txq->qdisc_sleeping; 1184 qdisc_refcount_inc(dev->qdisc); | 1185 qdisc = txq->qdisc_sleeping; 1186 rcu_assign_pointer(dev->qdisc, qdisc); 1187 qdisc_refcount_inc(qdisc); |
1185 dev->priv_flags ^= IFF_NO_QUEUE; 1186 } 1187 1188#ifdef CONFIG_NET_SCHED | 1188 dev->priv_flags ^= IFF_NO_QUEUE; 1189 } 1190 1191#ifdef CONFIG_NET_SCHED |
1189 if (dev->qdisc != &noop_qdisc) 1190 qdisc_hash_add(dev->qdisc, false); | 1192 if (qdisc != &noop_qdisc) 1193 qdisc_hash_add(qdisc, false); |
1191#endif 1192} 1193 1194static void transition_one_qdisc(struct net_device *dev, 1195 struct netdev_queue *dev_queue, 1196 void *_need_watchdog) 1197{ 1198 struct Qdisc *new_qdisc = dev_queue->qdisc_sleeping; --- 13 unchanged lines hidden (view full) --- 1212{ 1213 int need_watchdog; 1214 1215 /* No queueing discipline is attached to device; 1216 * create default one for devices, which need queueing 1217 * and noqueue_qdisc for virtual interfaces 1218 */ 1219 | 1194#endif 1195} 1196 1197static void transition_one_qdisc(struct net_device *dev, 1198 struct netdev_queue *dev_queue, 1199 void *_need_watchdog) 1200{ 1201 struct Qdisc *new_qdisc = dev_queue->qdisc_sleeping; --- 13 unchanged lines hidden (view full) --- 1215{ 1216 int need_watchdog; 1217 1218 /* No queueing discipline is attached to device; 1219 * create default one for devices, which need queueing 1220 * and noqueue_qdisc for virtual interfaces 1221 */ 1222 |
1220 if (dev->qdisc == &noop_qdisc) | 1223 if (rtnl_dereference(dev->qdisc) == &noop_qdisc) |
1221 attach_default_qdiscs(dev); 1222 1223 if (!netif_carrier_ok(dev)) 1224 /* Delay activation until next carrier-on event */ 1225 return; 1226 1227 need_watchdog = 0; 1228 netdev_for_each_tx_queue(dev, transition_one_qdisc, &need_watchdog); --- 149 unchanged lines hidden (view full) --- 1378 if (ops->change_tx_queue_len) 1379 return ops->change_tx_queue_len(qdisc, dev->tx_queue_len); 1380 return 0; 1381} 1382 1383void dev_qdisc_change_real_num_tx(struct net_device *dev, 1384 unsigned int new_real_tx) 1385{ | 1224 attach_default_qdiscs(dev); 1225 1226 if (!netif_carrier_ok(dev)) 1227 /* Delay activation until next carrier-on event */ 1228 return; 1229 1230 need_watchdog = 0; 1231 netdev_for_each_tx_queue(dev, transition_one_qdisc, &need_watchdog); --- 149 unchanged lines hidden (view full) --- 1381 if (ops->change_tx_queue_len) 1382 return ops->change_tx_queue_len(qdisc, dev->tx_queue_len); 1383 return 0; 1384} 1385 1386void dev_qdisc_change_real_num_tx(struct net_device *dev, 1387 unsigned int new_real_tx) 1388{ |
1386 struct Qdisc *qdisc = dev->qdisc; | 1389 struct Qdisc *qdisc = rtnl_dereference(dev->qdisc); |
1387 1388 if (qdisc->ops->change_real_num_tx) 1389 qdisc->ops->change_real_num_tx(qdisc, new_real_tx); 1390} 1391 1392void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx) 1393{ 1394#ifdef CONFIG_NET_SCHED --- 47 unchanged lines hidden (view full) --- 1442 struct Qdisc *qdisc = _qdisc; 1443 1444 rcu_assign_pointer(dev_queue->qdisc, qdisc); 1445 dev_queue->qdisc_sleeping = qdisc; 1446} 1447 1448void dev_init_scheduler(struct net_device *dev) 1449{ | 1390 1391 if (qdisc->ops->change_real_num_tx) 1392 qdisc->ops->change_real_num_tx(qdisc, new_real_tx); 1393} 1394 1395void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx) 1396{ 1397#ifdef CONFIG_NET_SCHED --- 47 unchanged lines hidden (view full) --- 1445 struct Qdisc *qdisc = _qdisc; 1446 1447 rcu_assign_pointer(dev_queue->qdisc, qdisc); 1448 dev_queue->qdisc_sleeping = qdisc; 1449} 1450 1451void dev_init_scheduler(struct net_device *dev) 1452{ |
1450 dev->qdisc = &noop_qdisc; | 1453 rcu_assign_pointer(dev->qdisc, &noop_qdisc); |
1451 netdev_for_each_tx_queue(dev, dev_init_scheduler_queue, &noop_qdisc); 1452 if (dev_ingress_queue(dev)) 1453 dev_init_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); 1454 1455 timer_setup(&dev->watchdog_timer, dev_watchdog, 0); 1456} 1457 1458static void shutdown_scheduler_queue(struct net_device *dev, --- 11 unchanged lines hidden (view full) --- 1470 } 1471} 1472 1473void dev_shutdown(struct net_device *dev) 1474{ 1475 netdev_for_each_tx_queue(dev, shutdown_scheduler_queue, &noop_qdisc); 1476 if (dev_ingress_queue(dev)) 1477 shutdown_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); | 1454 netdev_for_each_tx_queue(dev, dev_init_scheduler_queue, &noop_qdisc); 1455 if (dev_ingress_queue(dev)) 1456 dev_init_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); 1457 1458 timer_setup(&dev->watchdog_timer, dev_watchdog, 0); 1459} 1460 1461static void shutdown_scheduler_queue(struct net_device *dev, --- 11 unchanged lines hidden (view full) --- 1473 } 1474} 1475 1476void dev_shutdown(struct net_device *dev) 1477{ 1478 netdev_for_each_tx_queue(dev, shutdown_scheduler_queue, &noop_qdisc); 1479 if (dev_ingress_queue(dev)) 1480 shutdown_scheduler_queue(dev, dev_ingress_queue(dev), &noop_qdisc); |
1478 qdisc_put(dev->qdisc); 1479 dev->qdisc = &noop_qdisc; | 1481 qdisc_put(rtnl_dereference(dev->qdisc)); 1482 rcu_assign_pointer(dev->qdisc, &noop_qdisc); |
1480 1481 WARN_ON(timer_pending(&dev->watchdog_timer)); 1482} 1483 1484/** 1485 * psched_ratecfg_precompute__() - Pre-compute values for reciprocal division 1486 * @rate: Rate to compute reciprocal division values of 1487 * @mult: Multiplier for reciprocal division --- 117 unchanged lines hidden --- | 1483 1484 WARN_ON(timer_pending(&dev->watchdog_timer)); 1485} 1486 1487/** 1488 * psched_ratecfg_precompute__() - Pre-compute values for reciprocal division 1489 * @rate: Rate to compute reciprocal division values of 1490 * @mult: Multiplier for reciprocal division --- 117 unchanged lines hidden --- |