Message ID | 20211222120809.2222-2-xiangxia.m.yue@gmail.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: sched: allow user to select txqueue | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for net-next |
netdev/fixes_present | success | Fixes tag not required for -next series |
netdev/subject_prefix | success | Link |
netdev/cover_letter | success | Series has a cover letter |
netdev/patch_count | success | Link |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 4765 this patch: 4765 |
netdev/cc_maintainers | success | CCed 8 of 8 maintainers |
netdev/build_clang | success | Errors and warnings before: 841 this patch: 841 |
netdev/module_param | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/verify_fixes | success | No Fixes tag |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 4918 this patch: 4918 |
netdev/checkpatch | warning | WARNING: please, no spaces at the start of a line |
netdev/kdoc | success | Errors and warnings before: 0 this patch: 0 |
netdev/source_inline | fail | Was 0 now: 2 |
Hi, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on net-next/master] url: https://github.com/0day-ci/linux/commits/xiangxia-m-yue-gmail-com/net-sched-allow-user-to-select-txqueue/20211222-201128 base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git f4f2970dfd87e5132c436e6125148914596a9863 config: i386-randconfig-m031-20211222 (https://download.01.org/0day-ci/archive/20211223/202112230652.grNJivfH-lkp@intel.com/config) compiler: gcc-9 (Debian 9.3.0-22) 9.3.0 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@intel.com> smatch warnings: net/core/dev.c:4114 __dev_queue_xmit() warn: inconsistent indenting vim +4114 net/core/dev.c 638b2a699fd3ec9 Jiri Pirko 2015-05-12 4036 d29f749e252bcdb Dave Jones 2008-07-22 4037 /** 9d08dd3d320fab4 Jason Wang 2014-01-20 4038 * __dev_queue_xmit - transmit a buffer d29f749e252bcdb Dave Jones 2008-07-22 4039 * @skb: buffer to transmit eadec877ce9ca46 Alexander Duyck 2018-07-09 4040 * @sb_dev: suboordinate device used for L2 forwarding offload d29f749e252bcdb Dave Jones 2008-07-22 4041 * d29f749e252bcdb Dave Jones 2008-07-22 4042 * Queue a buffer for transmission to a network device. The caller must d29f749e252bcdb Dave Jones 2008-07-22 4043 * have set the device and priority and built the buffer before calling d29f749e252bcdb Dave Jones 2008-07-22 4044 * this function. The function can be called from an interrupt. d29f749e252bcdb Dave Jones 2008-07-22 4045 * d29f749e252bcdb Dave Jones 2008-07-22 4046 * A negative errno code is returned on a failure. A success does not d29f749e252bcdb Dave Jones 2008-07-22 4047 * guarantee the frame will be transmitted as it may be dropped due d29f749e252bcdb Dave Jones 2008-07-22 4048 * to congestion or traffic shaping. d29f749e252bcdb Dave Jones 2008-07-22 4049 * d29f749e252bcdb Dave Jones 2008-07-22 4050 * ----------------------------------------------------------------------------------- d29f749e252bcdb Dave Jones 2008-07-22 4051 * I notice this method can also return errors from the queue disciplines, d29f749e252bcdb Dave Jones 2008-07-22 4052 * including NET_XMIT_DROP, which is a positive value. So, errors can also d29f749e252bcdb Dave Jones 2008-07-22 4053 * be positive. d29f749e252bcdb Dave Jones 2008-07-22 4054 * d29f749e252bcdb Dave Jones 2008-07-22 4055 * Regardless of the return value, the skb is consumed, so it is currently d29f749e252bcdb Dave Jones 2008-07-22 4056 * difficult to retry a send to this method. (You can bump the ref count d29f749e252bcdb Dave Jones 2008-07-22 4057 * before sending to hold a reference for retry if you are careful.) d29f749e252bcdb Dave Jones 2008-07-22 4058 * d29f749e252bcdb Dave Jones 2008-07-22 4059 * When calling this method, interrupts MUST be enabled. This is because d29f749e252bcdb Dave Jones 2008-07-22 4060 * the BH enable code must have IRQs enabled so that it will not deadlock. d29f749e252bcdb Dave Jones 2008-07-22 4061 * --BLG d29f749e252bcdb Dave Jones 2008-07-22 4062 */ eadec877ce9ca46 Alexander Duyck 2018-07-09 4063 static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) ^1da177e4c3f415 Linus Torvalds 2005-04-16 4064 { ^1da177e4c3f415 Linus Torvalds 2005-04-16 4065 struct net_device *dev = skb->dev; dc2b48475a0a36f David S. Miller 2008-07-08 4066 struct netdev_queue *txq; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4067 struct Qdisc *q; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4068 int rc = -ENOMEM; f53c723902d1ac5 Steffen Klassert 2017-12-20 4069 bool again = false; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4070 6d1ccff62780682 Eric Dumazet 2013-02-05 4071 skb_reset_mac_header(skb); 6d1ccff62780682 Eric Dumazet 2013-02-05 4072 e7fd2885385157d Willem de Bruijn 2014-08-04 4073 if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_SCHED_TSTAMP)) e7ed11ee945438b Yousuk Seung 2021-01-20 4074 __skb_tstamp_tx(skb, NULL, NULL, skb->sk, SCM_TSTAMP_SCHED); e7fd2885385157d Willem de Bruijn 2014-08-04 4075 ^1da177e4c3f415 Linus Torvalds 2005-04-16 4076 /* Disable soft irqs for various locks below. Also ^1da177e4c3f415 Linus Torvalds 2005-04-16 4077 * stops preemption for RCU. ^1da177e4c3f415 Linus Torvalds 2005-04-16 4078 */ d4828d85d188dc7 Herbert Xu 2006-06-22 4079 rcu_read_lock_bh(); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4080 5bc1421e34ecfe0 Neil Horman 2011-11-22 4081 skb_update_prio(skb); 5bc1421e34ecfe0 Neil Horman 2011-11-22 4082 1f211a1b929c804 Daniel Borkmann 2016-01-07 4083 qdisc_pkt_len_init(skb); 1f211a1b929c804 Daniel Borkmann 2016-01-07 4084 #ifdef CONFIG_NET_CLS_ACT 8dc07fdbf2054f1 Willem de Bruijn 2017-01-07 4085 skb->tc_at_ingress = 0; 42df6e1d221dddc Lukas Wunner 2021-10-08 4086 #endif 1f211a1b929c804 Daniel Borkmann 2016-01-07 4087 #ifdef CONFIG_NET_EGRESS 3435309167e51b1 Tonghao Zhang 2021-12-22 4088 if (static_branch_unlikely(&txqueue_needed_key)) 3435309167e51b1 Tonghao Zhang 2021-12-22 4089 netdev_xmit_skip_txqueue(false); 3435309167e51b1 Tonghao Zhang 2021-12-22 4090 aabf6772cc745f9 Davidlohr Bueso 2018-05-08 4091 if (static_branch_unlikely(&egress_needed_key)) { 42df6e1d221dddc Lukas Wunner 2021-10-08 4092 if (nf_hook_egress_active()) { 42df6e1d221dddc Lukas Wunner 2021-10-08 4093 skb = nf_hook_egress(skb, &rc, dev); 42df6e1d221dddc Lukas Wunner 2021-10-08 4094 if (!skb) 42df6e1d221dddc Lukas Wunner 2021-10-08 4095 goto out; 42df6e1d221dddc Lukas Wunner 2021-10-08 4096 } 42df6e1d221dddc Lukas Wunner 2021-10-08 4097 nf_skip_egress(skb, true); 1f211a1b929c804 Daniel Borkmann 2016-01-07 4098 skb = sch_handle_egress(skb, &rc, dev); 1f211a1b929c804 Daniel Borkmann 2016-01-07 4099 if (!skb) 1f211a1b929c804 Daniel Borkmann 2016-01-07 4100 goto out; 42df6e1d221dddc Lukas Wunner 2021-10-08 4101 nf_skip_egress(skb, false); 1f211a1b929c804 Daniel Borkmann 2016-01-07 4102 } 3435309167e51b1 Tonghao Zhang 2021-12-22 4103 3435309167e51b1 Tonghao Zhang 2021-12-22 4104 if (static_branch_unlikely(&txqueue_needed_key) && 3435309167e51b1 Tonghao Zhang 2021-12-22 4105 netdev_xmit_txqueue_skipped()) 3435309167e51b1 Tonghao Zhang 2021-12-22 4106 txq = netdev_tx_queue_mapping(dev, skb); 3435309167e51b1 Tonghao Zhang 2021-12-22 4107 else 1f211a1b929c804 Daniel Borkmann 2016-01-07 4108 #endif 3435309167e51b1 Tonghao Zhang 2021-12-22 4109 txq = netdev_core_pick_tx(dev, skb, sb_dev); 3435309167e51b1 Tonghao Zhang 2021-12-22 4110 0287587884b1504 Eric Dumazet 2014-10-05 4111 /* If device/qdisc don't need skb->dst, release it right now while 0287587884b1504 Eric Dumazet 2014-10-05 4112 * its hot in this cpu cache. 0287587884b1504 Eric Dumazet 2014-10-05 4113 */ 0287587884b1504 Eric Dumazet 2014-10-05 @4114 if (dev->priv_flags & IFF_XMIT_DST_RELEASE) 0287587884b1504 Eric Dumazet 2014-10-05 4115 skb_dst_drop(skb); 0287587884b1504 Eric Dumazet 2014-10-05 4116 else 0287587884b1504 Eric Dumazet 2014-10-05 4117 skb_dst_force(skb); 0287587884b1504 Eric Dumazet 2014-10-05 4118 a898def29e4119b Paul E. McKenney 2010-02-22 4119 q = rcu_dereference_bh(txq->qdisc); 37437bb2e1ae8af David S. Miller 2008-07-16 4120 cf66ba58b5cb8b1 Koki Sanagi 2010-08-23 4121 trace_net_dev_queue(skb); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4122 if (q->enqueue) { bbd8a0d3a3b65d3 Krishna Kumar 2009-08-06 4123 rc = __dev_xmit_skb(skb, q, dev, txq); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4124 goto out; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4125 } ^1da177e4c3f415 Linus Torvalds 2005-04-16 4126 ^1da177e4c3f415 Linus Torvalds 2005-04-16 4127 /* The device has no queue. Common case for software devices: eb13da1a103a808 tcharding 2017-02-09 4128 * loopback, all the sorts of tunnels... ^1da177e4c3f415 Linus Torvalds 2005-04-16 4129 eb13da1a103a808 tcharding 2017-02-09 4130 * Really, it is unlikely that netif_tx_lock protection is necessary eb13da1a103a808 tcharding 2017-02-09 4131 * here. (f.e. loopback and IP tunnels are clean ignoring statistics eb13da1a103a808 tcharding 2017-02-09 4132 * counters.) eb13da1a103a808 tcharding 2017-02-09 4133 * However, it is possible, that they rely on protection eb13da1a103a808 tcharding 2017-02-09 4134 * made by us here. ^1da177e4c3f415 Linus Torvalds 2005-04-16 4135 eb13da1a103a808 tcharding 2017-02-09 4136 * Check this and shot the lock. It is not prone from deadlocks. eb13da1a103a808 tcharding 2017-02-09 4137 *Either shot noqueue qdisc, it is even simpler 8) ^1da177e4c3f415 Linus Torvalds 2005-04-16 4138 */ ^1da177e4c3f415 Linus Torvalds 2005-04-16 4139 if (dev->flags & IFF_UP) { ^1da177e4c3f415 Linus Torvalds 2005-04-16 4140 int cpu = smp_processor_id(); /* ok because BHs are off */ ^1da177e4c3f415 Linus Torvalds 2005-04-16 4141 7a10d8c810cfad3 Eric Dumazet 2021-11-30 4142 /* Other cpus might concurrently change txq->xmit_lock_owner 7a10d8c810cfad3 Eric Dumazet 2021-11-30 4143 * to -1 or to their cpu id, but not to our id. 7a10d8c810cfad3 Eric Dumazet 2021-11-30 4144 */ 7a10d8c810cfad3 Eric Dumazet 2021-11-30 4145 if (READ_ONCE(txq->xmit_lock_owner) != cpu) { 97cdcf37b57e3f2 Florian Westphal 2019-04-01 4146 if (dev_xmit_recursion()) 745e20f1b626b1b Eric Dumazet 2010-09-29 4147 goto recursion_alert; 745e20f1b626b1b Eric Dumazet 2010-09-29 4148 f53c723902d1ac5 Steffen Klassert 2017-12-20 4149 skb = validate_xmit_skb(skb, dev, &again); 1f59533f9ca5634 Jesper Dangaard Brouer 2014-09-03 4150 if (!skb) d21fd63ea385620 Eric Dumazet 2016-04-12 4151 goto out; 1f59533f9ca5634 Jesper Dangaard Brouer 2014-09-03 4152 3744741adab6d91 Willy Tarreau 2020-08-10 4153 PRANDOM_ADD_NOISE(skb, dev, txq, jiffies); c773e847ea8f681 David S. Miller 2008-07-08 4154 HARD_TX_LOCK(dev, txq, cpu); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4155 7346649826382b7 Tom Herbert 2011-11-28 4156 if (!netif_xmit_stopped(txq)) { 97cdcf37b57e3f2 Florian Westphal 2019-04-01 4157 dev_xmit_recursion_inc(); ce93718fb7cdbc0 David S. Miller 2014-08-30 4158 skb = dev_hard_start_xmit(skb, dev, txq, &rc); 97cdcf37b57e3f2 Florian Westphal 2019-04-01 4159 dev_xmit_recursion_dec(); 572a9d7b6fc7f20 Patrick McHardy 2009-11-10 4160 if (dev_xmit_complete(rc)) { c773e847ea8f681 David S. Miller 2008-07-08 4161 HARD_TX_UNLOCK(dev, txq); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4162 goto out; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4163 } ^1da177e4c3f415 Linus Torvalds 2005-04-16 4164 } c773e847ea8f681 David S. Miller 2008-07-08 4165 HARD_TX_UNLOCK(dev, txq); e87cc4728f0e2fb Joe Perches 2012-05-13 4166 net_crit_ratelimited("Virtual device %s asks to queue packet!\n", 7b6cd1ce72176e2 Joe Perches 2012-02-01 4167 dev->name); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4168 } else { ^1da177e4c3f415 Linus Torvalds 2005-04-16 4169 /* Recursion is detected! It is possible, 745e20f1b626b1b Eric Dumazet 2010-09-29 4170 * unfortunately 745e20f1b626b1b Eric Dumazet 2010-09-29 4171 */ 745e20f1b626b1b Eric Dumazet 2010-09-29 4172 recursion_alert: e87cc4728f0e2fb Joe Perches 2012-05-13 4173 net_crit_ratelimited("Dead loop on virtual device %s, fix it urgently!\n", 7b6cd1ce72176e2 Joe Perches 2012-02-01 4174 dev->name); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4175 } ^1da177e4c3f415 Linus Torvalds 2005-04-16 4176 } ^1da177e4c3f415 Linus Torvalds 2005-04-16 4177 ^1da177e4c3f415 Linus Torvalds 2005-04-16 4178 rc = -ENETDOWN; d4828d85d188dc7 Herbert Xu 2006-06-22 4179 rcu_read_unlock_bh(); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4180 015f0688f57ca4d Eric Dumazet 2014-03-27 4181 atomic_long_inc(&dev->tx_dropped); 1f59533f9ca5634 Jesper Dangaard Brouer 2014-09-03 4182 kfree_skb_list(skb); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4183 return rc; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4184 out: d4828d85d188dc7 Herbert Xu 2006-06-22 4185 rcu_read_unlock_bh(); ^1da177e4c3f415 Linus Torvalds 2005-04-16 4186 return rc; ^1da177e4c3f415 Linus Torvalds 2005-04-16 4187 } f663dd9aaf9ed12 Jason Wang 2014-01-10 4188 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 8b0bdeb4734e..708e9f4cca01 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h @@ -3010,6 +3010,9 @@ struct softnet_data { struct { u16 recursion; u8 more; +#ifdef CONFIG_NET_EGRESS + u8 skip_txqueue; +#endif } xmit; #ifdef CONFIG_RPS /* input_queue_head should be written by cpu owning this struct, diff --git a/include/linux/rtnetlink.h b/include/linux/rtnetlink.h index bb9cb84114c1..256bf78daea6 100644 --- a/include/linux/rtnetlink.h +++ b/include/linux/rtnetlink.h @@ -100,6 +100,9 @@ void net_dec_ingress_queue(void); #ifdef CONFIG_NET_EGRESS void net_inc_egress_queue(void); void net_dec_egress_queue(void); +void net_inc_queue_mapping(void); +void net_dec_queue_mapping(void); +void netdev_xmit_skip_txqueue(bool skip); #endif void rtnetlink_init(void); diff --git a/net/core/dev.c b/net/core/dev.c index a855e41bbe39..b197dabcd721 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -1998,6 +1998,20 @@ void net_dec_egress_queue(void) static_branch_dec(&egress_needed_key); } EXPORT_SYMBOL_GPL(net_dec_egress_queue); + +static DEFINE_STATIC_KEY_FALSE(txqueue_needed_key); + +void net_inc_queue_mapping(void) +{ + static_branch_inc(&txqueue_needed_key); +} +EXPORT_SYMBOL_GPL(net_inc_queue_mapping); + +void net_dec_queue_mapping(void) +{ + static_branch_dec(&txqueue_needed_key); +} +EXPORT_SYMBOL_GPL(net_dec_queue_mapping); #endif static DEFINE_STATIC_KEY_FALSE(netstamp_needed_key); @@ -3860,6 +3874,25 @@ sch_handle_egress(struct sk_buff *skb, int *ret, struct net_device *dev) return skb; } + +static inline struct netdev_queue * +netdev_tx_queue_mapping(struct net_device *dev, struct sk_buff *skb) +{ + int qm = skb_get_queue_mapping(skb); + + return netdev_get_tx_queue(dev, netdev_cap_txqueue(dev, qm)); +} + +static inline bool netdev_xmit_txqueue_skipped(void) +{ + return __this_cpu_read(softnet_data.xmit.skip_txqueue); +} + +void netdev_xmit_skip_txqueue(bool skip) +{ + __this_cpu_write(softnet_data.xmit.skip_txqueue, skip); +} +EXPORT_SYMBOL_GPL(netdev_xmit_skip_txqueue); #endif /* CONFIG_NET_EGRESS */ #ifdef CONFIG_XPS @@ -4052,6 +4085,9 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) skb->tc_at_ingress = 0; #endif #ifdef CONFIG_NET_EGRESS + if (static_branch_unlikely(&txqueue_needed_key)) + netdev_xmit_skip_txqueue(false); + if (static_branch_unlikely(&egress_needed_key)) { if (nf_hook_egress_active()) { skb = nf_hook_egress(skb, &rc, dev); @@ -4064,7 +4100,14 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) goto out; nf_skip_egress(skb, false); } + + if (static_branch_unlikely(&txqueue_needed_key) && + netdev_xmit_txqueue_skipped()) + txq = netdev_tx_queue_mapping(dev, skb); + else #endif + txq = netdev_core_pick_tx(dev, skb, sb_dev); + /* If device/qdisc don't need skb->dst, release it right now while * its hot in this cpu cache. */ @@ -4073,7 +4116,6 @@ static int __dev_queue_xmit(struct sk_buff *skb, struct net_device *sb_dev) else skb_dst_force(skb); - txq = netdev_core_pick_tx(dev, skb, sb_dev); q = rcu_dereference_bh(txq->qdisc); trace_net_dev_queue(skb); diff --git a/net/sched/act_skbedit.c b/net/sched/act_skbedit.c index ceba11b198bb..325991080a8a 100644 --- a/net/sched/act_skbedit.c +++ b/net/sched/act_skbedit.c @@ -58,8 +58,12 @@ static int tcf_skbedit_act(struct sk_buff *skb, const struct tc_action *a, } } if (params->flags & SKBEDIT_F_QUEUE_MAPPING && - skb->dev->real_num_tx_queues > params->queue_mapping) + skb->dev->real_num_tx_queues > params->queue_mapping) { +#ifdef CONFIG_NET_EGRESS + netdev_xmit_skip_txqueue(true); +#endif skb_set_queue_mapping(skb, params->queue_mapping); + } if (params->flags & SKBEDIT_F_MARK) { skb->mark &= ~params->mask; skb->mark |= params->mark & params->mask; @@ -225,6 +229,11 @@ static int tcf_skbedit_init(struct net *net, struct nlattr *nla, if (goto_ch) tcf_chain_put_by_act(goto_ch); +#ifdef CONFIG_NET_EGRESS + if (flags & SKBEDIT_F_QUEUE_MAPPING) + net_inc_queue_mapping(); +#endif + return ret; put_chain: if (goto_ch) @@ -295,8 +304,13 @@ static void tcf_skbedit_cleanup(struct tc_action *a) struct tcf_skbedit_params *params; params = rcu_dereference_protected(d->params, 1); - if (params) + if (params) { +#ifdef CONFIG_NET_EGRESS + if (params->flags & SKBEDIT_F_QUEUE_MAPPING) + net_dec_queue_mapping(); +#endif kfree_rcu(params, rcu); + } } static int tcf_skbedit_walker(struct net *net, struct sk_buff *skb,