Bug 241047

Summary: iflib: fail to compile kernel on FreeBSD 12.1-BETA2: Fatal error: ifdi_if.h file not found.
Product: Base System Reporter: rashey
Component: kernAssignee: Bugmeister <bugmeister>
Status: Closed Overcome By Events    
Severity: Affects Only Me CC: Z462vasa, clay, imp, kbowling, net, tommyhp2
Priority: --- Keywords: needs-qa, regression
Version: 12.1-RELEASE   
Hardware: amd64   
OS: Any   
Bug Depends on:    
Bug Blocks: 240700    

Description rashey 2019-10-03 22:17:59 UTC
Hi,

Two issues occurred to me on FreeBSD 12.1-BETA2.

The first issue is that an iflib device is statically compiled into GENERIC kernel while GENERIC configuration file for amd64 architecture does not contain the device in /usr/src/sys/amd64/conf/GENERIC, it makes a lot of confusion and causes an error during kernel compiling.

The second issue is that I can not compile kernel with iflib module because of the same error.

# uname -a
FreeBSD test 12.1-BETA2 FreeBSD 12.1-BETA2 r352780 GENERIC  amd64

# cat /usr/src/sys/amd64/conf/ROUTER
include         GENERIC
ident           ROUTER

makeoptions     MODULES_OVERRIDE="pf pflog iflib"

options         PF_DEFAULT_TO_DROP
options         ALTQ
options         ALTQ_HFSC
options         ALTQ_RED
options         ALTQ_RIO
options         ALTQ_NOPCC

# rm -R /usr/obj/* ; cd /usr/src ; make KERNCONF=ROUTER buildkernel
...
cc -target x86_64-unknown-freebsd12.1 --sysroot=/usr/obj/usr/src/amd64.amd64/tmp -B/usr/obj/usr/src/amd64.amd64/tmp/usr/bin -c -O2 -pipe -fno-strict-aliasing  -g -nostdinc  -I. -I/usr/src/sys -I/usr/src/sys/
contrib/ck/include -I/usr/src/sys/contrib/libfdt -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h  -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -MD  -MF.depend.if_em.o -MTif_em.o -fdebug-
prefix-map=./machine=/usr/src/sys/amd64/include -fdebug-prefix-map=./x86=/usr/src/sys/x86/include -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float  -fno-asynchronous-unwind-tables -ffreestanding
-fwrapv -fstack-protector -gdwarf-2 -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ -W
missing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -Wno-error-unused-function -Wno-error-pointer-sign -W
no-error-shift-negative-value -Wno-address-of-packed-member  -mno-aes -mno-avx  -std=iso9899:1999 -Werror  /usr/src/sys/dev/e1000/if_em.c -I/usr/src/sys/dev/e1000
In file included from /usr/src/sys/dev/e1000/if_em.c:30:
/usr/src/sys/dev/e1000/if_em.h:91:10: fatal error: 'ifdi_if.h' file not found
#include "ifdi_if.h"
         ^~~~~~~~~~~
1 error generated.
*** Error code 1

Stop.
make[2]: stopped in /usr/obj/usr/src/amd64.amd64/sys/ROUTER
*** Error code 1

Stop.
make[1]: stopped in /usr/src
*** Error code 1

Stop.
make: stopped in /usr/src
Comment 1 Tommy P 2020-01-14 18:21:44 UTC
I'm also encountering this on 12.0 upgraded to 12.1:

--- if_em.o ---
In file included from /usr/src12.1/sys/dev/e1000/if_em.c:30:
/usr/src12.1/sys/dev/e1000/if_em.h:91:10: fatal error: 'ifdi_if.h' file not found
#include "ifdi_if.h"
         ^~~~~~~~~~~

The 'ifdi_if.h' does not exist within src (r356738) per:
    find /usr/src12.1 -type f -name 'ifdi_if.h'

Yet, specifying 'device iflib' in the kernel config does work while that entry does not exists in GENERIC nor needed in 12.0.
Comment 2 Tommy P 2020-01-14 18:47:22 UTC
I did some digging and found:

12.0 sys/conf/files:
    net/ifdi_if.m                   optional ether pci

12.1 sys/conf/files:
    net/ifdi_if.m                   optional ether pci iflib

I assume that 'device  iflib' is now required going forward within the kernel configuration file?
Comment 3 clay 2020-11-03 19:39:13 UTC
I have the same kernel compile issue for 12.2-RELEASE:
In file included from /usr/src/sys/dev/e1000/if_em.c:30:
/usr/src/sys/dev/e1000/if_em.h:96:10: fatal error: 'ifdi_if.h' file not found
#include "ifdi_if.h"
         ^~~~~~~~~~~
1 error generated.
*** Error code 1

