From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [congwang:sch_bpf 2/2] net/sched/sch_bpf.c:103:39: error: 'TCA_SCH_BPF_ENQUEUE_PROG_TAG' undeclared; did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
Date: Thu, 12 Aug 2021 08:09:04 +0800 [thread overview]
Message-ID: <202108120857.PCVoXpds-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 25469 bytes --]
tree: https://github.com/congwang/linux.git sch_bpf
head: a656e8aec8755a26268ca54b6fce76969dda9c2e
commit: a656e8aec8755a26268ca54b6fce76969dda9c2e [2/2] sch_bpf: draft
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 10.3.0
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
# https://github.com/congwang/linux/commit/a656e8aec8755a26268ca54b6fce76969dda9c2e
git remote add congwang https://github.com/congwang/linux.git
git fetch --no-tags congwang sch_bpf
git checkout a656e8aec8755a26268ca54b6fce76969dda9c2e
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash net/sched/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All error/warnings (new ones prefixed by >>):
net/sched/sch_bpf.c: In function 'sch_bpf_dump':
>> net/sched/sch_bpf.c:103:39: error: 'TCA_SCH_BPF_ENQUEUE_PROG_TAG' undeclared (first use in this function); did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
103 | TCA_SCH_BPF_ENQUEUE_PROG_ID, TCA_SCH_BPF_ENQUEUE_PROG_TAG))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_ENQUEUE_PROG_ID
net/sched/sch_bpf.c:103:39: note: each undeclared identifier is reported only once for each function it appears in
>> net/sched/sch_bpf.c:106:39: error: 'TCA_SCH_BPF_DEQUEUE_PROG_TAG' undeclared (first use in this function); did you mean 'TCA_SCH_BPF_DEQUEUE_PROG_ID'?
106 | TCA_SCH_BPF_DEQUEUE_PROG_ID, TCA_SCH_BPF_DEQUEUE_PROG_TAG))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_DEQUEUE_PROG_ID
net/sched/sch_bpf.c: In function 'sch_bpf_classify':
>> net/sched/sch_bpf.c:135:9: error: 'tcf' undeclared (first use in this function)
135 | while (tcf && (result = tcf_classify(skb, NULL, tcf, &res, false)) >= 0) {
| ^~~
net/sched/sch_bpf.c:129:20: warning: unused variable 'filter' [-Wunused-variable]
129 | struct tcf_proto *filter;
| ^~~~~~
net/sched/sch_bpf.c:128:24: warning: unused variable 'q' [-Wunused-variable]
128 | struct sch_bpf_qdisc *q = qdisc_priv(sch);
| ^
In file included from include/linux/rbtree.h:22,
from include/linux/mm_types.h:10,
from include/linux/buildid.h:5,
from include/linux/module.h:14,
from net/sched/sch_bpf.c:7:
net/sched/sch_bpf.c: In function 'sch_bpf_enqueue':
>> include/linux/rcupdate.h:389:9: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:389:35: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:392:11: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
392 | ((typeof(*p) __force __kernel *)(________p1)); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:190:8: error: 'ret' undeclared (first use in this function); did you mean 'res'?
190 | if ((ret = qdisc_enqueue(skb, cl->qdisc,
| ^~~
| res
>> net/sched/sch_bpf.c:200:20: error: passing argument 2 of 'pq_push' from incompatible pointer type [-Werror=incompatible-pointer-types]
200 | pq_push(&cl->pq, &skb->rbnode);
| ^~~~~~~~~~~~
| |
| struct rb_node *
In file included from net/sched/sch_bpf.c:18:
include/linux/priority_queue.h:29:66: note: expected 'struct pq_node *' but argument is of type 'struct rb_node *'
29 | static inline void pq_push(struct pq_root *root, struct pq_node *node)
| ~~~~~~~~~~~~~~~~^~~~
In file included from include/linux/rbtree.h:22,
from include/linux/mm_types.h:10,
from include/linux/buildid.h:5,
from include/linux/module.h:14,
from net/sched/sch_bpf.c:7:
net/sched/sch_bpf.c: In function 'sch_bpf_dequeue':
>> include/linux/rcupdate.h:389:9: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:389:35: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:392:11: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
392 | ((typeof(*p) __force __kernel *)(________p1)); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:219:28: error: 'skb' undeclared (first use in this function)
219 | bpf_compute_data_pointers(skb);
| ^~~
>> net/sched/sch_bpf.c:230:11: error: assignment to 'struct sk_buff *' from incompatible pointer type 'struct pq_node *' [-Werror=incompatible-pointer-types]
230 | ctx.skb = pq_pop(&cl->pq);
| ^
>> net/sched/sch_bpf.c:236:13: error: 'SCH_BPF_RET_OK' undeclared (first use in this function)
236 | if (res == SCH_BPF_RET_OK) {
| ^~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:238:20: error: 'SCH_BPF_RET_REQUEUE' undeclared (first use in this function)
238 | } else if (res == SCH_BPF_RET_REQUEUE) {
| ^~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:240:20: error: passing argument 2 of 'pq_push' from incompatible pointer type [-Werror=incompatible-pointer-types]
240 | pq_push(&cl->pq, &ctx.skb->rbnode);
| ^~~~~~~~~~~~~~~~
| |
| struct rb_node *
In file included from net/sched/sch_bpf.c:18:
include/linux/priority_queue.h:29:66: note: expected 'struct pq_node *' but argument is of type 'struct rb_node *'
29 | static inline void pq_push(struct pq_root *root, struct pq_node *node)
| ~~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c: In function 'sch_bpf_search':
>> net/sched/sch_bpf.c:283:37: warning: passing argument 1 of 'sch_bpf_find' makes pointer from integer without a cast [-Wint-conversion]
283 | return (unsigned long)sch_bpf_find(handle, sch);
| ^~~~~~
| |
| u32 {aka unsigned int}
net/sched/sch_bpf.c:115:57: note: expected 'struct Qdisc *' but argument is of type 'u32' {aka 'unsigned int'}
115 | static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
| ~~~~~~~~~~~~~~^~~
>> net/sched/sch_bpf.c:283:45: warning: passing argument 2 of 'sch_bpf_find' makes integer from pointer without a cast [-Wint-conversion]
283 | return (unsigned long)sch_bpf_find(handle, sch);
| ^~~
| |
| struct Qdisc *
net/sched/sch_bpf.c:115:66: note: expected 'u32' {aka 'unsigned int'} but argument is of type 'struct Qdisc *'
115 | static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
| ~~~~^~~~~~~
net/sched/sch_bpf.c: At top level:
>> net/sched/sch_bpf.c:297:3: error: 'TCA_SCH_BPF_ENQUEUE_PROG_FD' undeclared here (not in a function); did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
297 | [TCA_SCH_BPF_ENQUEUE_PROG_FD] = { .type = NLA_U32 },
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_ENQUEUE_PROG_ID
>> net/sched/sch_bpf.c:297:3: error: array index in initializer not of integer type
net/sched/sch_bpf.c:297:3: note: (near initialization for 'sch_bpf_policy')
>> net/sched/sch_bpf.c:300:3: error: 'TCA_SCH_BPF_DEQUEUE_PROG_FD' undeclared here (not in a function); did you mean 'TCA_SCH_BPF_DEQUEUE_PROG_ID'?
300 | [TCA_SCH_BPF_DEQUEUE_PROG_FD] = { .type = NLA_U32 },
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_DEQUEUE_PROG_ID
net/sched/sch_bpf.c:300:3: error: array index in initializer not of integer type
net/sched/sch_bpf.c:300:3: note: (near initialization for 'sch_bpf_policy')
net/sched/sch_bpf.c: In function 'bpf_init_prog':
>> net/sched/sch_bpf.c:313:33: error: 'BPF_PROG_TYPE_SCHED_SCH' undeclared (first use in this function); did you mean 'BPF_PROG_TYPE_SCHED_ACT'?
313 | fp = bpf_prog_get_type(bpf_fd, BPF_PROG_TYPE_SCHED_SCH);
| ^~~~~~~~~~~~~~~~~~~~~~~
| BPF_PROG_TYPE_SCHED_ACT
net/sched/sch_bpf.c: At top level:
net/sched/sch_bpf.c:330:8: error: return type defaults to 'int' [-Werror=return-type]
330 | static bpf_cleanup_prog(struct sch_bpf_prog *prog)
| ^~~~~~~~~~~~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_change':
>> net/sched/sch_bpf.c:353:11: error: incompatible type for argument 2 of 'bpf_init_prog'
353 | opt[TCA_SCH_BPF_ENQUEUE_PROG_NAME], &q->enqueue_prog);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| struct nlattr
net/sched/sch_bpf.c:305:60: note: expected 'struct nlattr *' but argument is of type 'struct nlattr'
305 | static int bpf_init_prog(struct nlattr *fd, struct nlattr *name, struct sch_bpf_prog *prog)
| ~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c:357:11: error: incompatible type for argument 2 of 'bpf_init_prog'
357 | opt[TCA_SCH_BPF_DEQUEUE_PROG_NAME], &q->dequeue_prog);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| struct nlattr
net/sched/sch_bpf.c:305:60: note: expected 'struct nlattr *' but argument is of type 'struct nlattr'
305 | static int bpf_init_prog(struct nlattr *fd, struct nlattr *name, struct sch_bpf_prog *prog)
| ~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c:342:6: warning: unused variable 'gen_flags' [-Wunused-variable]
342 | u32 gen_flags = 0;
| ^~~~~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_init':
>> net/sched/sch_bpf.c:387:3: error: 'err' undeclared (first use in this function)
387 | err = sch_bpf_change(sch, opt, extack);
| ^~~
net/sched/sch_bpf.c: In function 'sch_bpf_change_class':
net/sched/sch_bpf.c:427:3: error: 'err' undeclared (first use in this function)
427 | err = -ENOBUFS;
| ^~~
>> net/sched/sch_bpf.c:430:4: error: label 'failure' used but not defined
430 | goto failure;
| ^~~~
net/sched/sch_bpf.c:423:60: warning: unused variable 'parent' [-Wunused-variable]
423 | struct sch_bpf_class *cl = (struct sch_bpf_class *)*arg, *parent;
| ^~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_delete':
net/sched/sch_bpf.c:449:1: error: no return statement in function returning non-void [-Werror=return-type]
449 | }
| ^
net/sched/sch_bpf.c: At top level:
net/sched/sch_bpf.c:480:13: error: initialization of 'int (*)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *)' from incompatible pointer type 'int (*)(struct Qdisc *, long unsigned int)' [-Werror=incompatible-pointer-types]
480 | .delete = sch_bpf_delete,
| ^~~~~~~~~~~~~~
net/sched/sch_bpf.c:480:13: note: (near initialization for 'sch_bpf_class_ops.delete')
net/sched/sch_bpf.c:484:11: error: 'sch_bpf_dump_class' undeclared here (not in a function); did you mean 'sch_bpf_dump_prog'?
484 | .dump = sch_bpf_dump_class,
| ^~~~~~~~~~~~~~~~~~
| sch_bpf_dump_prog
net/sched/sch_bpf.c:485:16: error: 'sch_bpf_dump_class_stats' undeclared here (not in a function)
485 | .dump_stats = sch_bpf_dump_class_stats,
| ^~~~~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:497:12: error: 'sch_bpf_reset' undeclared here (not in a function); did you mean 'sch_bpf_delete'?
497 | .reset = sch_bpf_reset,
| ^~~~~~~~~~~~~
| sch_bpf_delete
net/sched/sch_bpf.c:501:16: error: 'sch_bpf_dump_stats' undeclared here (not in a function); did you mean 'sch_bpf_dump_prog'?
501 | .dump_stats = sch_bpf_dump_stats,
| ^~~~~~~~~~~~~~~~~~
| sch_bpf_dump_prog
net/sched/sch_bpf.c:505:19: error: conflicting types for 'sch_bpf_init'
505 | static int __init sch_bpf_init(void)
| ^~~~~~~~~~~~
net/sched/sch_bpf.c:381:12: note: previous definition of 'sch_bpf_init' was here
381 | static int sch_bpf_init(struct Qdisc *sch, struct nlattr *opt,
| ^~~~~~~~~~~~
In file included from net/sched/sch_bpf.c:7:
include/linux/module.h:133:6: warning: 'init_module' alias between functions of incompatible types 'int(void)' and 'int(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *)' [-Wattribute-alias=]
133 | int init_module(void) __copy(initfn) \
| ^~~~~~~~~~~
net/sched/sch_bpf.c:515:1: note: in expansion of macro 'module_init'
515 | module_init(sch_bpf_init)
| ^~~~~~~~~~~
net/sched/sch_bpf.c:381:12: note: aliased declaration here
381 | static int sch_bpf_init(struct Qdisc *sch, struct nlattr *opt,
| ^~~~~~~~~~~~
In file included from net/sched/sch_bpf.c:7:
include/linux/module.h:133:6: error: section of alias 'init_module' must match section of its target
133 | int init_module(void) __copy(initfn) \
| ^~~~~~~~~~~
net/sched/sch_bpf.c:515:1: note: in expansion of macro 'module_init'
515 | module_init(sch_bpf_init)
| ^~~~~~~~~~~
cc1: some warnings being treated as errors
vim +103 net/sched/sch_bpf.c
92
93 static int sch_bpf_dump(struct Qdisc *sch, struct sk_buff *skb)
94 {
95 struct sch_bpf_qdisc *q = qdisc_priv(sch);
96 struct nlattr *opts;
97
98 opts = nla_nest_start_noflag(skb, TCA_OPTIONS);
99 if (opts == NULL)
100 goto nla_put_failure;
101
102 if (sch_bpf_dump_prog(&q->enqueue_prog, skb, TCA_SCH_BPF_ENQUEUE_PROG_NAME,
> 103 TCA_SCH_BPF_ENQUEUE_PROG_ID, TCA_SCH_BPF_ENQUEUE_PROG_TAG))
104 goto nla_put_failure;
105 if (sch_bpf_dump_prog(&q->dequeue_prog, skb, TCA_SCH_BPF_DEQUEUE_PROG_NAME,
> 106 TCA_SCH_BPF_DEQUEUE_PROG_ID, TCA_SCH_BPF_DEQUEUE_PROG_TAG))
107 goto nla_put_failure;
108
109 return nla_nest_end(skb, opts);
110
111 nla_put_failure:
112 return -1;
113 }
114
115 static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
116 {
117 struct sch_bpf_qdisc *q = qdisc_priv(sch);
118 struct Qdisc_class_common *clc;
119
120 clc = qdisc_class_find(&q->clhash, classid);
121 if (clc == NULL)
122 return NULL;
123 return container_of(clc, struct sch_bpf_class, common);
124 }
125
126 static struct sch_bpf_class *sch_bpf_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
127 {
128 struct sch_bpf_qdisc *q = qdisc_priv(sch);
129 struct tcf_proto *filter;
130 struct sch_bpf_class *cl;
131 struct tcf_result res;
132 int result;
133
134 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
> 135 while (tcf && (result = tcf_classify(skb, NULL, tcf, &res, false)) >= 0) {
136 #ifdef CONFIG_NET_CLS_ACT
137 switch (result) {
138 case TC_ACT_QUEUED:
139 case TC_ACT_STOLEN:
140 case TC_ACT_TRAP:
141 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
142 fallthrough;
143 case TC_ACT_SHOT:
144 return NULL;
145 }
146 #endif
147 cl = (void *)res.class;
148 if (!cl) {
149 cl = sch_bpf_find(sch, res.classid);
150 if (!cl)
151 break;
152 }
153
154 tcf = rcu_dereference_bh(cl->filter_list);
155 }
156
157 return cl;
158 }
159
160 static int sch_bpf_enqueue(struct sk_buff *skb, struct Qdisc *sch,
161 struct sk_buff **to_free)
162 {
163 struct sch_bpf_qdisc *q = qdisc_priv(sch);
164 unsigned int len = qdisc_pkt_len(skb);
165 struct sch_bpf_ctx ctx = {};
166 struct sch_bpf_class *cl;
167 int res;
168
169 cl = sch_bpf_classify(skb, sch, &res);
170 if (!cl) {
171 struct bpf_prog *enqueue;
172
173 enqueue = rcu_dereference(q->enqueue_prog);
174 bpf_compute_data_pointers(skb);
175
176 ctx.skb = skb;
177 ctx.nr_classes = q->clhash.hashelems;
178 ctx.nr_packets = sch->q.qlen;
179 res = BPF_PROG_RUN(enqueue, &ctx);
180 cl = sch_bpf_find(sch, ctx.classid);
181 if (!cl) {
182 if (res & __NET_XMIT_BYPASS)
183 qdisc_qstats_drop(sch);
184 __qdisc_drop(skb, to_free);
185 return res;
186 }
187 }
188
189 if (cl->qdisc) {
> 190 if ((ret = qdisc_enqueue(skb, cl->qdisc,
191 to_free)) != NET_XMIT_SUCCESS) {
192 if (net_xmit_drop_count(ret)) {
193 qdisc_qstats_drop(sch);
194 cl->drops++;
195 }
196 return ret;
197 }
198 } else {
199 sch_bpf_skb_cb(skb)->rank = ctx.rank;
> 200 pq_push(&cl->pq, &skb->rbnode);
201 }
202
203 sch->qstats.backlog += len;
204 sch->q.qlen++;
205 return res;
206 }
207
208 static struct sk_buff *sch_bpf_dequeue(struct Qdisc *sch)
209 {
210 struct sch_bpf_qdisc *q = qdisc_priv(sch);
211 struct sch_bpf_ctx ctx = {};
212 struct sk_buff *ret = NULL;
213 struct bpf_prog *dequeue;
214 struct sch_bpf_class *cl;
215 struct pq_node *flow;
216 int res;
217
218 dequeue = rcu_dereference(q->dequeue_prog);
> 219 bpf_compute_data_pointers(skb);
220
221 flow = pq_pop(&q->flows);
222 if (!flow)
223 return NULL;
224
225 cl = container_of(flow, struct sch_bpf_class, node);
226 if (cl->qdisc) {
227 ctx.skb = cl->qdisc->dequeue(cl->qdisc);
228 ctx.classid = cl->common.classid;
229 } else {
> 230 ctx.skb = pq_pop(&cl->pq);
231 ctx.classid = cl->rank;
232 }
233 ctx.nr_classes = q->clhash.hashelems;
234 ctx.nr_packets = sch->q.qlen;
235 res = BPF_PROG_RUN(dequeue, &ctx);
> 236 if (res == SCH_BPF_RET_OK) {
237 ret = ctx.skb;
> 238 } else if (res == SCH_BPF_RET_REQUEUE) {
239 sch_bpf_skb_cb(ctx.skb)->rank = ctx.rank;
240 pq_push(&cl->pq, &ctx.skb->rbnode);
241 ret = NULL;
242 } else {
243 kfree_skb(ctx.skb);
244 ret = NULL;
245 }
246
247 cl->rank = ctx.classid;
248 if (pq_top(&cl->pq)) {
249 pq_push(&q->flows, &cl->node);
250 }
251 return ret;
252 }
253
254 static struct Qdisc *sch_bpf_leaf(struct Qdisc *sch, unsigned long arg)
255 {
256 struct sch_bpf_class *cl = (struct sch_bpf_class *)arg;
257
258 return cl->qdisc;
259 }
260
261 static int sch_bpf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
262 struct Qdisc **old, struct netlink_ext_ack *extack)
263 {
264 struct sch_bpf_class *cl = (struct sch_bpf_class *)arg;
265
266 if (new)
267 *old = qdisc_replace(sch, new, &cl->qdisc);
268 return 0;
269 }
270
271 static unsigned long sch_bpf_bind(struct Qdisc *sch, unsigned long parent,
272 u32 classid)
273 {
274 return 0;
275 }
276
277 static void sch_bpf_unbind(struct Qdisc *q, unsigned long cl)
278 {
279 }
280
281 static unsigned long sch_bpf_search(struct Qdisc *sch, u32 handle)
282 {
> 283 return (unsigned long)sch_bpf_find(handle, sch);
284 }
285
286 static struct tcf_block *sch_bpf_tcf_block(struct Qdisc *sch, unsigned long cl,
287 struct netlink_ext_ack *extack)
288 {
289 struct sch_bpf_qdisc *q = qdisc_priv(sch);
290
291 if (cl)
292 return NULL;
293 return q->block;
294 }
295
296 static const struct nla_policy sch_bpf_policy[TCA_SCH_BPF_MAX + 1] = {
> 297 [TCA_SCH_BPF_ENQUEUE_PROG_FD] = { .type = NLA_U32 },
298 [TCA_SCH_BPF_ENQUEUE_PROG_NAME] = { .type = NLA_NUL_STRING,
299 .len = ACT_BPF_NAME_LEN },
> 300 [TCA_SCH_BPF_DEQUEUE_PROG_FD] = { .type = NLA_U32 },
301 [TCA_SCH_BPF_DEQUEUE_PROG_NAME] = { .type = NLA_NUL_STRING,
302 .len = ACT_BPF_NAME_LEN },
303 };
304
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 64522 bytes --]
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Cong Wang <xiyou.wangcong@gmail.com>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org
Subject: [congwang:sch_bpf 2/2] net/sched/sch_bpf.c:103:39: error: 'TCA_SCH_BPF_ENQUEUE_PROG_TAG' undeclared; did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
Date: Thu, 12 Aug 2021 08:09:04 +0800 [thread overview]
Message-ID: <202108120857.PCVoXpds-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 24966 bytes --]
tree: https://github.com/congwang/linux.git sch_bpf
head: a656e8aec8755a26268ca54b6fce76969dda9c2e
commit: a656e8aec8755a26268ca54b6fce76969dda9c2e [2/2] sch_bpf: draft
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 10.3.0
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
# https://github.com/congwang/linux/commit/a656e8aec8755a26268ca54b6fce76969dda9c2e
git remote add congwang https://github.com/congwang/linux.git
git fetch --no-tags congwang sch_bpf
git checkout a656e8aec8755a26268ca54b6fce76969dda9c2e
# save the attached .config to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=ia64 SHELL=/bin/bash net/sched/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All error/warnings (new ones prefixed by >>):
net/sched/sch_bpf.c: In function 'sch_bpf_dump':
>> net/sched/sch_bpf.c:103:39: error: 'TCA_SCH_BPF_ENQUEUE_PROG_TAG' undeclared (first use in this function); did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
103 | TCA_SCH_BPF_ENQUEUE_PROG_ID, TCA_SCH_BPF_ENQUEUE_PROG_TAG))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_ENQUEUE_PROG_ID
net/sched/sch_bpf.c:103:39: note: each undeclared identifier is reported only once for each function it appears in
>> net/sched/sch_bpf.c:106:39: error: 'TCA_SCH_BPF_DEQUEUE_PROG_TAG' undeclared (first use in this function); did you mean 'TCA_SCH_BPF_DEQUEUE_PROG_ID'?
106 | TCA_SCH_BPF_DEQUEUE_PROG_ID, TCA_SCH_BPF_DEQUEUE_PROG_TAG))
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_DEQUEUE_PROG_ID
net/sched/sch_bpf.c: In function 'sch_bpf_classify':
>> net/sched/sch_bpf.c:135:9: error: 'tcf' undeclared (first use in this function)
135 | while (tcf && (result = tcf_classify(skb, NULL, tcf, &res, false)) >= 0) {
| ^~~
net/sched/sch_bpf.c:129:20: warning: unused variable 'filter' [-Wunused-variable]
129 | struct tcf_proto *filter;
| ^~~~~~
net/sched/sch_bpf.c:128:24: warning: unused variable 'q' [-Wunused-variable]
128 | struct sch_bpf_qdisc *q = qdisc_priv(sch);
| ^
In file included from include/linux/rbtree.h:22,
from include/linux/mm_types.h:10,
from include/linux/buildid.h:5,
from include/linux/module.h:14,
from net/sched/sch_bpf.c:7:
net/sched/sch_bpf.c: In function 'sch_bpf_enqueue':
>> include/linux/rcupdate.h:389:9: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:389:35: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:392:11: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
392 | ((typeof(*p) __force __kernel *)(________p1)); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:173:13: note: in expansion of macro 'rcu_dereference'
173 | enqueue = rcu_dereference(q->enqueue_prog);
| ^~~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:190:8: error: 'ret' undeclared (first use in this function); did you mean 'res'?
190 | if ((ret = qdisc_enqueue(skb, cl->qdisc,
| ^~~
| res
>> net/sched/sch_bpf.c:200:20: error: passing argument 2 of 'pq_push' from incompatible pointer type [-Werror=incompatible-pointer-types]
200 | pq_push(&cl->pq, &skb->rbnode);
| ^~~~~~~~~~~~
| |
| struct rb_node *
In file included from net/sched/sch_bpf.c:18:
include/linux/priority_queue.h:29:66: note: expected 'struct pq_node *' but argument is of type 'struct rb_node *'
29 | static inline void pq_push(struct pq_root *root, struct pq_node *node)
| ~~~~~~~~~~~~~~~~^~~~
In file included from include/linux/rbtree.h:22,
from include/linux/mm_types.h:10,
from include/linux/buildid.h:5,
from include/linux/module.h:14,
from net/sched/sch_bpf.c:7:
net/sched/sch_bpf.c: In function 'sch_bpf_dequeue':
>> include/linux/rcupdate.h:389:9: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:389:35: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
389 | typeof(*p) *________p1 = (typeof(*p) *__force)READ_ONCE(p); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
include/linux/rcupdate.h:392:11: error: invalid type argument of unary '*' (have 'struct sch_bpf_prog')
392 | ((typeof(*p) __force __kernel *)(________p1)); \
| ^
include/linux/rcupdate.h:528:2: note: in expansion of macro '__rcu_dereference_check'
528 | __rcu_dereference_check((p), (c) || rcu_read_lock_held(), __rcu)
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/rcupdate.h:596:28: note: in expansion of macro 'rcu_dereference_check'
596 | #define rcu_dereference(p) rcu_dereference_check(p, 0)
| ^~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:218:12: note: in expansion of macro 'rcu_dereference'
218 | dequeue = rcu_dereference(q->dequeue_prog);
| ^~~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:219:28: error: 'skb' undeclared (first use in this function)
219 | bpf_compute_data_pointers(skb);
| ^~~
>> net/sched/sch_bpf.c:230:11: error: assignment to 'struct sk_buff *' from incompatible pointer type 'struct pq_node *' [-Werror=incompatible-pointer-types]
230 | ctx.skb = pq_pop(&cl->pq);
| ^
>> net/sched/sch_bpf.c:236:13: error: 'SCH_BPF_RET_OK' undeclared (first use in this function)
236 | if (res == SCH_BPF_RET_OK) {
| ^~~~~~~~~~~~~~
>> net/sched/sch_bpf.c:238:20: error: 'SCH_BPF_RET_REQUEUE' undeclared (first use in this function)
238 | } else if (res == SCH_BPF_RET_REQUEUE) {
| ^~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:240:20: error: passing argument 2 of 'pq_push' from incompatible pointer type [-Werror=incompatible-pointer-types]
240 | pq_push(&cl->pq, &ctx.skb->rbnode);
| ^~~~~~~~~~~~~~~~
| |
| struct rb_node *
In file included from net/sched/sch_bpf.c:18:
include/linux/priority_queue.h:29:66: note: expected 'struct pq_node *' but argument is of type 'struct rb_node *'
29 | static inline void pq_push(struct pq_root *root, struct pq_node *node)
| ~~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c: In function 'sch_bpf_search':
>> net/sched/sch_bpf.c:283:37: warning: passing argument 1 of 'sch_bpf_find' makes pointer from integer without a cast [-Wint-conversion]
283 | return (unsigned long)sch_bpf_find(handle, sch);
| ^~~~~~
| |
| u32 {aka unsigned int}
net/sched/sch_bpf.c:115:57: note: expected 'struct Qdisc *' but argument is of type 'u32' {aka 'unsigned int'}
115 | static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
| ~~~~~~~~~~~~~~^~~
>> net/sched/sch_bpf.c:283:45: warning: passing argument 2 of 'sch_bpf_find' makes integer from pointer without a cast [-Wint-conversion]
283 | return (unsigned long)sch_bpf_find(handle, sch);
| ^~~
| |
| struct Qdisc *
net/sched/sch_bpf.c:115:66: note: expected 'u32' {aka 'unsigned int'} but argument is of type 'struct Qdisc *'
115 | static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
| ~~~~^~~~~~~
net/sched/sch_bpf.c: At top level:
>> net/sched/sch_bpf.c:297:3: error: 'TCA_SCH_BPF_ENQUEUE_PROG_FD' undeclared here (not in a function); did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'?
297 | [TCA_SCH_BPF_ENQUEUE_PROG_FD] = { .type = NLA_U32 },
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_ENQUEUE_PROG_ID
>> net/sched/sch_bpf.c:297:3: error: array index in initializer not of integer type
net/sched/sch_bpf.c:297:3: note: (near initialization for 'sch_bpf_policy')
>> net/sched/sch_bpf.c:300:3: error: 'TCA_SCH_BPF_DEQUEUE_PROG_FD' undeclared here (not in a function); did you mean 'TCA_SCH_BPF_DEQUEUE_PROG_ID'?
300 | [TCA_SCH_BPF_DEQUEUE_PROG_FD] = { .type = NLA_U32 },
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
| TCA_SCH_BPF_DEQUEUE_PROG_ID
net/sched/sch_bpf.c:300:3: error: array index in initializer not of integer type
net/sched/sch_bpf.c:300:3: note: (near initialization for 'sch_bpf_policy')
net/sched/sch_bpf.c: In function 'bpf_init_prog':
>> net/sched/sch_bpf.c:313:33: error: 'BPF_PROG_TYPE_SCHED_SCH' undeclared (first use in this function); did you mean 'BPF_PROG_TYPE_SCHED_ACT'?
313 | fp = bpf_prog_get_type(bpf_fd, BPF_PROG_TYPE_SCHED_SCH);
| ^~~~~~~~~~~~~~~~~~~~~~~
| BPF_PROG_TYPE_SCHED_ACT
net/sched/sch_bpf.c: At top level:
net/sched/sch_bpf.c:330:8: error: return type defaults to 'int' [-Werror=return-type]
330 | static bpf_cleanup_prog(struct sch_bpf_prog *prog)
| ^~~~~~~~~~~~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_change':
>> net/sched/sch_bpf.c:353:11: error: incompatible type for argument 2 of 'bpf_init_prog'
353 | opt[TCA_SCH_BPF_ENQUEUE_PROG_NAME], &q->enqueue_prog);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| struct nlattr
net/sched/sch_bpf.c:305:60: note: expected 'struct nlattr *' but argument is of type 'struct nlattr'
305 | static int bpf_init_prog(struct nlattr *fd, struct nlattr *name, struct sch_bpf_prog *prog)
| ~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c:357:11: error: incompatible type for argument 2 of 'bpf_init_prog'
357 | opt[TCA_SCH_BPF_DEQUEUE_PROG_NAME], &q->dequeue_prog);
| ~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| struct nlattr
net/sched/sch_bpf.c:305:60: note: expected 'struct nlattr *' but argument is of type 'struct nlattr'
305 | static int bpf_init_prog(struct nlattr *fd, struct nlattr *name, struct sch_bpf_prog *prog)
| ~~~~~~~~~~~~~~~^~~~
net/sched/sch_bpf.c:342:6: warning: unused variable 'gen_flags' [-Wunused-variable]
342 | u32 gen_flags = 0;
| ^~~~~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_init':
>> net/sched/sch_bpf.c:387:3: error: 'err' undeclared (first use in this function)
387 | err = sch_bpf_change(sch, opt, extack);
| ^~~
net/sched/sch_bpf.c: In function 'sch_bpf_change_class':
net/sched/sch_bpf.c:427:3: error: 'err' undeclared (first use in this function)
427 | err = -ENOBUFS;
| ^~~
>> net/sched/sch_bpf.c:430:4: error: label 'failure' used but not defined
430 | goto failure;
| ^~~~
net/sched/sch_bpf.c:423:60: warning: unused variable 'parent' [-Wunused-variable]
423 | struct sch_bpf_class *cl = (struct sch_bpf_class *)*arg, *parent;
| ^~~~~~
net/sched/sch_bpf.c: In function 'sch_bpf_delete':
net/sched/sch_bpf.c:449:1: error: no return statement in function returning non-void [-Werror=return-type]
449 | }
| ^
net/sched/sch_bpf.c: At top level:
net/sched/sch_bpf.c:480:13: error: initialization of 'int (*)(struct Qdisc *, long unsigned int, struct netlink_ext_ack *)' from incompatible pointer type 'int (*)(struct Qdisc *, long unsigned int)' [-Werror=incompatible-pointer-types]
480 | .delete = sch_bpf_delete,
| ^~~~~~~~~~~~~~
net/sched/sch_bpf.c:480:13: note: (near initialization for 'sch_bpf_class_ops.delete')
net/sched/sch_bpf.c:484:11: error: 'sch_bpf_dump_class' undeclared here (not in a function); did you mean 'sch_bpf_dump_prog'?
484 | .dump = sch_bpf_dump_class,
| ^~~~~~~~~~~~~~~~~~
| sch_bpf_dump_prog
net/sched/sch_bpf.c:485:16: error: 'sch_bpf_dump_class_stats' undeclared here (not in a function)
485 | .dump_stats = sch_bpf_dump_class_stats,
| ^~~~~~~~~~~~~~~~~~~~~~~~
net/sched/sch_bpf.c:497:12: error: 'sch_bpf_reset' undeclared here (not in a function); did you mean 'sch_bpf_delete'?
497 | .reset = sch_bpf_reset,
| ^~~~~~~~~~~~~
| sch_bpf_delete
net/sched/sch_bpf.c:501:16: error: 'sch_bpf_dump_stats' undeclared here (not in a function); did you mean 'sch_bpf_dump_prog'?
501 | .dump_stats = sch_bpf_dump_stats,
| ^~~~~~~~~~~~~~~~~~
| sch_bpf_dump_prog
net/sched/sch_bpf.c:505:19: error: conflicting types for 'sch_bpf_init'
505 | static int __init sch_bpf_init(void)
| ^~~~~~~~~~~~
net/sched/sch_bpf.c:381:12: note: previous definition of 'sch_bpf_init' was here
381 | static int sch_bpf_init(struct Qdisc *sch, struct nlattr *opt,
| ^~~~~~~~~~~~
In file included from net/sched/sch_bpf.c:7:
include/linux/module.h:133:6: warning: 'init_module' alias between functions of incompatible types 'int(void)' and 'int(struct Qdisc *, struct nlattr *, struct netlink_ext_ack *)' [-Wattribute-alias=]
133 | int init_module(void) __copy(initfn) \
| ^~~~~~~~~~~
net/sched/sch_bpf.c:515:1: note: in expansion of macro 'module_init'
515 | module_init(sch_bpf_init)
| ^~~~~~~~~~~
net/sched/sch_bpf.c:381:12: note: aliased declaration here
381 | static int sch_bpf_init(struct Qdisc *sch, struct nlattr *opt,
| ^~~~~~~~~~~~
In file included from net/sched/sch_bpf.c:7:
include/linux/module.h:133:6: error: section of alias 'init_module' must match section of its target
133 | int init_module(void) __copy(initfn) \
| ^~~~~~~~~~~
net/sched/sch_bpf.c:515:1: note: in expansion of macro 'module_init'
515 | module_init(sch_bpf_init)
| ^~~~~~~~~~~
cc1: some warnings being treated as errors
vim +103 net/sched/sch_bpf.c
92
93 static int sch_bpf_dump(struct Qdisc *sch, struct sk_buff *skb)
94 {
95 struct sch_bpf_qdisc *q = qdisc_priv(sch);
96 struct nlattr *opts;
97
98 opts = nla_nest_start_noflag(skb, TCA_OPTIONS);
99 if (opts == NULL)
100 goto nla_put_failure;
101
102 if (sch_bpf_dump_prog(&q->enqueue_prog, skb, TCA_SCH_BPF_ENQUEUE_PROG_NAME,
> 103 TCA_SCH_BPF_ENQUEUE_PROG_ID, TCA_SCH_BPF_ENQUEUE_PROG_TAG))
104 goto nla_put_failure;
105 if (sch_bpf_dump_prog(&q->dequeue_prog, skb, TCA_SCH_BPF_DEQUEUE_PROG_NAME,
> 106 TCA_SCH_BPF_DEQUEUE_PROG_ID, TCA_SCH_BPF_DEQUEUE_PROG_TAG))
107 goto nla_put_failure;
108
109 return nla_nest_end(skb, opts);
110
111 nla_put_failure:
112 return -1;
113 }
114
115 static struct sch_bpf_class *sch_bpf_find(struct Qdisc *sch, u32 classid)
116 {
117 struct sch_bpf_qdisc *q = qdisc_priv(sch);
118 struct Qdisc_class_common *clc;
119
120 clc = qdisc_class_find(&q->clhash, classid);
121 if (clc == NULL)
122 return NULL;
123 return container_of(clc, struct sch_bpf_class, common);
124 }
125
126 static struct sch_bpf_class *sch_bpf_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
127 {
128 struct sch_bpf_qdisc *q = qdisc_priv(sch);
129 struct tcf_proto *filter;
130 struct sch_bpf_class *cl;
131 struct tcf_result res;
132 int result;
133
134 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
> 135 while (tcf && (result = tcf_classify(skb, NULL, tcf, &res, false)) >= 0) {
136 #ifdef CONFIG_NET_CLS_ACT
137 switch (result) {
138 case TC_ACT_QUEUED:
139 case TC_ACT_STOLEN:
140 case TC_ACT_TRAP:
141 *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
142 fallthrough;
143 case TC_ACT_SHOT:
144 return NULL;
145 }
146 #endif
147 cl = (void *)res.class;
148 if (!cl) {
149 cl = sch_bpf_find(sch, res.classid);
150 if (!cl)
151 break;
152 }
153
154 tcf = rcu_dereference_bh(cl->filter_list);
155 }
156
157 return cl;
158 }
159
160 static int sch_bpf_enqueue(struct sk_buff *skb, struct Qdisc *sch,
161 struct sk_buff **to_free)
162 {
163 struct sch_bpf_qdisc *q = qdisc_priv(sch);
164 unsigned int len = qdisc_pkt_len(skb);
165 struct sch_bpf_ctx ctx = {};
166 struct sch_bpf_class *cl;
167 int res;
168
169 cl = sch_bpf_classify(skb, sch, &res);
170 if (!cl) {
171 struct bpf_prog *enqueue;
172
173 enqueue = rcu_dereference(q->enqueue_prog);
174 bpf_compute_data_pointers(skb);
175
176 ctx.skb = skb;
177 ctx.nr_classes = q->clhash.hashelems;
178 ctx.nr_packets = sch->q.qlen;
179 res = BPF_PROG_RUN(enqueue, &ctx);
180 cl = sch_bpf_find(sch, ctx.classid);
181 if (!cl) {
182 if (res & __NET_XMIT_BYPASS)
183 qdisc_qstats_drop(sch);
184 __qdisc_drop(skb, to_free);
185 return res;
186 }
187 }
188
189 if (cl->qdisc) {
> 190 if ((ret = qdisc_enqueue(skb, cl->qdisc,
191 to_free)) != NET_XMIT_SUCCESS) {
192 if (net_xmit_drop_count(ret)) {
193 qdisc_qstats_drop(sch);
194 cl->drops++;
195 }
196 return ret;
197 }
198 } else {
199 sch_bpf_skb_cb(skb)->rank = ctx.rank;
> 200 pq_push(&cl->pq, &skb->rbnode);
201 }
202
203 sch->qstats.backlog += len;
204 sch->q.qlen++;
205 return res;
206 }
207
208 static struct sk_buff *sch_bpf_dequeue(struct Qdisc *sch)
209 {
210 struct sch_bpf_qdisc *q = qdisc_priv(sch);
211 struct sch_bpf_ctx ctx = {};
212 struct sk_buff *ret = NULL;
213 struct bpf_prog *dequeue;
214 struct sch_bpf_class *cl;
215 struct pq_node *flow;
216 int res;
217
218 dequeue = rcu_dereference(q->dequeue_prog);
> 219 bpf_compute_data_pointers(skb);
220
221 flow = pq_pop(&q->flows);
222 if (!flow)
223 return NULL;
224
225 cl = container_of(flow, struct sch_bpf_class, node);
226 if (cl->qdisc) {
227 ctx.skb = cl->qdisc->dequeue(cl->qdisc);
228 ctx.classid = cl->common.classid;
229 } else {
> 230 ctx.skb = pq_pop(&cl->pq);
231 ctx.classid = cl->rank;
232 }
233 ctx.nr_classes = q->clhash.hashelems;
234 ctx.nr_packets = sch->q.qlen;
235 res = BPF_PROG_RUN(dequeue, &ctx);
> 236 if (res == SCH_BPF_RET_OK) {
237 ret = ctx.skb;
> 238 } else if (res == SCH_BPF_RET_REQUEUE) {
239 sch_bpf_skb_cb(ctx.skb)->rank = ctx.rank;
240 pq_push(&cl->pq, &ctx.skb->rbnode);
241 ret = NULL;
242 } else {
243 kfree_skb(ctx.skb);
244 ret = NULL;
245 }
246
247 cl->rank = ctx.classid;
248 if (pq_top(&cl->pq)) {
249 pq_push(&q->flows, &cl->node);
250 }
251 return ret;
252 }
253
254 static struct Qdisc *sch_bpf_leaf(struct Qdisc *sch, unsigned long arg)
255 {
256 struct sch_bpf_class *cl = (struct sch_bpf_class *)arg;
257
258 return cl->qdisc;
259 }
260
261 static int sch_bpf_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
262 struct Qdisc **old, struct netlink_ext_ack *extack)
263 {
264 struct sch_bpf_class *cl = (struct sch_bpf_class *)arg;
265
266 if (new)
267 *old = qdisc_replace(sch, new, &cl->qdisc);
268 return 0;
269 }
270
271 static unsigned long sch_bpf_bind(struct Qdisc *sch, unsigned long parent,
272 u32 classid)
273 {
274 return 0;
275 }
276
277 static void sch_bpf_unbind(struct Qdisc *q, unsigned long cl)
278 {
279 }
280
281 static unsigned long sch_bpf_search(struct Qdisc *sch, u32 handle)
282 {
> 283 return (unsigned long)sch_bpf_find(handle, sch);
284 }
285
286 static struct tcf_block *sch_bpf_tcf_block(struct Qdisc *sch, unsigned long cl,
287 struct netlink_ext_ack *extack)
288 {
289 struct sch_bpf_qdisc *q = qdisc_priv(sch);
290
291 if (cl)
292 return NULL;
293 return q->block;
294 }
295
296 static const struct nla_policy sch_bpf_policy[TCA_SCH_BPF_MAX + 1] = {
> 297 [TCA_SCH_BPF_ENQUEUE_PROG_FD] = { .type = NLA_U32 },
298 [TCA_SCH_BPF_ENQUEUE_PROG_NAME] = { .type = NLA_NUL_STRING,
299 .len = ACT_BPF_NAME_LEN },
> 300 [TCA_SCH_BPF_DEQUEUE_PROG_FD] = { .type = NLA_U32 },
301 [TCA_SCH_BPF_DEQUEUE_PROG_NAME] = { .type = NLA_NUL_STRING,
302 .len = ACT_BPF_NAME_LEN },
303 };
304
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 64522 bytes --]
next reply other threads:[~2021-08-12 0:09 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-12 0:09 kernel test robot [this message]
2021-08-12 0:09 ` [congwang:sch_bpf 2/2] net/sched/sch_bpf.c:103:39: error: 'TCA_SCH_BPF_ENQUEUE_PROG_TAG' undeclared; did you mean 'TCA_SCH_BPF_ENQUEUE_PROG_ID'? kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202108120857.PCVoXpds-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.