tree: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git master head: 63de273f34b5eeb5ead8440f20516fae9b7b1165 commit: 4f24ed77dec9b067d08f7958a287cbf48665f35e [1423/1425] udp: use indirect call wrappers for GRO socket lookup config: parisc-c3000_defconfig (attached as .config) compiler: hppa-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross git checkout 4f24ed77dec9b067d08f7958a287cbf48665f35e # save the attached .config to linux build tree GCC_VERSION=7.2.0 make.cross ARCH=parisc
All error/warnings (new ones prefixed by >>):
In file included from include/net/inet_common.h:5:0,
from net/ipv4/udp_offload.c:16:
net/ipv4/udp_offload.c: In function 'udp_gro_receive':
>> net/ipv4/udp_offload.c:409:5: error: passing argument 1 of 'lookup' from
>> incompatible pointer type [-Werror=incompatible-pointer-types]
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
>> net/ipv4/udp_offload.c:408:7: note: in expansion of macro
>> 'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:409:5: note: expected 'struct sk_buff *' but argument
is of type 'struct sock * (*)(struct sk_buff *, __be16, __be16) {aka struct
sock * (*)(struct sk_buff *, short unsigned int, short unsigned int)}'
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
>> net/ipv4/udp_offload.c:408:7: note: in expansion of macro
>> 'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
>> net/ipv4/udp_offload.c:409:26: warning: passing argument 2 of 'lookup' makes
>> integer from pointer without a cast [-Wint-conversion]
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
>> net/ipv4/udp_offload.c:408:7: note: in expansion of macro
>> 'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:409:26: note: expected '__be16 {aka short unsigned
int}' but argument is of type 'struct sk_buff *'
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
>> net/ipv4/udp_offload.c:408:7: note: in expansion of macro
>> 'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
>> net/ipv4/udp_offload.c:408:26: error: too many arguments to function 'lookup'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^
include/linux/indirect_call_wrapper.h:32:39: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^
>> net/ipv4/udp_offload.c:408:7: note: in expansion of macro
>> 'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c: In function 'udp_gro_complete':
net/ipv4/udp_offload.c:510:5: error: passing argument 1 of 'lookup' from
incompatible pointer type [-Werror=incompatible-pointer-types]
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
net/ipv4/udp_offload.c:509:7: note: in expansion of macro
'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:510:5: note: expected 'struct sk_buff *' but argument
is of type 'struct sock * (*)(struct sk_buff *, __be16, __be16) {aka struct
sock * (*)(struct sk_buff *, short unsigned int, short unsigned int)}'
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
net/ipv4/udp_offload.c:509:7: note: in expansion of macro
'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:510:26: warning: passing argument 2 of 'lookup' makes
integer from pointer without a cast [-Wint-conversion]
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
net/ipv4/udp_offload.c:509:7: note: in expansion of macro
'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:510:26: note: expected '__be16 {aka short unsigned
int}' but argument is of type 'struct sk_buff *'
udp4_lib_lookup_skb, skb, uh->source, uh->dest);
^
include/linux/indirect_call_wrapper.h:32:41: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^~~~~~~~~~~
net/ipv4/udp_offload.c:509:7: note: in expansion of macro
'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
net/ipv4/udp_offload.c:509:26: error: too many arguments to function 'lookup'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^
include/linux/indirect_call_wrapper.h:32:39: note: in definition of macro
'INDIRECT_CALL_2'
#define INDIRECT_CALL_2(f, name, ...) f(__VA_ARGS__)
^
net/ipv4/udp_offload.c:509:7: note: in expansion of macro
'INDIRECT_CALL_INET'
sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
^~~~~~~~~~~~~~~~~~
cc1: some warnings being treated as errors
vim +/lookup +409 net/ipv4/udp_offload.c
394
395 INDIRECT_CALLABLE_DECLARE(struct sock *udp6_lib_lookup_skb(struct
sk_buff *skb,
396 __be16 sport, __be16
dport));
397 struct sk_buff *udp_gro_receive(struct list_head *head, struct sk_buff
*skb,
398 struct udphdr *uh, udp_lookup_t lookup)
399 {
400 struct sk_buff *pp = NULL;
401 struct sk_buff *p;
402 struct udphdr *uh2;
403 unsigned int off = skb_gro_offset(skb);
404 int flush = 1;
405 struct sock *sk;
406
407 rcu_read_lock();
> 408 sk = INDIRECT_CALL_INET(lookup, udp6_lib_lookup_skb,
> 409 udp4_lib_lookup_skb, skb, uh->source,
> uh->dest);
410 if (!sk)
411 goto out_unlock;
412
413 if (udp_sk(sk)->gro_enabled) {
414 pp = call_gro_receive(udp_gro_receive_segment, head,
skb);
415 rcu_read_unlock();
416 return pp;
417 }
418
419 if (NAPI_GRO_CB(skb)->encap_mark ||
420 (skb->ip_summed != CHECKSUM_PARTIAL &&
421 NAPI_GRO_CB(skb)->csum_cnt == 0 &&
422 !NAPI_GRO_CB(skb)->csum_valid) ||
423 !udp_sk(sk)->gro_receive)
424 goto out_unlock;
425
426 /* mark that this skb passed once through the tunnel gro layer
*/
427 NAPI_GRO_CB(skb)->encap_mark = 1;
428
429 flush = 0;
430
431 list_for_each_entry(p, head, list) {
432 if (!NAPI_GRO_CB(p)->same_flow)
433 continue;
434
435 uh2 = (struct udphdr *)(p->data + off);
436
437 /* Match ports and either checksums are either both zero
438 * or nonzero.
439 */
440 if ((*(u32 *)&uh->source != *(u32 *)&uh2->source) ||
441 (!uh->check ^ !uh2->check)) {
442 NAPI_GRO_CB(p)->same_flow = 0;
443 continue;
444 }
445 }
446
447 skb_gro_pull(skb, sizeof(struct udphdr)); /* pull encapsulating
udp header */
448 skb_gro_postpull_rcsum(skb, uh, sizeof(struct udphdr));
449 pp = call_gro_receive_sk(udp_sk(sk)->gro_receive, sk, head,
skb);
450
451 out_unlock:
452 rcu_read_unlock();
453 skb_gro_flush_final(skb, pp, flush);
454 return pp;
455 }
456 EXPORT_SYMBOL(udp_gro_receive);
457
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
.config.gz
Description: application/gzip
