On 4 Jul 2023, at 11:00, Ales Musil wrote:
> On Mon, Jun 19, 2023 at 11:32 AM Eelco Chaudron <echau...@redhat.com> wrote: > >> This patch includes changes made earlier by David in the >> ovs branch to cache the dpdk builds. >> >> Co-authored-by: David Marchand <david.march...@redhat.com> >> Signed-off-by: David Marchand <david.march...@redhat.com> >> Signed-off-by: Eelco Chaudron <echau...@redhat.com> >> --- >> >> v2: Replaced 'sleep 1' with '' after consulting with Dumitru. >> v3: No changes >> >> Note that I ran the full GitHub ci 20x on the v1 patchset. >> For v2, I did 10 runs of only the changed/fixed test. For v3, >> I only did 1 run. >> > > Hi Eelco, > > I have one comment down below. > > >> >> .ci/ci.sh | 12 ++++++- >> .ci/dpdk-build.sh | 54 ++++++++++++++++++++++++++++++ >> .ci/dpdk-prepare.sh | 11 ++++++ >> .ci/linux-build.sh | 49 ++++++++++++++++++++++++++- >> .github/workflows/test.yml | 80 >> ++++++++++++++++++++++++++++++++++++++++++++ >> Makefile.am | 2 + >> tests/system-ovn.at | 2 + >> 7 files changed, 207 insertions(+), 3 deletions(-) >> create mode 100755 .ci/dpdk-build.sh >> create mode 100755 .ci/dpdk-prepare.sh >> >> diff --git a/.ci/ci.sh b/.ci/ci.sh >> index 90942bab6..10f11939c 100755 >> --- a/.ci/ci.sh >> +++ b/.ci/ci.sh >> @@ -16,6 +16,7 @@ >> >> OVN_PATH=${OVN_PATH:-$PWD} >> OVS_PATH=${OVS_PATH:-$OVN_PATH/ovs} >> +DPDK_PATH=${DPDK_PATH:-$OVN_PATH/dpdk-dir} >> CONTAINER_CMD=${CONTAINER_CMD:-podman} >> CONTAINER_WORKSPACE="/workspace" >> CONTAINER_WORKDIR="/workspace/ovn-tmp" >> @@ -80,6 +81,10 @@ function copy_sources_to_workdir() { >> && \ >> cp -a $CONTAINER_WORKSPACE/ovs/. $CONTAINER_WORKDIR/ovs \ >> && \ >> + rm -rf $CONTAINER_WORKDIR/dpdk-dir \ >> + && \ >> + cp -a $CONTAINER_WORKSPACE/dpdk-dir/. $CONTAINER_WORKDIR/dpdk-dir >> \ >> + && \ >> git config --global --add safe.directory $CONTAINER_WORKDIR >> " >> } >> @@ -95,7 +100,7 @@ function run_tests() { >> cd $CONTAINER_WORKDIR \ >> && \ >> ARCH=$ARCH CC=$CC LIBS=$LIBS OPTS=$OPTS TESTSUITE=$TESTSUITE \ >> - TEST_RANGE=$TEST_RANGE SANITIZERS=$SANITIZERS \ >> + TEST_RANGE=$TEST_RANGE SANITIZERS=$SANITIZERS DPDK=$DPDK \ >> ./.ci/linux-build.sh >> " >> } >> @@ -148,12 +153,17 @@ if [ "$ARCH" = "aarch64" ]; then >> ASAN_OPTIONS="detect_leaks=0" >> fi >> >> +if [ -z "$DPDK" ]; then >> + mkdir -p "$DPDK_PATH" >> +fi >> + >> CONTAINER_ID="$($CONTAINER_CMD run --privileged -d \ >> --pids-limit=-1 \ >> --env ASAN_OPTIONS=$ASAN_OPTIONS \ >> -v /lib/modules/$(uname -r):/lib/modules/$(uname -r):ro \ >> -v $OVN_PATH:$CONTAINER_WORKSPACE/ovn:Z \ >> -v $OVS_PATH:$CONTAINER_WORKSPACE/ovs:Z \ >> + -v $DPDK_PATH:$CONTAINER_WORKSPACE/dpdk-dir:Z \ >> $IMAGE_NAME)" >> trap remove_container EXIT >> >> diff --git a/.ci/dpdk-build.sh b/.ci/dpdk-build.sh >> new file mode 100755 >> index 000000000..f44ac15b0 >> --- /dev/null >> +++ b/.ci/dpdk-build.sh >> @@ -0,0 +1,54 @@ >> +#!/bin/bash >> + >> +set -o errexit >> +set -x >> + >> +function build_dpdk() >> +{ >> + local VERSION_FILE="dpdk-dir/cached-version" >> + local DPDK_VER=$1 >> + local DPDK_OPTS="" >> + >> + rm -rf dpdk-dir >> + >> + if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then >> + git clone --single-branch $DPDK_GIT dpdk-dir -b >> "${DPDK_VER##refs/*/}" >> + pushd dpdk-dir >> + git log -1 --oneline >> + else >> + wget https://fast.dpdk.org/rel/dpdk-$1.tar.xz >> + tar xvf dpdk-$1.tar.xz > /dev/null >> + DIR_NAME=$(tar -tf dpdk-$1.tar.xz | head -1 | cut -f1 -d"/") >> + mv ${DIR_NAME} dpdk-dir >> + pushd dpdk-dir >> + fi >> + >> + # Switching to 'default' machine to make dpdk-dir cache usable on >> + # different CPUs. We can't be sure that all CI machines are exactly >> same. >> + DPDK_OPTS="$DPDK_OPTS -Dmachine=default" >> + >> + # Disable building DPDK unit tests. Not needed for OVS build or tests. >> + DPDK_OPTS="$DPDK_OPTS -Dtests=false" >> + >> + # Disable DPDK developer mode, this results in less build checks and >> less >> + # meson verbose outputs. >> + DPDK_OPTS="$DPDK_OPTS -Ddeveloper_mode=disabled" >> + >> + # OVS compilation and the "ovn-system-dpdk" unit tests (run in the CI) >> + # only depend on virtio/tap drivers. >> + # We can disable all remaining drivers to save compilation time. >> + DPDK_OPTS="$DPDK_OPTS -Denable_drivers=net/null,net/tap,net/virtio" >> + >> + # Install DPDK using prefix. >> + DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build" >> + >> + meson $DPDK_OPTS build >> + ninja -C build >> + ninja -C build install >> + >> + echo "Installed DPDK in $(pwd)" >> + popd >> + echo "${DPDK_VER}" > ${VERSION_FILE} >> +} >> + >> +build_dpdk $DPDK_VER >> diff --git a/.ci/dpdk-prepare.sh b/.ci/dpdk-prepare.sh >> new file mode 100755 >> index 000000000..f7e6215dd >> --- /dev/null >> +++ b/.ci/dpdk-prepare.sh >> @@ -0,0 +1,11 @@ >> +#!/bin/bash >> + >> +set -ev >> + >> +# Installing wheel separately because it may be needed to build some >> +# of the packages during dependency backtracking and pip >= 22.0 will >> +# abort backtracking on build failures: >> +# https://github.com/pypa/pip/issues/10655 >> +pip3 install --disable-pip-version-check --user wheel >> +pip3 install --disable-pip-version-check --user pyelftools >> +pip3 install --user 'meson==0.53.2' >> > > Do we need this whole dpdk-prepare.sh? We have moved all python > dependencies to > py-requirements.txt [0]. pyelftools are already there so the only missing > package would be meson. The dpdk cash is built outside of the containers, so we need this. >> diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh >> index 907a0dc6c..5a79a52da 100755 >> --- a/.ci/linux-build.sh >> +++ b/.ci/linux-build.sh >> @@ -10,13 +10,54 @@ OVN_CFLAGS="" >> OPTS="$OPTS --enable-Werror" >> JOBS=${JOBS:-"-j4"} >> >> +function install_dpdk() >> +{ >> + local VERSION_FILE="dpdk-dir/cached-version" >> + local DPDK_LIB=$(pwd)/dpdk-dir/build/lib/x86_64-linux-gnu >> + >> + # Export the following path for pkg-config to find the .pc file. >> + export PKG_CONFIG_PATH=$DPDK_LIB/pkgconfig/:$PKG_CONFIG_PATH >> + >> + if [ ! -f "${VERSION_FILE}" ]; then >> + echo "Could not find DPDK in $(pwd)/dpdk-dir" >> + return 1 >> + fi >> + >> + # As we build inside a container we need to update the prefix. >> + sed -i -E "s|^prefix=.*|prefix=$(pwd)/dpdk-dir/build|" \ >> + "$DPDK_LIB/pkgconfig/libdpdk-libs.pc" >> + >> + # Update the library paths. >> + sudo ldconfig >> + echo "Found cached DPDK $(cat ${VERSION_FILE}) build in >> $(pwd)/dpdk-dir" >> +} >> + >> function configure_ovs() >> { >> + if [ "$DPDK" ]; then >> + # When DPDK is enabled, we need to build OVS twice. Once to have >> + # ovs-vswitchd with DPDK. But OVN does not like the OVS libraries >> to >> + # be compiled with DPDK enabled, hence we need a final clean build >> + # with this disabled. >> + install_dpdk >> + >> + pushd ovs >> + ./boot.sh && ./configure CFLAGS="${COMMON_CFLAGS}" >> --with-dpdk=static \ >> + $* || { cat config.log; exit 1; } >> + make $JOBS || { cat config.log; exit 1; } >> + cp vswitchd/ovs-vswitchd vswitchd/ovs-vswitchd_with_dpdk >> + popd >> + fi >> + >> pushd ovs >> ./boot.sh && ./configure CFLAGS="${COMMON_CFLAGS}" $* || \ >> - { cat config.log; exit 1; } >> + { cat config.log; exit 1; } >> make $JOBS || { cat config.log; exit 1; } >> popd >> + >> + if [ "$DPDK" ]; then >> + cp ovs/vswitchd/ovs-vswitchd_with_dpdk ovs/vswitchd/ovs-vswitchd >> + fi >> } >> >> function configure_ovn() >> @@ -104,6 +145,12 @@ if [ "$TESTSUITE" ]; then >> execute_system_tests "check-system-userspace" \ >> "system-userspace-testsuite.log" >> ;; >> + >> + "system-test-dpdk") >> + # The dpdk tests need huge page memory, so reserve some 2M pages. >> + sudo bash -c "echo 2048 > >> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages" >> + execute_system_tests "check-system-dpdk" >> "system-dpdk-testsuite.log" >> + ;; >> esac >> else >> configure_ovn $OPTS >> diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml >> index 6e8eac8d1..fe2a14c40 100644 >> --- a/.github/workflows/test.yml >> +++ b/.github/workflows/test.yml >> @@ -12,11 +12,81 @@ concurrency: >> cancel-in-progress: true >> >> jobs: >> + build-dpdk: >> + env: >> + dependencies: gcc libnuma-dev ninja-build >> + CC: gcc >> + DPDK_GIT: https://dpdk.org/git/dpdk-stable >> + DPDK_VER: 22.11.1 >> + name: dpdk gcc >> + outputs: >> + dpdk_key: ${{ steps.gen_dpdk_key.outputs.key }} >> + runs-on: ubuntu-20.04 >> + timeout-minutes: 30 >> + >> + steps: >> + - name: checkout >> + uses: actions/checkout@v3 >> + >> + - name: update PATH >> + run: | >> + echo "$HOME/bin" >> $GITHUB_PATH >> + echo "$HOME/.local/bin" >> $GITHUB_PATH >> + >> + - name: create ci signature file for the dpdk cache key >> + # This will collect most of DPDK related lines, so hash will be >> different >> + # if something changed in a way we're building DPDK including >> DPDK_VER. >> + # This also allows us to use cache from any branch as long as >> version >> + # and a way we're building DPDK stays the same. >> + run: | >> + grep -irE 'RTE_|DPDK|meson|ninja' .ci/dpdk-* > dpdk-ci-signature >> + grep -rwE 'DPDK_GIT|DPDK_VER' .github/ >> dpdk-ci-signature >> + if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then >> + git ls-remote --heads $DPDK_GIT $DPDK_VER >> dpdk-ci-signature >> + fi >> + cat dpdk-ci-signature >> + >> + - name: generate ci DPDK key >> + id: gen_dpdk_key >> + env: >> + ci_key: ${{ hashFiles('dpdk-ci-signature') }} >> + run: echo 'key=dpdk-${{ env.ci_key }}' >> $GITHUB_OUTPUT >> + >> + - name: cache >> + id: dpdk_cache >> + uses: actions/cache@v3 >> + with: >> + path: dpdk-dir >> + key: ${{ steps.gen_dpdk_key.outputs.key }} >> + >> + - name: set up python >> + if: steps.dpdk_cache.outputs.cache-hit != 'true' >> + uses: actions/setup-python@v4 >> + with: >> + python-version: '3.9' >> + >> + - name: update APT cache >> + if: steps.dpdk_cache.outputs.cache-hit != 'true' >> + run: sudo apt update || true >> + - name: install common dependencies >> + if: steps.dpdk_cache.outputs.cache-hit != 'true' >> + run: sudo apt install -y ${{ env.dependencies }} >> + >> + - name: prepare >> + if: steps.dpdk_cache.outputs.cache-hit != 'true' >> + run: ./.ci/dpdk-prepare.sh >> + >> + - name: build >> + if: steps.dpdk_cache.outputs.cache-hit != 'true' >> + run: ./.ci/dpdk-build.sh >> + >> build-linux: >> + needs: build-dpdk >> env: >> IMAGE_NAME: ghcr.io/ovn-org/ovn-tests:ubuntu >> ARCH: ${{ matrix.cfg.arch }} >> CC: ${{ matrix.cfg.compiler }} >> + DPDK: ${{ matrix.cfg.dpdk }} >> LIBS: ${{ matrix.cfg.libs }} >> OPTS: ${{ matrix.cfg.opts }} >> TESTSUITE: ${{ matrix.cfg.testsuite }} >> @@ -43,6 +113,9 @@ jobs: >> - { compiler: gcc, testsuite: test, libs: -ljemalloc, test_range: >> "-500" } >> - { compiler: gcc, testsuite: test, libs: -ljemalloc, test_range: >> "501-1000" } >> - { compiler: gcc, testsuite: test, libs: -ljemalloc, test_range: >> "1001-" } >> + - { compiler: gcc, testsuite: system-test-dpdk, dpdk: dpdk, >> test_range: "-100" } >> + - { compiler: gcc, testsuite: system-test-dpdk, dpdk: dpdk, >> test_range: "101-200" } >> + - { compiler: gcc, testsuite: system-test-dpdk, dpdk: dpdk, >> test_range: "201-" } >> - { compiler: gcc, testsuite: system-test-userspace, test_range: >> "-100" } >> - { compiler: gcc, testsuite: system-test-userspace, test_range: >> "101-200" } >> - { compiler: gcc, testsuite: system-test-userspace, test_range: >> "201-" } >> @@ -84,6 +157,13 @@ jobs: >> sort -V | tail -1) >> working-directory: ovs >> >> + - name: cache >> + if: matrix.cfg.dpdk != '' >> + uses: actions/cache@v3 >> + with: >> + path: dpdk-dir >> + key: ${{ needs.build-dpdk.outputs.dpdk_key }} >> + >> - name: build >> if: ${{ startsWith(matrix.cfg.testsuite, 'system-test') }} >> run: sudo -E ./.ci/ci.sh --archive-logs >> diff --git a/Makefile.am b/Makefile.am >> index f1bd72d94..27182c7bc 100644 >> --- a/Makefile.am >> +++ b/Makefile.am >> @@ -87,6 +87,8 @@ EXTRA_DIST = \ >> NOTICE \ >> .cirrus.yml \ >> .ci/ci.sh \ >> + .ci/dpdk-build.sh \ >> + .ci/dpdk-prepare.sh \ >> .ci/linux-build.sh \ >> .ci/osx-build.sh \ >> .ci/osx-prepare.sh \ >> diff --git a/tests/system-ovn.at b/tests/system-ovn.at >> index 05c234edc..a3f8fdaa9 100644 >> --- a/tests/system-ovn.at >> +++ b/tests/system-ovn.at >> @@ -4267,7 +4267,7 @@ done >> # Enable IGMP snooping on sw1. >> ovn-nbctl set Logical_Switch sw1 other_config:mcast_querier="false" >> ovn-nbctl set Logical_Switch sw1 other_config:mcast_snoop="true" >> - >> +ovn-nbctl --wait=hv sync >> >> group_v4="239.0.1.68" >> # Inject IGMP Join for v4 group on sw1-p1. >> >> _______________________________________________ >> dev mailing list >> d...@openvswitch.org >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev >> >> > Thanks, > Ales > > [0] > https://github.com/ovn-org/ovn/blob/fd68fd757a8b2c7f1e2828315c3ccde11921b1e3/utilities/containers/py-requirements.txt > > -- > > Ales Musil > > Senior Software Engineer - OVN Core > > Red Hat EMEA <https://www.redhat.com> > > amu...@redhat.com IM: amusil > <https://red.ht/sig> _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev