Message ID | 20221219122020.3778161-7-i.maximets@ovn.org |
---|---|
State | Superseded |
Headers | show |
Series | AF_XDP build fixes and enhancements. | expand |
Context | Check | Description |
---|---|---|
ovsrobot/apply-robot | success | apply and check: success |
ovsrobot/github-robot-_Build_and_Test | success | github build: passed |
ovsrobot/intel-ovs-compilation | success | test: success |
On 19 Dec 2022, at 13:20, Ilya Maximets wrote: > With this change we will try to detect all the netdev-afxdp > dependencies and enable AF_XDP support by default if they are > present at the build time. > > Configuration script behaves in a following way: > > - ./configure --enable-afxdp > > Will check for AF_XDP dependencies and fail if they are > not available. > > - ./configure --disable-afxdp > > Disables checking for AF_XDP. Build will not support > AF_XDP even if all dependencies are installed. > > - Just ./configure or ./configure --enable-afxdp=auto > > Will check for AF_XDP dependencies. Will print a warning > if they are not available, but will continue without AF_XDP > support. If dependencies are available in a system, this > option is equal to --enable-afxdp, except that AF_XDP will > not be enabled for libbpf >= 0.7 if libxdp is not available, > to avoid deprecation warnings during the build. > > '--disable-afxdp' added to the debian and fedora package builds > to keep predictable behavior. > > Signed-off-by: Ilya Maximets <i.maximets@ovn.org> I still don’t like building AF_XDP automatically, but looks like I’m the only one ;) > --- > Documentation/intro/install/afxdp.rst | 6 +- > NEWS | 3 + > acinclude.m4 | 89 ++++++++++++++++++--------- > debian/rules | 25 +++++--- > rhel/openvswitch-fedora.spec.in | 2 + > 5 files changed, 85 insertions(+), 40 deletions(-) > > diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst > index a4f0b87fe..51c24bf5b 100644 > --- a/Documentation/intro/install/afxdp.rst > +++ b/Documentation/intro/install/afxdp.rst > @@ -30,8 +30,7 @@ This document describes how to build and install Open vSwitch using > AF_XDP netdev. > > .. warning:: > - The AF_XDP support of Open vSwitch is considered 'experimental', > - and it is not compiled in by default. > + The AF_XDP support of Open vSwitch is considered 'experimental'. > > > Introduction > @@ -137,6 +136,9 @@ bootstrap/configure the package:: > > ./boot.sh && ./configure --enable-afxdp > > +``--enable-afxdp`` here is optional, but it will ensure that all dependencies > +are available at the build time. > + > Finally, build and install OVS:: > > make && make install > diff --git a/NEWS b/NEWS > index 5d39c7d27..d2bbae591 100644 > --- a/NEWS > +++ b/NEWS > @@ -2,6 +2,9 @@ Post-v3.0.0 > -------------------- > - AF_XDP: > * Added support for building with libxdp and libbpf >= 0.7. > + * Support for AF_XDP is now enabled by default if all dependencies are > + available at the build time. Use --disable-afxdp to disable. > + Use --enable-afxdp to fail the build if dependencies are not present. > - ovs-appctl: > * "ovs-appctl ofproto/trace" command can now display port names with the > "--names" option. > diff --git a/acinclude.m4 b/acinclude.m4 > index aed01c967..8411c0e6c 100644 > --- a/acinclude.m4 > +++ b/acinclude.m4 > @@ -253,39 +253,72 @@ dnl OVS_CHECK_LINUX_AF_XDP > dnl > dnl Check both Linux kernel AF_XDP and libbpf/libxdp support > AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [ > - AC_ARG_ENABLE([afxdp], > - [AS_HELP_STRING([--enable-afxdp], [Enable AF-XDP support])], > - [], [enable_afxdp=no]) > + AC_ARG_ENABLE( > + [afxdp], > + [AS_HELP_STRING([--disable-afxdp], [Disable AF-XDP support])], > + [case "${enableval}" in > + (yes | no | auto) ;; > + (*) AC_MSG_ERROR([bad value ${enableval} for --enable-afxdp]) ;; > + esac], > + [enable_afxdp=auto]) > + > AC_MSG_CHECKING([whether AF_XDP is enabled]) > - if test "$enable_afxdp" != yes; then > + if test "$enable_afxdp" == no; then > AC_MSG_RESULT([no]) > AF_XDP_ENABLE=false > else > - AC_MSG_RESULT([yes]) > + AC_MSG_RESULT([$enable_afxdp]) > AF_XDP_ENABLE=true > - > - AC_CHECK_HEADER([bpf/libbpf.h], [], > - [AC_MSG_ERROR([unable to find bpf/libbpf.h for AF_XDP support])]) > - > - AC_CHECK_HEADER([linux/if_xdp.h], [], > - [AC_MSG_ERROR([unable to find linux/if_xdp.h for AF_XDP support])]) > - > - AC_CHECK_HEADER([xdp/xsk.h], > - AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), > - AC_CHECK_HEADER([bpf/xsk.h], [], > - [AC_MSG_ERROR([unable to find xsk.h for AF_XDP support])])) > - > - AC_CHECK_FUNCS([pthread_spin_lock], [], > - [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])]) > - > - OVS_FIND_DEPENDENCY([numa_alloc_onnode], [numa], [libnuma]) > - OVS_FIND_DEPENDENCY([libbpf_strerror], [bpf], [libbpf]) > - AC_SEARCH_LIBS([libxdp_strerror], [xdp]) > - > - AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) > - > - AC_DEFINE([HAVE_AF_XDP], [1], > - [Define to 1 if AF_XDP support is available and enabled.]) > + failed_dep=none > + dnl Saving libs to restore in case we will end up not building with AF_XDP. > + save_LIBS=$LIBS > + > + AC_CHECK_HEADER([bpf/libbpf.h], [], [failed_dep="bpf/libbpf.h"]) > + > + if test "$failed_dep" = none; then > + AC_CHECK_HEADER([linux/if_xdp.h], [], [failed_dep="linux/if_xdp.h"]) > + fi > + > + if test "$failed_dep" = none; then > + AC_CHECK_HEADER([xdp/xsk.h], > + AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), > + AC_CHECK_HEADER([bpf/xsk.h], [], [failed_dep="xsk.h"])) > + fi > + > + if test "$failed_dep" = none; then > + AC_CHECK_FUNCS([pthread_spin_lock], [], [failed_dep="pthread_spin_lock"]) > + fi > + > + if test "$failed_dep" = none; then > + AC_SEARCH_LIBS([numa_alloc_onnode], [numa], [], [failed_dep="libnuma"]) > + fi > + if test "$failed_dep" = none; then > + AC_SEARCH_LIBS([libbpf_strerror], [bpf], [], [failed_dep="libbpf"]) > + fi > + > + if test "$failed_dep" = none; then > + AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) > + AC_SEARCH_LIBS([libxdp_strerror], [xdp], [], > + [dnl Fail the auto discovery if we have libbpf >= 0.7 but not libxdp > + dnl to avoid deprecation warnings during the build. > + if test "$enable_afxdp" = auto -a "x$ac_cv_func_bpf_xdp_detach" = xyes; then > + failed_dep="libxdp" > + fi > + ]) > + fi > + > + if test "$failed_dep" = none; then > + AC_DEFINE([HAVE_AF_XDP], [1], > + [Define to 1 if AF_XDP support is available and enabled.]) > + elif test "$enable_afxdp" = yes; then > + AC_MSG_ERROR([Missing $failed_dep dependency for AF_XDP support]) > + else > + AC_MSG_WARN(m4_normalize( > + [Cannot find $failed_dep, netdev-afxdp will not be supported > + (you may use --disable-afxdp to suppress this warning).])) > + AF_XDP_ENABLE=false > + LIBS=$save_LIBS > + fi > fi > AM_CONDITIONAL([HAVE_AF_XDP], test "$AF_XDP_ENABLE" = true) > ]) > diff --git a/debian/rules b/debian/rules > index 971bc1775..ddbd4dc5c 100755 > --- a/debian/rules > +++ b/debian/rules > @@ -23,21 +23,26 @@ override_dh_auto_configure: > test -d _debian || mkdir _debian > cd _debian && ( \ > test -e Makefile || \ > - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ > - --sysconfdir=/etc \ > - $(DATAPATH_CONFIGURE_OPTS) \ > - $(EXTRA_CONFIGURE_OPTS) \ > - ) > + ../configure --prefix=/usr --localstatedir=/var \ > + --enable-ssl \ > + --disable-afxdp \ > + --sysconfdir=/etc \ > + $(DATAPATH_CONFIGURE_OPTS) \ > + $(EXTRA_CONFIGURE_OPTS) \ > + ) > ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) > ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) > test -d _dpdk || mkdir _dpdk > cd _dpdk && ( \ > test -e Makefile || \ > - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ > - --with-dpdk=shared --sysconfdir=/etc \ > - $(DATAPATH_CONFIGURE_OPTS) \ > - $(EXTRA_CONFIGURE_OPTS) \ > - ) > + ../configure --prefix=/usr --localstatedir=/var \ > + --enable-ssl \ > + --disable-afxdp \ > + --with-dpdk=shared \ > + --sysconfdir=/etc \ > + $(DATAPATH_CONFIGURE_OPTS) \ > + $(EXTRA_CONFIGURE_OPTS) \ > + ) > endif > endif > > diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in > index 6564d5252..fbfcdcf63 100644 > --- a/rhel/openvswitch-fedora.spec.in > +++ b/rhel/openvswitch-fedora.spec.in > @@ -171,6 +171,8 @@ This package provides IPsec tunneling support for OVS tunnels. > %endif > %if %{with afxdp} > --enable-afxdp \ > +%else > + --disable-afxdp \ > %endif Now that we build with libxdp, should we also not add some requirements for packages to be installed? I do not think we link statically to libxdp/libbpf? > --enable-ssl \ > --disable-static \ > -- > 2.38.1
On 12/20/22 14:19, Eelco Chaudron wrote: > > > On 19 Dec 2022, at 13:20, Ilya Maximets wrote: > >> With this change we will try to detect all the netdev-afxdp >> dependencies and enable AF_XDP support by default if they are >> present at the build time. >> >> Configuration script behaves in a following way: >> >> - ./configure --enable-afxdp >> >> Will check for AF_XDP dependencies and fail if they are >> not available. >> >> - ./configure --disable-afxdp >> >> Disables checking for AF_XDP. Build will not support >> AF_XDP even if all dependencies are installed. >> >> - Just ./configure or ./configure --enable-afxdp=auto >> >> Will check for AF_XDP dependencies. Will print a warning >> if they are not available, but will continue without AF_XDP >> support. If dependencies are available in a system, this >> option is equal to --enable-afxdp, except that AF_XDP will >> not be enabled for libbpf >= 0.7 if libxdp is not available, >> to avoid deprecation warnings during the build. >> >> '--disable-afxdp' added to the debian and fedora package builds >> to keep predictable behavior. >> >> Signed-off-by: Ilya Maximets <i.maximets@ovn.org> > > I still don’t like building AF_XDP automatically, but looks like I’m the only one ;) > >> --- >> Documentation/intro/install/afxdp.rst | 6 +- >> NEWS | 3 + >> acinclude.m4 | 89 ++++++++++++++++++--------- >> debian/rules | 25 +++++--- >> rhel/openvswitch-fedora.spec.in | 2 + >> 5 files changed, 85 insertions(+), 40 deletions(-) >> >> diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst >> index a4f0b87fe..51c24bf5b 100644 >> --- a/Documentation/intro/install/afxdp.rst >> +++ b/Documentation/intro/install/afxdp.rst >> @@ -30,8 +30,7 @@ This document describes how to build and install Open vSwitch using >> AF_XDP netdev. >> >> .. warning:: >> - The AF_XDP support of Open vSwitch is considered 'experimental', >> - and it is not compiled in by default. >> + The AF_XDP support of Open vSwitch is considered 'experimental'. >> >> >> Introduction >> @@ -137,6 +136,9 @@ bootstrap/configure the package:: >> >> ./boot.sh && ./configure --enable-afxdp >> >> +``--enable-afxdp`` here is optional, but it will ensure that all dependencies >> +are available at the build time. >> + >> Finally, build and install OVS:: >> >> make && make install >> diff --git a/NEWS b/NEWS >> index 5d39c7d27..d2bbae591 100644 >> --- a/NEWS >> +++ b/NEWS >> @@ -2,6 +2,9 @@ Post-v3.0.0 >> -------------------- >> - AF_XDP: >> * Added support for building with libxdp and libbpf >= 0.7. >> + * Support for AF_XDP is now enabled by default if all dependencies are >> + available at the build time. Use --disable-afxdp to disable. >> + Use --enable-afxdp to fail the build if dependencies are not present. >> - ovs-appctl: >> * "ovs-appctl ofproto/trace" command can now display port names with the >> "--names" option. >> diff --git a/acinclude.m4 b/acinclude.m4 >> index aed01c967..8411c0e6c 100644 >> --- a/acinclude.m4 >> +++ b/acinclude.m4 >> @@ -253,39 +253,72 @@ dnl OVS_CHECK_LINUX_AF_XDP >> dnl >> dnl Check both Linux kernel AF_XDP and libbpf/libxdp support >> AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [ >> - AC_ARG_ENABLE([afxdp], >> - [AS_HELP_STRING([--enable-afxdp], [Enable AF-XDP support])], >> - [], [enable_afxdp=no]) >> + AC_ARG_ENABLE( >> + [afxdp], >> + [AS_HELP_STRING([--disable-afxdp], [Disable AF-XDP support])], >> + [case "${enableval}" in >> + (yes | no | auto) ;; >> + (*) AC_MSG_ERROR([bad value ${enableval} for --enable-afxdp]) ;; >> + esac], >> + [enable_afxdp=auto]) >> + >> AC_MSG_CHECKING([whether AF_XDP is enabled]) >> - if test "$enable_afxdp" != yes; then >> + if test "$enable_afxdp" == no; then >> AC_MSG_RESULT([no]) >> AF_XDP_ENABLE=false >> else >> - AC_MSG_RESULT([yes]) >> + AC_MSG_RESULT([$enable_afxdp]) >> AF_XDP_ENABLE=true >> - >> - AC_CHECK_HEADER([bpf/libbpf.h], [], >> - [AC_MSG_ERROR([unable to find bpf/libbpf.h for AF_XDP support])]) >> - >> - AC_CHECK_HEADER([linux/if_xdp.h], [], >> - [AC_MSG_ERROR([unable to find linux/if_xdp.h for AF_XDP support])]) >> - >> - AC_CHECK_HEADER([xdp/xsk.h], >> - AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), >> - AC_CHECK_HEADER([bpf/xsk.h], [], >> - [AC_MSG_ERROR([unable to find xsk.h for AF_XDP support])])) >> - >> - AC_CHECK_FUNCS([pthread_spin_lock], [], >> - [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])]) >> - >> - OVS_FIND_DEPENDENCY([numa_alloc_onnode], [numa], [libnuma]) >> - OVS_FIND_DEPENDENCY([libbpf_strerror], [bpf], [libbpf]) >> - AC_SEARCH_LIBS([libxdp_strerror], [xdp]) >> - >> - AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) >> - >> - AC_DEFINE([HAVE_AF_XDP], [1], >> - [Define to 1 if AF_XDP support is available and enabled.]) >> + failed_dep=none >> + dnl Saving libs to restore in case we will end up not building with AF_XDP. >> + save_LIBS=$LIBS >> + >> + AC_CHECK_HEADER([bpf/libbpf.h], [], [failed_dep="bpf/libbpf.h"]) >> + >> + if test "$failed_dep" = none; then >> + AC_CHECK_HEADER([linux/if_xdp.h], [], [failed_dep="linux/if_xdp.h"]) >> + fi >> + >> + if test "$failed_dep" = none; then >> + AC_CHECK_HEADER([xdp/xsk.h], >> + AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), >> + AC_CHECK_HEADER([bpf/xsk.h], [], [failed_dep="xsk.h"])) >> + fi >> + >> + if test "$failed_dep" = none; then >> + AC_CHECK_FUNCS([pthread_spin_lock], [], [failed_dep="pthread_spin_lock"]) >> + fi >> + >> + if test "$failed_dep" = none; then >> + AC_SEARCH_LIBS([numa_alloc_onnode], [numa], [], [failed_dep="libnuma"]) >> + fi >> + if test "$failed_dep" = none; then >> + AC_SEARCH_LIBS([libbpf_strerror], [bpf], [], [failed_dep="libbpf"]) >> + fi >> + >> + if test "$failed_dep" = none; then >> + AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) >> + AC_SEARCH_LIBS([libxdp_strerror], [xdp], [], >> + [dnl Fail the auto discovery if we have libbpf >= 0.7 but not libxdp >> + dnl to avoid deprecation warnings during the build. >> + if test "$enable_afxdp" = auto -a "x$ac_cv_func_bpf_xdp_detach" = xyes; then >> + failed_dep="libxdp" >> + fi >> + ]) >> + fi >> + >> + if test "$failed_dep" = none; then >> + AC_DEFINE([HAVE_AF_XDP], [1], >> + [Define to 1 if AF_XDP support is available and enabled.]) >> + elif test "$enable_afxdp" = yes; then >> + AC_MSG_ERROR([Missing $failed_dep dependency for AF_XDP support]) >> + else >> + AC_MSG_WARN(m4_normalize( >> + [Cannot find $failed_dep, netdev-afxdp will not be supported >> + (you may use --disable-afxdp to suppress this warning).])) >> + AF_XDP_ENABLE=false >> + LIBS=$save_LIBS >> + fi >> fi >> AM_CONDITIONAL([HAVE_AF_XDP], test "$AF_XDP_ENABLE" = true) >> ]) >> diff --git a/debian/rules b/debian/rules >> index 971bc1775..ddbd4dc5c 100755 >> --- a/debian/rules >> +++ b/debian/rules >> @@ -23,21 +23,26 @@ override_dh_auto_configure: >> test -d _debian || mkdir _debian >> cd _debian && ( \ >> test -e Makefile || \ >> - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ >> - --sysconfdir=/etc \ >> - $(DATAPATH_CONFIGURE_OPTS) \ >> - $(EXTRA_CONFIGURE_OPTS) \ >> - ) >> + ../configure --prefix=/usr --localstatedir=/var \ >> + --enable-ssl \ >> + --disable-afxdp \ >> + --sysconfdir=/etc \ >> + $(DATAPATH_CONFIGURE_OPTS) \ >> + $(EXTRA_CONFIGURE_OPTS) \ >> + ) >> ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) >> ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) >> test -d _dpdk || mkdir _dpdk >> cd _dpdk && ( \ >> test -e Makefile || \ >> - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ >> - --with-dpdk=shared --sysconfdir=/etc \ >> - $(DATAPATH_CONFIGURE_OPTS) \ >> - $(EXTRA_CONFIGURE_OPTS) \ >> - ) >> + ../configure --prefix=/usr --localstatedir=/var \ >> + --enable-ssl \ >> + --disable-afxdp \ >> + --with-dpdk=shared \ >> + --sysconfdir=/etc \ >> + $(DATAPATH_CONFIGURE_OPTS) \ >> + $(EXTRA_CONFIGURE_OPTS) \ >> + ) >> endif >> endif >> >> diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in >> index 6564d5252..fbfcdcf63 100644 >> --- a/rhel/openvswitch-fedora.spec.in >> +++ b/rhel/openvswitch-fedora.spec.in >> @@ -171,6 +171,8 @@ This package provides IPsec tunneling support for OVS tunnels. >> %endif >> %if %{with afxdp} >> --enable-afxdp \ >> +%else >> + --disable-afxdp \ >> %endif > > Now that we build with libxdp, should we also not add some requirements for packages to be installed? > > I do not think we link statically to libxdp/libbpf? I thought so as well, but it looks like rpm is smart to figure out on its own which libraries the binary is linked with. So, it adds all required runtime dependencies automatically. Kind of magic. Otherwise, we already have a lot of missing runtime dependencies in this spec. > >> --enable-ssl \ >> --disable-static \ >> -- >> 2.38.1 >
On 20 Dec 2022, at 14:24, Ilya Maximets wrote: > On 12/20/22 14:19, Eelco Chaudron wrote: >> >> >> On 19 Dec 2022, at 13:20, Ilya Maximets wrote: >> >>> With this change we will try to detect all the netdev-afxdp >>> dependencies and enable AF_XDP support by default if they are >>> present at the build time. >>> >>> Configuration script behaves in a following way: >>> >>> - ./configure --enable-afxdp >>> >>> Will check for AF_XDP dependencies and fail if they are >>> not available. >>> >>> - ./configure --disable-afxdp >>> >>> Disables checking for AF_XDP. Build will not support >>> AF_XDP even if all dependencies are installed. >>> >>> - Just ./configure or ./configure --enable-afxdp=auto >>> >>> Will check for AF_XDP dependencies. Will print a warning >>> if they are not available, but will continue without AF_XDP >>> support. If dependencies are available in a system, this >>> option is equal to --enable-afxdp, except that AF_XDP will >>> not be enabled for libbpf >= 0.7 if libxdp is not available, >>> to avoid deprecation warnings during the build. >>> >>> '--disable-afxdp' added to the debian and fedora package builds >>> to keep predictable behavior. >>> >>> Signed-off-by: Ilya Maximets <i.maximets@ovn.org> >> >> I still don’t like building AF_XDP automatically, but looks like I’m the only one ;) >> >>> --- >>> Documentation/intro/install/afxdp.rst | 6 +- >>> NEWS | 3 + >>> acinclude.m4 | 89 ++++++++++++++++++--------- >>> debian/rules | 25 +++++--- >>> rhel/openvswitch-fedora.spec.in | 2 + >>> 5 files changed, 85 insertions(+), 40 deletions(-) >>> >>> diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst >>> index a4f0b87fe..51c24bf5b 100644 >>> --- a/Documentation/intro/install/afxdp.rst >>> +++ b/Documentation/intro/install/afxdp.rst >>> @@ -30,8 +30,7 @@ This document describes how to build and install Open vSwitch using >>> AF_XDP netdev. >>> >>> .. warning:: >>> - The AF_XDP support of Open vSwitch is considered 'experimental', >>> - and it is not compiled in by default. >>> + The AF_XDP support of Open vSwitch is considered 'experimental'. >>> >>> >>> Introduction >>> @@ -137,6 +136,9 @@ bootstrap/configure the package:: >>> >>> ./boot.sh && ./configure --enable-afxdp >>> >>> +``--enable-afxdp`` here is optional, but it will ensure that all dependencies >>> +are available at the build time. >>> + >>> Finally, build and install OVS:: >>> >>> make && make install >>> diff --git a/NEWS b/NEWS >>> index 5d39c7d27..d2bbae591 100644 >>> --- a/NEWS >>> +++ b/NEWS >>> @@ -2,6 +2,9 @@ Post-v3.0.0 >>> -------------------- >>> - AF_XDP: >>> * Added support for building with libxdp and libbpf >= 0.7. >>> + * Support for AF_XDP is now enabled by default if all dependencies are >>> + available at the build time. Use --disable-afxdp to disable. >>> + Use --enable-afxdp to fail the build if dependencies are not present. >>> - ovs-appctl: >>> * "ovs-appctl ofproto/trace" command can now display port names with the >>> "--names" option. >>> diff --git a/acinclude.m4 b/acinclude.m4 >>> index aed01c967..8411c0e6c 100644 >>> --- a/acinclude.m4 >>> +++ b/acinclude.m4 >>> @@ -253,39 +253,72 @@ dnl OVS_CHECK_LINUX_AF_XDP >>> dnl >>> dnl Check both Linux kernel AF_XDP and libbpf/libxdp support >>> AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [ >>> - AC_ARG_ENABLE([afxdp], >>> - [AS_HELP_STRING([--enable-afxdp], [Enable AF-XDP support])], >>> - [], [enable_afxdp=no]) >>> + AC_ARG_ENABLE( >>> + [afxdp], >>> + [AS_HELP_STRING([--disable-afxdp], [Disable AF-XDP support])], >>> + [case "${enableval}" in >>> + (yes | no | auto) ;; >>> + (*) AC_MSG_ERROR([bad value ${enableval} for --enable-afxdp]) ;; >>> + esac], >>> + [enable_afxdp=auto]) >>> + >>> AC_MSG_CHECKING([whether AF_XDP is enabled]) >>> - if test "$enable_afxdp" != yes; then >>> + if test "$enable_afxdp" == no; then >>> AC_MSG_RESULT([no]) >>> AF_XDP_ENABLE=false >>> else >>> - AC_MSG_RESULT([yes]) >>> + AC_MSG_RESULT([$enable_afxdp]) >>> AF_XDP_ENABLE=true >>> - >>> - AC_CHECK_HEADER([bpf/libbpf.h], [], >>> - [AC_MSG_ERROR([unable to find bpf/libbpf.h for AF_XDP support])]) >>> - >>> - AC_CHECK_HEADER([linux/if_xdp.h], [], >>> - [AC_MSG_ERROR([unable to find linux/if_xdp.h for AF_XDP support])]) >>> - >>> - AC_CHECK_HEADER([xdp/xsk.h], >>> - AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), >>> - AC_CHECK_HEADER([bpf/xsk.h], [], >>> - [AC_MSG_ERROR([unable to find xsk.h for AF_XDP support])])) >>> - >>> - AC_CHECK_FUNCS([pthread_spin_lock], [], >>> - [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])]) >>> - >>> - OVS_FIND_DEPENDENCY([numa_alloc_onnode], [numa], [libnuma]) >>> - OVS_FIND_DEPENDENCY([libbpf_strerror], [bpf], [libbpf]) >>> - AC_SEARCH_LIBS([libxdp_strerror], [xdp]) >>> - >>> - AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) >>> - >>> - AC_DEFINE([HAVE_AF_XDP], [1], >>> - [Define to 1 if AF_XDP support is available and enabled.]) >>> + failed_dep=none >>> + dnl Saving libs to restore in case we will end up not building with AF_XDP. >>> + save_LIBS=$LIBS >>> + >>> + AC_CHECK_HEADER([bpf/libbpf.h], [], [failed_dep="bpf/libbpf.h"]) >>> + >>> + if test "$failed_dep" = none; then >>> + AC_CHECK_HEADER([linux/if_xdp.h], [], [failed_dep="linux/if_xdp.h"]) >>> + fi >>> + >>> + if test "$failed_dep" = none; then >>> + AC_CHECK_HEADER([xdp/xsk.h], >>> + AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), >>> + AC_CHECK_HEADER([bpf/xsk.h], [], [failed_dep="xsk.h"])) >>> + fi >>> + >>> + if test "$failed_dep" = none; then >>> + AC_CHECK_FUNCS([pthread_spin_lock], [], [failed_dep="pthread_spin_lock"]) >>> + fi >>> + >>> + if test "$failed_dep" = none; then >>> + AC_SEARCH_LIBS([numa_alloc_onnode], [numa], [], [failed_dep="libnuma"]) >>> + fi >>> + if test "$failed_dep" = none; then >>> + AC_SEARCH_LIBS([libbpf_strerror], [bpf], [], [failed_dep="libbpf"]) >>> + fi >>> + >>> + if test "$failed_dep" = none; then >>> + AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) >>> + AC_SEARCH_LIBS([libxdp_strerror], [xdp], [], >>> + [dnl Fail the auto discovery if we have libbpf >= 0.7 but not libxdp >>> + dnl to avoid deprecation warnings during the build. >>> + if test "$enable_afxdp" = auto -a "x$ac_cv_func_bpf_xdp_detach" = xyes; then >>> + failed_dep="libxdp" >>> + fi >>> + ]) >>> + fi >>> + >>> + if test "$failed_dep" = none; then >>> + AC_DEFINE([HAVE_AF_XDP], [1], >>> + [Define to 1 if AF_XDP support is available and enabled.]) >>> + elif test "$enable_afxdp" = yes; then >>> + AC_MSG_ERROR([Missing $failed_dep dependency for AF_XDP support]) >>> + else >>> + AC_MSG_WARN(m4_normalize( >>> + [Cannot find $failed_dep, netdev-afxdp will not be supported >>> + (you may use --disable-afxdp to suppress this warning).])) >>> + AF_XDP_ENABLE=false >>> + LIBS=$save_LIBS >>> + fi >>> fi >>> AM_CONDITIONAL([HAVE_AF_XDP], test "$AF_XDP_ENABLE" = true) >>> ]) >>> diff --git a/debian/rules b/debian/rules >>> index 971bc1775..ddbd4dc5c 100755 >>> --- a/debian/rules >>> +++ b/debian/rules >>> @@ -23,21 +23,26 @@ override_dh_auto_configure: >>> test -d _debian || mkdir _debian >>> cd _debian && ( \ >>> test -e Makefile || \ >>> - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ >>> - --sysconfdir=/etc \ >>> - $(DATAPATH_CONFIGURE_OPTS) \ >>> - $(EXTRA_CONFIGURE_OPTS) \ >>> - ) >>> + ../configure --prefix=/usr --localstatedir=/var \ >>> + --enable-ssl \ >>> + --disable-afxdp \ >>> + --sysconfdir=/etc \ >>> + $(DATAPATH_CONFIGURE_OPTS) \ >>> + $(EXTRA_CONFIGURE_OPTS) \ >>> + ) >>> ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) >>> ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) >>> test -d _dpdk || mkdir _dpdk >>> cd _dpdk && ( \ >>> test -e Makefile || \ >>> - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ >>> - --with-dpdk=shared --sysconfdir=/etc \ >>> - $(DATAPATH_CONFIGURE_OPTS) \ >>> - $(EXTRA_CONFIGURE_OPTS) \ >>> - ) >>> + ../configure --prefix=/usr --localstatedir=/var \ >>> + --enable-ssl \ >>> + --disable-afxdp \ >>> + --with-dpdk=shared \ >>> + --sysconfdir=/etc \ >>> + $(DATAPATH_CONFIGURE_OPTS) \ >>> + $(EXTRA_CONFIGURE_OPTS) \ >>> + ) >>> endif >>> endif >>> >>> diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in >>> index 6564d5252..fbfcdcf63 100644 >>> --- a/rhel/openvswitch-fedora.spec.in >>> +++ b/rhel/openvswitch-fedora.spec.in >>> @@ -171,6 +171,8 @@ This package provides IPsec tunneling support for OVS tunnels. >>> %endif >>> %if %{with afxdp} >>> --enable-afxdp \ >>> +%else >>> + --disable-afxdp \ >>> %endif >> >> Now that we build with libxdp, should we also not add some requirements for packages to be installed? >> >> I do not think we link statically to libxdp/libbpf? > > I thought so as well, but it looks like rpm is smart to figure > out on its own which libraries the binary is linked with. So, > it adds all required runtime dependencies automatically. > Kind of magic. > > Otherwise, we already have a lot of missing runtime dependencies > in this spec. Nice :) Then the series looks good to me… Acked-by: Eelco Chaudron <echaudro@redhat.com> >> >>> --enable-ssl \ >>> --disable-static \ >>> -- >>> 2.38.1 >>
diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst index a4f0b87fe..51c24bf5b 100644 --- a/Documentation/intro/install/afxdp.rst +++ b/Documentation/intro/install/afxdp.rst @@ -30,8 +30,7 @@ This document describes how to build and install Open vSwitch using AF_XDP netdev. .. warning:: - The AF_XDP support of Open vSwitch is considered 'experimental', - and it is not compiled in by default. + The AF_XDP support of Open vSwitch is considered 'experimental'. Introduction @@ -137,6 +136,9 @@ bootstrap/configure the package:: ./boot.sh && ./configure --enable-afxdp +``--enable-afxdp`` here is optional, but it will ensure that all dependencies +are available at the build time. + Finally, build and install OVS:: make && make install diff --git a/NEWS b/NEWS index 5d39c7d27..d2bbae591 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,9 @@ Post-v3.0.0 -------------------- - AF_XDP: * Added support for building with libxdp and libbpf >= 0.7. + * Support for AF_XDP is now enabled by default if all dependencies are + available at the build time. Use --disable-afxdp to disable. + Use --enable-afxdp to fail the build if dependencies are not present. - ovs-appctl: * "ovs-appctl ofproto/trace" command can now display port names with the "--names" option. diff --git a/acinclude.m4 b/acinclude.m4 index aed01c967..8411c0e6c 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -253,39 +253,72 @@ dnl OVS_CHECK_LINUX_AF_XDP dnl dnl Check both Linux kernel AF_XDP and libbpf/libxdp support AC_DEFUN([OVS_CHECK_LINUX_AF_XDP], [ - AC_ARG_ENABLE([afxdp], - [AS_HELP_STRING([--enable-afxdp], [Enable AF-XDP support])], - [], [enable_afxdp=no]) + AC_ARG_ENABLE( + [afxdp], + [AS_HELP_STRING([--disable-afxdp], [Disable AF-XDP support])], + [case "${enableval}" in + (yes | no | auto) ;; + (*) AC_MSG_ERROR([bad value ${enableval} for --enable-afxdp]) ;; + esac], + [enable_afxdp=auto]) + AC_MSG_CHECKING([whether AF_XDP is enabled]) - if test "$enable_afxdp" != yes; then + if test "$enable_afxdp" == no; then AC_MSG_RESULT([no]) AF_XDP_ENABLE=false else - AC_MSG_RESULT([yes]) + AC_MSG_RESULT([$enable_afxdp]) AF_XDP_ENABLE=true - - AC_CHECK_HEADER([bpf/libbpf.h], [], - [AC_MSG_ERROR([unable to find bpf/libbpf.h for AF_XDP support])]) - - AC_CHECK_HEADER([linux/if_xdp.h], [], - [AC_MSG_ERROR([unable to find linux/if_xdp.h for AF_XDP support])]) - - AC_CHECK_HEADER([xdp/xsk.h], - AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), - AC_CHECK_HEADER([bpf/xsk.h], [], - [AC_MSG_ERROR([unable to find xsk.h for AF_XDP support])])) - - AC_CHECK_FUNCS([pthread_spin_lock], [], - [AC_MSG_ERROR([unable to find pthread_spin_lock for AF_XDP support])]) - - OVS_FIND_DEPENDENCY([numa_alloc_onnode], [numa], [libnuma]) - OVS_FIND_DEPENDENCY([libbpf_strerror], [bpf], [libbpf]) - AC_SEARCH_LIBS([libxdp_strerror], [xdp]) - - AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) - - AC_DEFINE([HAVE_AF_XDP], [1], - [Define to 1 if AF_XDP support is available and enabled.]) + failed_dep=none + dnl Saving libs to restore in case we will end up not building with AF_XDP. + save_LIBS=$LIBS + + AC_CHECK_HEADER([bpf/libbpf.h], [], [failed_dep="bpf/libbpf.h"]) + + if test "$failed_dep" = none; then + AC_CHECK_HEADER([linux/if_xdp.h], [], [failed_dep="linux/if_xdp.h"]) + fi + + if test "$failed_dep" = none; then + AC_CHECK_HEADER([xdp/xsk.h], + AC_DEFINE([HAVE_LIBXDP], [1], [xsk.h is supplied with libxdp]), + AC_CHECK_HEADER([bpf/xsk.h], [], [failed_dep="xsk.h"])) + fi + + if test "$failed_dep" = none; then + AC_CHECK_FUNCS([pthread_spin_lock], [], [failed_dep="pthread_spin_lock"]) + fi + + if test "$failed_dep" = none; then + AC_SEARCH_LIBS([numa_alloc_onnode], [numa], [], [failed_dep="libnuma"]) + fi + if test "$failed_dep" = none; then + AC_SEARCH_LIBS([libbpf_strerror], [bpf], [], [failed_dep="libbpf"]) + fi + + if test "$failed_dep" = none; then + AC_CHECK_FUNCS([bpf_xdp_query_id bpf_xdp_detach]) + AC_SEARCH_LIBS([libxdp_strerror], [xdp], [], + [dnl Fail the auto discovery if we have libbpf >= 0.7 but not libxdp + dnl to avoid deprecation warnings during the build. + if test "$enable_afxdp" = auto -a "x$ac_cv_func_bpf_xdp_detach" = xyes; then + failed_dep="libxdp" + fi + ]) + fi + + if test "$failed_dep" = none; then + AC_DEFINE([HAVE_AF_XDP], [1], + [Define to 1 if AF_XDP support is available and enabled.]) + elif test "$enable_afxdp" = yes; then + AC_MSG_ERROR([Missing $failed_dep dependency for AF_XDP support]) + else + AC_MSG_WARN(m4_normalize( + [Cannot find $failed_dep, netdev-afxdp will not be supported + (you may use --disable-afxdp to suppress this warning).])) + AF_XDP_ENABLE=false + LIBS=$save_LIBS + fi fi AM_CONDITIONAL([HAVE_AF_XDP], test "$AF_XDP_ENABLE" = true) ]) diff --git a/debian/rules b/debian/rules index 971bc1775..ddbd4dc5c 100755 --- a/debian/rules +++ b/debian/rules @@ -23,21 +23,26 @@ override_dh_auto_configure: test -d _debian || mkdir _debian cd _debian && ( \ test -e Makefile || \ - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ - --sysconfdir=/etc \ - $(DATAPATH_CONFIGURE_OPTS) \ - $(EXTRA_CONFIGURE_OPTS) \ - ) + ../configure --prefix=/usr --localstatedir=/var \ + --enable-ssl \ + --disable-afxdp \ + --sysconfdir=/etc \ + $(DATAPATH_CONFIGURE_OPTS) \ + $(EXTRA_CONFIGURE_OPTS) \ + ) ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) test -d _dpdk || mkdir _dpdk cd _dpdk && ( \ test -e Makefile || \ - ../configure --prefix=/usr --localstatedir=/var --enable-ssl \ - --with-dpdk=shared --sysconfdir=/etc \ - $(DATAPATH_CONFIGURE_OPTS) \ - $(EXTRA_CONFIGURE_OPTS) \ - ) + ../configure --prefix=/usr --localstatedir=/var \ + --enable-ssl \ + --disable-afxdp \ + --with-dpdk=shared \ + --sysconfdir=/etc \ + $(DATAPATH_CONFIGURE_OPTS) \ + $(EXTRA_CONFIGURE_OPTS) \ + ) endif endif diff --git a/rhel/openvswitch-fedora.spec.in b/rhel/openvswitch-fedora.spec.in index 6564d5252..fbfcdcf63 100644 --- a/rhel/openvswitch-fedora.spec.in +++ b/rhel/openvswitch-fedora.spec.in @@ -171,6 +171,8 @@ This package provides IPsec tunneling support for OVS tunnels. %endif %if %{with afxdp} --enable-afxdp \ +%else + --disable-afxdp \ %endif --enable-ssl \ --disable-static \
With this change we will try to detect all the netdev-afxdp dependencies and enable AF_XDP support by default if they are present at the build time. Configuration script behaves in a following way: - ./configure --enable-afxdp Will check for AF_XDP dependencies and fail if they are not available. - ./configure --disable-afxdp Disables checking for AF_XDP. Build will not support AF_XDP even if all dependencies are installed. - Just ./configure or ./configure --enable-afxdp=auto Will check for AF_XDP dependencies. Will print a warning if they are not available, but will continue without AF_XDP support. If dependencies are available in a system, this option is equal to --enable-afxdp, except that AF_XDP will not be enabled for libbpf >= 0.7 if libxdp is not available, to avoid deprecation warnings during the build. '--disable-afxdp' added to the debian and fedora package builds to keep predictable behavior. Signed-off-by: Ilya Maximets <i.maximets@ovn.org> --- Documentation/intro/install/afxdp.rst | 6 +- NEWS | 3 + acinclude.m4 | 89 ++++++++++++++++++--------- debian/rules | 25 +++++--- rhel/openvswitch-fedora.spec.in | 2 + 5 files changed, 85 insertions(+), 40 deletions(-)