[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH] translate-all: Enable locking debug in a debug
From: |
Alex Bennée |
Subject: |
Re: [Qemu-devel] [PATCH] translate-all: Enable locking debug in a debug build |
Date: |
Wed, 16 Nov 2016 15:57:39 +0000 |
User-agent: |
mu4e 0.9.17; emacs 25.1.50.18 |
Pranith Kumar <address@hidden> writes:
> Unconditionally enable locking checks in debug builds so that we get
> wider testing. Using tcg_debug_assert() allows us to remove
> DEBUG_LOCKING define.
Interesting. The other option would be to add a debug build to
.travis.yml that define this (and others) with -DFOO_DEBUG.
>
> Signed-off-by: Pranith Kumar <address@hidden>
> ---
> translate-all.c | 50 +++++++++++++++++---------------------------------
> 1 file changed, 17 insertions(+), 33 deletions(-)
>
> diff --git a/translate-all.c b/translate-all.c
> index cf828aa..a03f323 100644
> --- a/translate-all.c
> +++ b/translate-all.c
> @@ -60,7 +60,6 @@
>
> /* #define DEBUG_TB_INVALIDATE */
> /* #define DEBUG_TB_FLUSH */
> -/* #define DEBUG_LOCKING */
> /* make various TB consistency checks */
> /* #define DEBUG_TB_CHECK */
So if we are enabling this for tcg_debug builds why not the other cases?
>
> @@ -75,23 +74,13 @@
> * access to the memory related structures are protected with the
> * mmap_lock.
> */
> -#ifdef DEBUG_LOCKING
> -#define DEBUG_MEM_LOCKS 1
> -#else
> -#define DEBUG_MEM_LOCKS 0
> -#endif
> -
In retrospect I should probably of had a comment in here about the roll
of tb_lock in CONFIG_SOFTMMU versus the mmap_lock.
> #ifdef CONFIG_SOFTMMU
> #define assert_memory_lock() do { \
> - if (DEBUG_MEM_LOCKS) { \
> - g_assert(have_tb_lock); \
> - } \
> + tcg_debug_assert(have_tb_lock); \
> } while (0)
> #else
> #define assert_memory_lock() do { \
> - if (DEBUG_MEM_LOCKS) { \
> - g_assert(have_mmap_lock()); \
> - } \
> + tcg_debug_assert(have_mmap_lock()); \
> } while (0)
> #endif
>
> @@ -172,16 +161,24 @@ static void page_table_config_init(void)
> assert(v_l2_levels >= 0);
> }
>
> +#define assert_tb_locked() do { \
> + tcg_debug_assert(have_tb_lock); \
> + } while (0)
> +
> +#define assert_tb_unlocked() do { \
> + tcg_debug_assert(!have_tb_lock); \
> + } while (0)
> +
I'm not sure we need all this multi-line stuff for a simple
substitution? Richard?
> void tb_lock(void)
> {
> - assert(!have_tb_lock);
> + assert_tb_unlocked();
Hmm why introduce a helper for exactly one use?
> qemu_mutex_lock(&tcg_ctx.tb_ctx.tb_lock);
> have_tb_lock++;
> }
>
> void tb_unlock(void)
> {
> - assert(have_tb_lock);
> + assert_tb_locked();
> have_tb_lock--;
> qemu_mutex_unlock(&tcg_ctx.tb_ctx.tb_lock);
> }
> @@ -194,19 +191,6 @@ void tb_lock_reset(void)
> }
> }
>
> -#ifdef DEBUG_LOCKING
> -#define DEBUG_TB_LOCKS 1
> -#else
> -#define DEBUG_TB_LOCKS 0
> -#endif
> -
> -#define assert_tb_lock() do { \
> - if (DEBUG_TB_LOCKS) { \
> - g_assert(have_tb_lock); \
> - } \
> - } while (0)
> -
> -
> static TranslationBlock *tb_find_pc(uintptr_t tc_ptr);
>
> void cpu_gen_init(void)
> @@ -840,7 +824,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
> {
> TranslationBlock *tb;
>
> - assert_tb_lock();
> + assert_tb_locked();
>
> if (tcg_ctx.tb_ctx.nb_tbs >= tcg_ctx.code_gen_max_blocks) {
> return NULL;
> @@ -855,7 +839,7 @@ static TranslationBlock *tb_alloc(target_ulong pc)
> /* Called with tb_lock held. */
> void tb_free(TranslationBlock *tb)
> {
> - assert_tb_lock();
> + assert_tb_locked();
>
> /* In practice this is mostly used for single use temporary TB
> Ignore the hard cases and just back up if this TB happens to
> @@ -1097,7 +1081,7 @@ void tb_phys_invalidate(TranslationBlock *tb,
> tb_page_addr_t page_addr)
> uint32_t h;
> tb_page_addr_t phys_pc;
>
> - assert_tb_lock();
> + assert_tb_locked();
>
> atomic_set(&tb->invalid, true);
>
> @@ -1412,7 +1396,7 @@ static void tb_invalidate_phys_range_1(tb_page_addr_t
> start, tb_page_addr_t end)
> #ifdef CONFIG_SOFTMMU
> void tb_invalidate_phys_range(tb_page_addr_t start, tb_page_addr_t end)
> {
> - assert_tb_lock();
> + assert_tb_locked();
> tb_invalidate_phys_range_1(start, end);
> }
> #else
> @@ -1455,7 +1439,7 @@ void tb_invalidate_phys_page_range(tb_page_addr_t
> start, tb_page_addr_t end,
> #endif /* TARGET_HAS_PRECISE_SMC */
>
> assert_memory_lock();
> - assert_tb_lock();
> + assert_tb_locked();
>
> p = page_find(start >> TARGET_PAGE_BITS);
> if (!p) {
--
Alex Bennée