Stop.
make[2]: stopped in /usr/obj/usr/src/amd64.amd64/sys/ROUTER
*** Error code 1
*** Error code 1

It's caused by:
device          em              # Intel PRO/1000 Gigabit Ethernet Family

Fixed by adding the iflib device:
device          iflib
device          em              # Intel PRO/1000 Gigabit Ethernet Family

Kernel compiled now without errors.
Something else that changed and affected me was that:
device          tun
has been deprecated and replaced with:
device          tuntap

This is not a bug, just a change in the kernel requiring a new device because em now has dependency iflib. It's a little annoying that these changes happen but they make sense in order to be able to lighten the kernel if you are not using one of the NIC's. It's documented fine in GENERIC:
# PCI/PCI-X/PCIe Ethernet NICs that use iflib infrastructure
Comment 4 Aleks 2021-01-05 16:59:30 UTC
cc -c -O2 -pipe -fno-strict-aliasing  -g -nostdinc  -I. -I../../.. -I../../../contrib/ck/include -I../../../contrib/libfdt -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h -fno-common  -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -MD  -MF.depend.efirtc.o -MTefirtc.o -fdebug-prefix-map=./machine=/usr/src/sys/amd64/include -fdebug-prefix-map=./x86=/usr/src/sys/x86/include -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float  -fno-asynchronous-unwind-tables -ffreestanding -fwrapv -fstack-protector -gdwarf-2 -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ -Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -Wno-error-unused-function -Wno-error-pointer-sign -Wno-error-shift-negative-value -Wno-address-of-packed-member  -mno-aes -mno-avx  -std=iso9899:1999 -Werror  ../../../dev/efidev/efirtc.c
ctfconvert -L VERSION -g efirtc.o
cc -c -O2 -pipe -fno-strict-aliasing  -g -nostdinc  -I. -I../../.. -I../../../contrib/ck/include -I../../../contrib/libfdt -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h -fno-common  -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -MD  -MF.depend.if_em.o -MTif_em.o -fdebug-prefix-map=./machine=/usr/src/sys/amd64/include -fdebug-prefix-map=./x86=/usr/src/sys/x86/include -mcmodel=kernel -mno-red-zone -mno-mmx -mno-sse -msoft-float  -fno-asynchronous-unwind-tables -ffreestanding -fwrapv -fstack-protector -gdwarf-2 -Wall -Wredundant-decls -Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith -Wcast-qual -Wundef -Wno-pointer-sign -D__printf__=__freebsd_kprintf__ -Wmissing-include-dirs -fdiagnostics-show-option -Wno-unknown-pragmas -Wno-error-tautological-compare -Wno-error-empty-body -Wno-error-parentheses-equality -Wno-error-unused-function -Wno-error-pointer-sign -Wno-error-shift-negative-value -Wno-address-of-packed-member  -mno-aes -mno-avx  -std=iso9899:1999 -Werror  ../../../dev/e1000/if_em.c -I../../../dev/e1000
In file included from ../../../dev/e1000/if_em.c:30:
../../../dev/e1000/if_em.h:91:10: fatal error: 'ifdi_if.h' file not found
#include "ifdi_if.h"
         ^~~~~~~~~~~
1 error generated.
*** Error code 1
Comment 5 Aleks 2021-01-05 17:01:08 UTC
# PCI/PCI-X/PCIe Ethernet NICs that use iflib infrastructure
device<><------>iflib
device<><------>em<----><------><------># Intel PRO/1000 Gigabit Ethernet Family
#device><------>ix<----><------><------># Intel PRO/10GbE PCIE PF Ethernet
#device><------>ixv<---><------><------># Intel PRO/10GbE PCIE VF Ethernet
Comment 6 Aleks 2021-01-05 17:08:58 UTC
FreeBSD 12.1-STABLE r362880 GENERIC  amd64
Comment 7 Kevin Bowling freebsd_committer freebsd_triage 2021-04-19 04:26:30 UTC
It looks like the common theme here is you have custom kernels and need to add 'device iflib'.  Let me see if there is some way to handle this in config(9).
Comment 8 Warner Losh freebsd_committer freebsd_triage 2021-04-19 15:20:30 UTC
I'll take a look at this to see if there's something we can do. There's a lot of ugly things, I'll see which one(s) need to be deployed here.
Comment 9 Warner Losh freebsd_committer freebsd_triage 2021-04-19 22:14:06 UTC
https://reviews.freebsd.org/D29848
https://reviews.freebsd.org/D29849

Contain my notion on how to fix this.
Comment 10 Mark Linimon freebsd_committer freebsd_triage 2024-01-05 06:05:32 UTC
^Triage: FreeBSD 12 is now out of support.