Commit df79fd56 authored by Robert Foley's avatar Robert Foley Committed by Alex Bennée
Browse files

tests/docker: Added docker build support for TSan.

Added a new docker for ubuntu 20.04.
This docker has support for Thread Sanitizer
including one patch we need in one of the header files.
https://github.com/llvm/llvm-project/commit/a72dc86cd



This command will build with tsan enabled:
make docker-test-tsan-ubuntu2004 V=1

Also added the TSAN suppresion file to disable certain
cases of TSAN warnings.

Cc: Fam Zheng <fam@euphon.net>
Cc: Philippe Mathieu-Daudé <philmd@redhat.com>
Signed-off-by: default avatarRobert Foley <robert.foley@linaro.org>
Reviewed-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Signed-off-by: default avatarAlex Bennée <alex.bennee@linaro.org>
Message-Id: <20200609200738.445-10-robert.foley@linaro.org>
Message-Id: <20200612190237.30436-13-alex.bennee@linaro.org>
parent 45a9595a
Loading
Loading
Loading
Loading
+65 −0
Original line number Diff line number Diff line
FROM ubuntu:20.04
ENV PACKAGES flex bison \
    ccache \
    clang-10\
    gcc \
    gettext \
    git \
    glusterfs-common \
    libaio-dev \
    libattr1-dev \
    libbrlapi-dev \
    libbz2-dev \
    libcacard-dev \
    libcap-ng-dev \
    libcurl4-gnutls-dev \
    libdrm-dev \
    libepoxy-dev \
    libfdt-dev \
    libgbm-dev \
    libgtk-3-dev \
    libibverbs-dev \
    libiscsi-dev \
    libjemalloc-dev \
    libjpeg-turbo8-dev \
    liblzo2-dev \
    libncurses5-dev \
    libncursesw5-dev \
    libnfs-dev \
    libnss3-dev \
    libnuma-dev \
    libpixman-1-dev \
    librados-dev \
    librbd-dev \
    librdmacm-dev \
    libsasl2-dev \
    libsdl2-dev \
    libseccomp-dev \
    libsnappy-dev \
    libspice-protocol-dev \
    libspice-server-dev \
    libssh-dev \
    libusb-1.0-0-dev \
    libusbredirhost-dev \
    libvdeplug-dev \
    libvte-2.91-dev \
    libxen-dev \
    libzstd-dev \
    make \
    python3-yaml \
    python3-sphinx \
    sparse \
    texinfo \
    xfslibs-dev\
    vim
RUN apt-get update && \
    DEBIAN_FRONTEND=noninteractive apt-get -y install $PACKAGES
RUN dpkg -l $PACKAGES | sort > /packages.txt
ENV FEATURES clang tsan pyyaml sdl2

# https://bugs.launchpad.net/qemu/+bug/1838763
ENV QEMU_CONFIGURE_OPTS --disable-libssh

# Apply patch https://reviews.llvm.org/D75820
# This is required for TSan in clang-10 to compile with QEMU.
RUN sed -i 's/^const/static const/g' /usr/lib/llvm-10/lib/clang/10.0.0/include/sanitizer/tsan_interface.h

tests/docker/test-tsan

0 → 100755
+44 −0
Original line number Diff line number Diff line
#!/bin/bash -e
#
# This test will use TSan as part of a build and a make check.
#
# Copyright (c) 2020 Linaro
# Copyright (c) 2016 Red Hat Inc.
#
# Authors:
#  Robert Foley <robert.foley@linaro.org>
#  Originally based on test-quick from Fam Zheng <famz@redhat.com>
#
# This work is licensed under the terms of the GNU GPL, version 2
# or (at your option) any later version. See the COPYING file in
# the top-level directory.

. common.rc

setup_tsan()
{
    requires clang tsan
    tsan_log_dir="/tmp/qemu-test/build/tsan"
    mkdir -p $tsan_log_dir > /dev/null || true
    EXTRA_CONFIGURE_OPTS="${EXTRA_CONFIGURE_OPTS} --enable-tsan \
                          --cc=clang-10 --cxx=clang++-10 \
                          --disable-werror --extra-cflags=-O0"
    # detect deadlocks is false currently simply because
    # TSan crashes immediately with deadlock detector enabled.
    # We have maxed out the history size to get the best chance of finding
    # warnings during testing.
    # Note, to get TSan to fail on warning, use exitcode=66 below.
    tsan_opts="suppressions=/tmp/qemu-test/src/tests/tsan/suppressions.tsan\
               detect_deadlocks=false history_size=7\
               halt_on_error=0 exitcode=0 verbose=5\
               log_path=$tsan_log_dir/tsan_warning"
    export TSAN_OPTIONS="$tsan_opts"
}

cd "$BUILD_DIR"

TARGET_LIST=${TARGET_LIST:-$DEF_TARGET_LIST} \
setup_tsan
build_qemu
check_qemu
install_qemu
+10 −0
Original line number Diff line number Diff line
# This is an example blacklist.
# To enable use of the blacklist add this to configure:
# "--extra-cflags=-fsanitize-blacklist=<src path>/tests/tsan/blacklist.tsan"
# The eventual goal would be to fix these warnings.

# TSan is not happy about setting/getting of dirty bits,
# for example, cpu_physical_memory_set_dirty_range,
# and cpu_physical_memory_get_dirty.
src:bitops.c
src:bitmap.c
+14 −0
Original line number Diff line number Diff line
# This is the set of runtime suppressions of TSan warnings.
# The goal would be to have here only items we do not
# plan to fix, and to explain why for each item.

# TSan reports a double lock on RECURSIVE mutexes.
# Since the recursive lock is intentional, we choose to ignore it.
mutex:aio_context_acquire
mutex:pthread_mutex_lock

# TSan reports a race betwen pthread_mutex_init() and
# pthread_mutex_lock().  Since this is outside of QEMU,
# we choose to ignore it.
race:pthread_mutex_init
race:pthread_mutex_lock