:::::: :::::: Manual check reason: "low confidence static check warning: net/sched/sch_ets.c:680:23: warning: Assigned value is garbage or undefined [clang-analyzer-core.uninitialized.Assign]" ::::::
CC: l...@lists.linux.dev CC: kbuild-...@lists.01.org BCC: l...@intel.com CC: linux-ker...@vger.kernel.org TO: Davide Caratti <dcara...@redhat.com> tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 32346491ddf24599decca06190ebca03ff9de7f8 commit: cd9b50adc6bb9ad3f7d244590a389522215865c4 net/sched: ets: fix crash when flipping from 'strict' to 'quantum' date: 11 months ago :::::: branch date: 5 hours ago :::::: commit date: 11 months ago config: arm-randconfig-c002-20220702 (https://download.01.org/0day-ci/archive/20220711/202207111005.dzznpyua-...@intel.com/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project f7a80c3d08d4821e621fc88d6a2e435291f82dff) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cd9b50adc6bb9ad3f7d244590a389522215865c4 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout cd9b50adc6bb9ad3f7d244590a389522215865c4 # save the config file COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <l...@intel.com> clang-analyzer warnings: (new ones prefixed by >>) include/linux/kernel.h:495:61: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ net/bluetooth/hci_request.c:3109:25: note: Taking false branch struct hci_dev *hdev = container_of(work, struct hci_dev, ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^ net/bluetooth/hci_request.c:3109:25: note: Loop condition is false. Exiting loop struct hci_dev *hdev = container_of(work, struct hci_dev, ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:306:2: note: expanded from macro '__compiletime_assert' do { \ ^ net/bluetooth/hci_request.c:3112:2: note: 'status' declared without an initial value u8 status; ^~~~~~~~~ net/bluetooth/hci_request.c:3116:2: note: Calling 'hci_req_sync' hci_req_sync(hdev, le_scan_restart, 0, HCI_CMD_TIMEOUT, &status); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:281:6: note: Assuming the condition is false if (test_bit(HCI_UP, &hdev->flags)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:281:2: note: Taking false branch if (test_bit(HCI_UP, &hdev->flags)) ^ net/bluetooth/hci_request.c:287:2: note: Returning without writing to '*hci_status' return ret; ^ net/bluetooth/hci_request.c:3116:2: note: Returning from 'hci_req_sync' hci_req_sync(hdev, le_scan_restart, 0, HCI_CMD_TIMEOUT, &status); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:3117:6: note: Branch condition evaluates to a garbage value if (status) { ^~~~~~ Suppressed 17 warnings (17 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 17 warnings generated. net/sched/sch_teql.c:249:4: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores] err = -EINVAL; ^ ~~~~~~~ net/sched/sch_teql.c:249:4: note: Value stored to 'err' is never read err = -EINVAL; ^ ~~~~~~~ Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 19 warnings generated. net/sched/sch_atm.c:89:25: warning: Value stored to 'p' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:89:25: note: Value stored to 'p' during its initialization is never read struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:388:2: warning: Value stored to 'result' is never read [clang-analyzer-deadcode.DeadStores] result = TC_ACT_OK; /* be nice to gcc */ ^ net/sched/sch_atm.c:388:2: note: Value stored to 'result' is never read net/sched/sch_atm.c:604:25: warning: Value stored to 'p' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:604:25: note: Value stored to 'p' during its initialization is never read struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 17 warnings generated. >> net/sched/sch_ets.c:680:23: warning: Assigned value is garbage or undefined >> [clang-analyzer-core.uninitialized.Assign] q->classes[i].qdisc = queues[i]; ^ net/sched/sch_ets.c:701:6: note: Assuming 'opt' is non-null if (!opt) ^~~~ net/sched/sch_ets.c:701:2: note: Taking false branch if (!opt) ^ net/sched/sch_ets.c:704:8: note: Value assigned to field 'nbands' err = tcf_block_get(&q->block, &q->filter_list, sch, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:705:6: note: Assuming 'err' is 0 if (err) ^~~ net/sched/sch_ets.c:705:2: note: Taking false branch if (err) ^ net/sched/sch_ets.c:709:9: note: Calling 'ets_qdisc_change' return ets_qdisc_change(sch, opt, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:591:2: note: 'oldbands' initialized here unsigned int oldbands = q->nbands; ^~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:598:7: note: 'opt' is non-null if (!opt) { ^~~ net/sched/sch_ets.c:598:2: note: Taking false branch if (!opt) { ^ net/sched/sch_ets.c:603:8: note: Calling 'nla_parse_nested' err = nla_parse_nested(tb, TCA_ETS_MAX, opt, ets_policy, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/net/netlink.h:1207:6: note: Assuming the condition is false if (!(nla->nla_type & NLA_F_NESTED)) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/net/netlink.h:1207:2: note: Taking false branch if (!(nla->nla_type & NLA_F_NESTED)) { ^ include/net/netlink.h:1212:9: note: Assigning value, which participates in a condition later return __nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:603:8: note: Returning from 'nla_parse_nested' err = nla_parse_nested(tb, TCA_ETS_MAX, opt, ets_policy, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:604:6: note: Assuming 'err' is >= 0 if (err < 0) ^~~~~~~ net/sched/sch_ets.c:604:2: note: Taking false branch if (err < 0) ^ net/sched/sch_ets.c:607:6: note: Assuming the condition is false if (!tb[TCA_ETS_NBANDS]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:607:2: note: Taking false branch if (!tb[TCA_ETS_NBANDS]) { ^ net/sched/sch_ets.c:612:6: note: Assuming 'nbands' is >= 1 if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^~~~~~~~~~ net/sched/sch_ets.c:612:6: note: Left side of '||' is false net/sched/sch_ets.c:612:20: note: Assuming 'nbands' is <= TCQ_ETS_MAX_BANDS if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:612:2: note: Taking false branch if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^ net/sched/sch_ets.c:619:6: note: Assuming the condition is false if (tb[TCA_ETS_NSTRICT]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:619:2: note: Taking false branch if (tb[TCA_ETS_NSTRICT]) { ^ net/sched/sch_ets.c:627:6: note: Assuming the condition is false if (tb[TCA_ETS_PRIOMAP]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:627:2: note: Taking false branch if (tb[TCA_ETS_PRIOMAP]) { ^ net/sched/sch_ets.c:634:6: note: Assuming the condition is false if (tb[TCA_ETS_QUANTA]) { ^~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:634:2: note: Taking false branch if (tb[TCA_ETS_QUANTA]) { ^ net/sched/sch_ets.c:643:20: note: 'i' is < 'nbands' for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:643:2: note: Loop condition is true. Entering loop body for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:644:3: note: Taking true branch if (!quanta[i]) ^ net/sched/sch_ets.c:643:20: note: Assuming 'i' is >= 'nbands' for (i = nstrict; i < nbands; i++) { ^~~~~~~~~~ net/sched/sch_ets.c:643:2: note: Loop condition is false. Execution continues on line 649 for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:649:21: note: Assuming 'i' is >= 'nbands' -- include/linux/kernel.h:495:61: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ net/bluetooth/hci_request.c:3109:25: note: Taking false branch struct hci_dev *hdev = container_of(work, struct hci_dev, ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:308:3: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^ net/bluetooth/hci_request.c:3109:25: note: Loop condition is false. Exiting loop struct hci_dev *hdev = container_of(work, struct hci_dev, ^ include/linux/kernel.h:495:2: note: expanded from macro 'container_of' BUILD_BUG_ON_MSG(!__same_type(*(ptr), ((type *)0)->member) && \ ^ include/linux/build_bug.h:39:37: note: expanded from macro 'BUILD_BUG_ON_MSG' #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg) ^ include/linux/compiler_types.h:328:2: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^ include/linux/compiler_types.h:316:2: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^ include/linux/compiler_types.h:306:2: note: expanded from macro '__compiletime_assert' do { \ ^ net/bluetooth/hci_request.c:3112:2: note: 'status' declared without an initial value u8 status; ^~~~~~~~~ net/bluetooth/hci_request.c:3116:2: note: Calling 'hci_req_sync' hci_req_sync(hdev, le_scan_restart, 0, HCI_CMD_TIMEOUT, &status); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:281:6: note: Assuming the condition is false if (test_bit(HCI_UP, &hdev->flags)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:281:2: note: Taking false branch if (test_bit(HCI_UP, &hdev->flags)) ^ net/bluetooth/hci_request.c:287:2: note: Returning without writing to '*hci_status' return ret; ^ net/bluetooth/hci_request.c:3116:2: note: Returning from 'hci_req_sync' hci_req_sync(hdev, le_scan_restart, 0, HCI_CMD_TIMEOUT, &status); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/bluetooth/hci_request.c:3117:6: note: Branch condition evaluates to a garbage value if (status) { ^~~~~~ Suppressed 17 warnings (17 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 17 warnings generated. net/sched/sch_teql.c:249:4: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores] err = -EINVAL; ^ ~~~~~~~ net/sched/sch_teql.c:249:4: note: Value stored to 'err' is never read err = -EINVAL; ^ ~~~~~~~ Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 19 warnings generated. net/sched/sch_atm.c:89:25: warning: Value stored to 'p' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:89:25: note: Value stored to 'p' during its initialization is never read struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:388:2: warning: Value stored to 'result' is never read [clang-analyzer-deadcode.DeadStores] result = TC_ACT_OK; /* be nice to gcc */ ^ net/sched/sch_atm.c:388:2: note: Value stored to 'result' is never read net/sched/sch_atm.c:604:25: warning: Value stored to 'p' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ net/sched/sch_atm.c:604:25: note: Value stored to 'p' during its initialization is never read struct atm_qdisc_data *p = qdisc_priv(sch); ^ ~~~~~~~~~~~~~~~ Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 16 warnings generated. Suppressed 16 warnings (16 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 17 warnings generated. >> net/sched/sch_ets.c:680:23: warning: Assigned value is garbage or undefined >> [clang-analyzer-core.uninitialized.Assign] q->classes[i].qdisc = queues[i]; ^ net/sched/sch_ets.c:701:6: note: Assuming 'opt' is non-null if (!opt) ^~~~ net/sched/sch_ets.c:701:2: note: Taking false branch if (!opt) ^ net/sched/sch_ets.c:704:8: note: Value assigned to field 'nbands' err = tcf_block_get(&q->block, &q->filter_list, sch, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:705:6: note: Assuming 'err' is 0 if (err) ^~~ net/sched/sch_ets.c:705:2: note: Taking false branch if (err) ^ net/sched/sch_ets.c:709:9: note: Calling 'ets_qdisc_change' return ets_qdisc_change(sch, opt, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:591:2: note: 'oldbands' initialized here unsigned int oldbands = q->nbands; ^~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:598:7: note: 'opt' is non-null if (!opt) { ^~~ net/sched/sch_ets.c:598:2: note: Taking false branch if (!opt) { ^ net/sched/sch_ets.c:603:8: note: Calling 'nla_parse_nested' err = nla_parse_nested(tb, TCA_ETS_MAX, opt, ets_policy, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/net/netlink.h:1207:6: note: Assuming the condition is false if (!(nla->nla_type & NLA_F_NESTED)) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/net/netlink.h:1207:2: note: Taking false branch if (!(nla->nla_type & NLA_F_NESTED)) { ^ include/net/netlink.h:1212:9: note: Assigning value, which participates in a condition later return __nla_parse(tb, maxtype, nla_data(nla), nla_len(nla), policy, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:603:8: note: Returning from 'nla_parse_nested' err = nla_parse_nested(tb, TCA_ETS_MAX, opt, ets_policy, extack); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:604:6: note: Assuming 'err' is >= 0 if (err < 0) ^~~~~~~ net/sched/sch_ets.c:604:2: note: Taking false branch if (err < 0) ^ net/sched/sch_ets.c:607:6: note: Assuming the condition is false if (!tb[TCA_ETS_NBANDS]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:607:2: note: Taking false branch if (!tb[TCA_ETS_NBANDS]) { ^ net/sched/sch_ets.c:612:6: note: Assuming 'nbands' is >= 1 if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^~~~~~~~~~ net/sched/sch_ets.c:612:6: note: Left side of '||' is false net/sched/sch_ets.c:612:20: note: Assuming 'nbands' is <= TCQ_ETS_MAX_BANDS if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^~~~~~~~~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:612:2: note: Taking false branch if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { ^ net/sched/sch_ets.c:619:6: note: Assuming the condition is false if (tb[TCA_ETS_NSTRICT]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:619:2: note: Taking false branch if (tb[TCA_ETS_NSTRICT]) { ^ net/sched/sch_ets.c:627:6: note: Assuming the condition is false if (tb[TCA_ETS_PRIOMAP]) { ^~~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:627:2: note: Taking false branch if (tb[TCA_ETS_PRIOMAP]) { ^ net/sched/sch_ets.c:634:6: note: Assuming the condition is false if (tb[TCA_ETS_QUANTA]) { ^~~~~~~~~~~~~~~~~~ net/sched/sch_ets.c:634:2: note: Taking false branch if (tb[TCA_ETS_QUANTA]) { ^ net/sched/sch_ets.c:643:20: note: 'i' is < 'nbands' for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:643:2: note: Loop condition is true. Entering loop body for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:644:3: note: Taking true branch if (!quanta[i]) ^ net/sched/sch_ets.c:643:20: note: Assuming 'i' is >= 'nbands' for (i = nstrict; i < nbands; i++) { ^~~~~~~~~~ net/sched/sch_ets.c:643:2: note: Loop condition is false. Execution continues on line 649 for (i = nstrict; i < nbands; i++) { ^ net/sched/sch_ets.c:649:21: note: Assuming 'i' is >= 'nbands' vim +680 net/sched/sch_ets.c dcc68b4d8084e1 Petr Machata 2019-12-18 583 dcc68b4d8084e1 Petr Machata 2019-12-18 584 static int ets_qdisc_change(struct Qdisc *sch, struct nlattr *opt, dcc68b4d8084e1 Petr Machata 2019-12-18 585 struct netlink_ext_ack *extack) dcc68b4d8084e1 Petr Machata 2019-12-18 586 { dcc68b4d8084e1 Petr Machata 2019-12-18 587 unsigned int quanta[TCQ_ETS_MAX_BANDS] = {0}; dcc68b4d8084e1 Petr Machata 2019-12-18 588 struct Qdisc *queues[TCQ_ETS_MAX_BANDS]; dcc68b4d8084e1 Petr Machata 2019-12-18 589 struct ets_sched *q = qdisc_priv(sch); dcc68b4d8084e1 Petr Machata 2019-12-18 590 struct nlattr *tb[TCA_ETS_MAX + 1]; dcc68b4d8084e1 Petr Machata 2019-12-18 591 unsigned int oldbands = q->nbands; dcc68b4d8084e1 Petr Machata 2019-12-18 592 u8 priomap[TC_PRIO_MAX + 1]; dcc68b4d8084e1 Petr Machata 2019-12-18 593 unsigned int nstrict = 0; dcc68b4d8084e1 Petr Machata 2019-12-18 594 unsigned int nbands; dcc68b4d8084e1 Petr Machata 2019-12-18 595 unsigned int i; dcc68b4d8084e1 Petr Machata 2019-12-18 596 int err; dcc68b4d8084e1 Petr Machata 2019-12-18 597 dcc68b4d8084e1 Petr Machata 2019-12-18 598 if (!opt) { dcc68b4d8084e1 Petr Machata 2019-12-18 599 NL_SET_ERR_MSG(extack, "ETS options are required for this operation"); dcc68b4d8084e1 Petr Machata 2019-12-18 600 return -EINVAL; dcc68b4d8084e1 Petr Machata 2019-12-18 601 } dcc68b4d8084e1 Petr Machata 2019-12-18 602 dcc68b4d8084e1 Petr Machata 2019-12-18 603 err = nla_parse_nested(tb, TCA_ETS_MAX, opt, ets_policy, extack); dcc68b4d8084e1 Petr Machata 2019-12-18 604 if (err < 0) dcc68b4d8084e1 Petr Machata 2019-12-18 605 return err; dcc68b4d8084e1 Petr Machata 2019-12-18 606 dcc68b4d8084e1 Petr Machata 2019-12-18 607 if (!tb[TCA_ETS_NBANDS]) { dcc68b4d8084e1 Petr Machata 2019-12-18 608 NL_SET_ERR_MSG_MOD(extack, "Number of bands is a required argument"); dcc68b4d8084e1 Petr Machata 2019-12-18 609 return -EINVAL; dcc68b4d8084e1 Petr Machata 2019-12-18 610 } dcc68b4d8084e1 Petr Machata 2019-12-18 611 nbands = nla_get_u8(tb[TCA_ETS_NBANDS]); dcc68b4d8084e1 Petr Machata 2019-12-18 612 if (nbands < 1 || nbands > TCQ_ETS_MAX_BANDS) { dcc68b4d8084e1 Petr Machata 2019-12-18 613 NL_SET_ERR_MSG_MOD(extack, "Invalid number of bands"); dcc68b4d8084e1 Petr Machata 2019-12-18 614 return -EINVAL; dcc68b4d8084e1 Petr Machata 2019-12-18 615 } dcc68b4d8084e1 Petr Machata 2019-12-18 616 /* Unless overridden, traffic goes to the last band. */ dcc68b4d8084e1 Petr Machata 2019-12-18 617 memset(priomap, nbands - 1, sizeof(priomap)); dcc68b4d8084e1 Petr Machata 2019-12-18 618 dcc68b4d8084e1 Petr Machata 2019-12-18 619 if (tb[TCA_ETS_NSTRICT]) { dcc68b4d8084e1 Petr Machata 2019-12-18 620 nstrict = nla_get_u8(tb[TCA_ETS_NSTRICT]); dcc68b4d8084e1 Petr Machata 2019-12-18 621 if (nstrict > nbands) { dcc68b4d8084e1 Petr Machata 2019-12-18 622 NL_SET_ERR_MSG_MOD(extack, "Invalid number of strict bands"); dcc68b4d8084e1 Petr Machata 2019-12-18 623 return -EINVAL; dcc68b4d8084e1 Petr Machata 2019-12-18 624 } dcc68b4d8084e1 Petr Machata 2019-12-18 625 } dcc68b4d8084e1 Petr Machata 2019-12-18 626 dcc68b4d8084e1 Petr Machata 2019-12-18 627 if (tb[TCA_ETS_PRIOMAP]) { dcc68b4d8084e1 Petr Machata 2019-12-18 628 err = ets_qdisc_priomap_parse(tb[TCA_ETS_PRIOMAP], dcc68b4d8084e1 Petr Machata 2019-12-18 629 nbands, priomap, extack); dcc68b4d8084e1 Petr Machata 2019-12-18 630 if (err) dcc68b4d8084e1 Petr Machata 2019-12-18 631 return err; dcc68b4d8084e1 Petr Machata 2019-12-18 632 } dcc68b4d8084e1 Petr Machata 2019-12-18 633 dcc68b4d8084e1 Petr Machata 2019-12-18 634 if (tb[TCA_ETS_QUANTA]) { dcc68b4d8084e1 Petr Machata 2019-12-18 635 err = ets_qdisc_quanta_parse(sch, tb[TCA_ETS_QUANTA], dcc68b4d8084e1 Petr Machata 2019-12-18 636 nbands, nstrict, quanta, extack); dcc68b4d8084e1 Petr Machata 2019-12-18 637 if (err) dcc68b4d8084e1 Petr Machata 2019-12-18 638 return err; dcc68b4d8084e1 Petr Machata 2019-12-18 639 } dcc68b4d8084e1 Petr Machata 2019-12-18 640 /* If there are more bands than strict + quanta provided, the remaining dcc68b4d8084e1 Petr Machata 2019-12-18 641 * ones are ETS with quantum of MTU. Initialize the missing values here. dcc68b4d8084e1 Petr Machata 2019-12-18 642 */ dcc68b4d8084e1 Petr Machata 2019-12-18 643 for (i = nstrict; i < nbands; i++) { dcc68b4d8084e1 Petr Machata 2019-12-18 644 if (!quanta[i]) dcc68b4d8084e1 Petr Machata 2019-12-18 645 quanta[i] = psched_mtu(qdisc_dev(sch)); dcc68b4d8084e1 Petr Machata 2019-12-18 646 } dcc68b4d8084e1 Petr Machata 2019-12-18 647 dcc68b4d8084e1 Petr Machata 2019-12-18 648 /* Before commit, make sure we can allocate all new qdiscs */ dcc68b4d8084e1 Petr Machata 2019-12-18 649 for (i = oldbands; i < nbands; i++) { dcc68b4d8084e1 Petr Machata 2019-12-18 650 queues[i] = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, dcc68b4d8084e1 Petr Machata 2019-12-18 651 ets_class_id(sch, &q->classes[i]), dcc68b4d8084e1 Petr Machata 2019-12-18 652 extack); dcc68b4d8084e1 Petr Machata 2019-12-18 653 if (!queues[i]) { dcc68b4d8084e1 Petr Machata 2019-12-18 654 while (i > oldbands) dcc68b4d8084e1 Petr Machata 2019-12-18 655 qdisc_put(queues[--i]); dcc68b4d8084e1 Petr Machata 2019-12-18 656 return -ENOMEM; dcc68b4d8084e1 Petr Machata 2019-12-18 657 } dcc68b4d8084e1 Petr Machata 2019-12-18 658 } dcc68b4d8084e1 Petr Machata 2019-12-18 659 dcc68b4d8084e1 Petr Machata 2019-12-18 660 sch_tree_lock(sch); dcc68b4d8084e1 Petr Machata 2019-12-18 661 dcc68b4d8084e1 Petr Machata 2019-12-18 662 q->nbands = nbands; cd9b50adc6bb9a Davide Caratti 2021-08-25 663 for (i = nstrict; i < q->nstrict; i++) { cd9b50adc6bb9a Davide Caratti 2021-08-25 664 INIT_LIST_HEAD(&q->classes[i].alist); cd9b50adc6bb9a Davide Caratti 2021-08-25 665 if (q->classes[i].qdisc->q.qlen) { cd9b50adc6bb9a Davide Caratti 2021-08-25 666 list_add_tail(&q->classes[i].alist, &q->active); cd9b50adc6bb9a Davide Caratti 2021-08-25 667 q->classes[i].deficit = quanta[i]; cd9b50adc6bb9a Davide Caratti 2021-08-25 668 } cd9b50adc6bb9a Davide Caratti 2021-08-25 669 } dcc68b4d8084e1 Petr Machata 2019-12-18 670 q->nstrict = nstrict; dcc68b4d8084e1 Petr Machata 2019-12-18 671 memcpy(q->prio2band, priomap, sizeof(priomap)); dcc68b4d8084e1 Petr Machata 2019-12-18 672 dcc68b4d8084e1 Petr Machata 2019-12-18 673 for (i = q->nbands; i < oldbands; i++) dcc68b4d8084e1 Petr Machata 2019-12-18 674 qdisc_tree_flush_backlog(q->classes[i].qdisc); dcc68b4d8084e1 Petr Machata 2019-12-18 675 dcc68b4d8084e1 Petr Machata 2019-12-18 676 for (i = 0; i < q->nbands; i++) dcc68b4d8084e1 Petr Machata 2019-12-18 677 q->classes[i].quantum = quanta[i]; dcc68b4d8084e1 Petr Machata 2019-12-18 678 dcc68b4d8084e1 Petr Machata 2019-12-18 679 for (i = oldbands; i < q->nbands; i++) { dcc68b4d8084e1 Petr Machata 2019-12-18 @680 q->classes[i].qdisc = queues[i]; dcc68b4d8084e1 Petr Machata 2019-12-18 681 if (q->classes[i].qdisc != &noop_qdisc) dcc68b4d8084e1 Petr Machata 2019-12-18 682 qdisc_hash_add(q->classes[i].qdisc, true); dcc68b4d8084e1 Petr Machata 2019-12-18 683 } dcc68b4d8084e1 Petr Machata 2019-12-18 684 dcc68b4d8084e1 Petr Machata 2019-12-18 685 sch_tree_unlock(sch); dcc68b4d8084e1 Petr Machata 2019-12-18 686 d35eb52bd2ac75 Petr Machata 2019-12-18 687 ets_offload_change(sch); dcc68b4d8084e1 Petr Machata 2019-12-18 688 for (i = q->nbands; i < oldbands; i++) { dcc68b4d8084e1 Petr Machata 2019-12-18 689 qdisc_put(q->classes[i].qdisc); dcc68b4d8084e1 Petr Machata 2019-12-18 690 memset(&q->classes[i], 0, sizeof(q->classes[i])); dcc68b4d8084e1 Petr Machata 2019-12-18 691 } dcc68b4d8084e1 Petr Machata 2019-12-18 692 return 0; dcc68b4d8084e1 Petr Machata 2019-12-18 693 } dcc68b4d8084e1 Petr Machata 2019-12-18 694 :::::: The code at line 680 was first introduced by commit :::::: dcc68b4d8084e1ac9af0d4022d6b1aff6a139a33 net: sch_ets: Add a new Qdisc :::::: TO: Petr Machata <pe...@mellanox.com> :::::: CC: David S. Miller <da...@davemloft.net> -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- kbuild@lists.01.org To unsubscribe send an email to kbuild-le...@lists.01.org