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 ---