On Tue, Jul 4, 2023 at 12:53 PM Eelco Chaudron <echau...@redhat.com> wrote:

>
>
> 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.
>

Hmm that's not very nice, but I don't have a better idea.

Acked-by: Ales Musil <amu...@redhat.com>

Thanks,
Ales


>
> >> 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>
>
>

-- 

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

Reply via email to