From a68d1352b60bfc3a424fd290a4f5a1beae1bb71e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marko=20M=C3=A4kel=C3=A4?= Date: Fri, 25 Nov 2016 06:28:02 +0200 Subject: [PATCH] MDEV-11349 (2/2) Fix some bogus-looking Valgrind warnings buf_block_init(): Initialize buf_page_t::flush_type. For some reason, Valgrind 3.12.0 would seem to flag some bits in adjacent bitfields as uninitialized, even though only the two bits of flush_type were left uninitialized. Initialize the field to get rid of many warnings. buf_page_init_low(): Initialize buf_page_t::old. For some reason, Valgrind 3.12.0 would seem to flag all 32 bits uninitialized when buf_page_init_for_read() invokes buf_LRU_add_block(bpage, TRUE). This would trigger bogus warnings for buf_page_t::freed_page_clock being uninitialized. (The V-bits would later claim that only "old" is initialized in the 32-bit word.) Perhaps recent compilers (GCC 6.2.1 and clang 4.0.0) generate more optimized x86_64 code for bitfield operations, confusing Valgrind? mach_write_to_1(), mach_write_to_2(), mach_write_to_3(): Rewrite the assertions that ensure that the most significant bits are zero. Apparently, clang 4.0.0 would optimize expressions of the form ((n | 0xFF) <= 0x100) to (n <= 0x100). The redundant 0xFF was added in the first place in order to suppress a Valgrind warning. (Valgrind would warn about comparing uninitialized values even in the case when the uninitialized bits do not affect the result of the comparison.) --- storage/innobase/buf/buf0buf.cc | 2 ++ storage/innobase/include/mach0data.ic | 6 +++--- storage/xtradb/buf/buf0buf.cc | 1 + storage/xtradb/include/mach0data.ic | 6 +++--- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/storage/innobase/buf/buf0buf.cc b/storage/innobase/buf/buf0buf.cc index 7eca60417a1..a05f3715cb9 100644 --- a/storage/innobase/buf/buf0buf.cc +++ b/storage/innobase/buf/buf0buf.cc @@ -1124,6 +1124,7 @@ buf_block_init( block->frame = frame; block->page.buf_pool_index = buf_pool_index(buf_pool); + block->page.flush_type = BUF_FLUSH_LRU; block->page.state = BUF_BLOCK_NOT_USED; block->page.buf_fix_count = 0; block->page.io_fix = BUF_IO_NONE; @@ -3784,6 +3785,7 @@ buf_page_init_low( bpage->flush_type = BUF_FLUSH_LRU; bpage->io_fix = BUF_IO_NONE; bpage->buf_fix_count = 0; + bpage->old = 0; bpage->freed_page_clock = 0; bpage->access_time = 0; bpage->newest_modification = 0; diff --git a/storage/innobase/include/mach0data.ic b/storage/innobase/include/mach0data.ic index fe55adaf002..881b2b6055f 100644 --- a/storage/innobase/include/mach0data.ic +++ b/storage/innobase/include/mach0data.ic @@ -38,7 +38,7 @@ mach_write_to_1( ulint n) /*!< in: ulint integer to be stored, >= 0, < 256 */ { ut_ad(b); - ut_ad((n | 0xFFUL) <= 0xFFUL); + ut_ad((n & ~0xFFUL) == 0); b[0] = (byte) n; } @@ -68,7 +68,7 @@ mach_write_to_2( ulint n) /*!< in: ulint integer to be stored */ { ut_ad(b); - ut_ad((n | 0xFFFFUL) <= 0xFFFFUL); + ut_ad((n & ~0xFFFFUL) == 0); b[0] = (byte)(n >> 8); b[1] = (byte)(n); @@ -131,7 +131,7 @@ mach_write_to_3( ulint n) /*!< in: ulint integer to be stored */ { ut_ad(b); - ut_ad((n | 0xFFFFFFUL) <= 0xFFFFFFUL); + ut_ad((n & ~0xFFFFFFUL) == 0); b[0] = (byte)(n >> 16); b[1] = (byte)(n >> 8); diff --git a/storage/xtradb/buf/buf0buf.cc b/storage/xtradb/buf/buf0buf.cc index 50a13da262c..ebfc813f13d 100644 --- a/storage/xtradb/buf/buf0buf.cc +++ b/storage/xtradb/buf/buf0buf.cc @@ -1189,6 +1189,7 @@ buf_block_init( block->frame = frame; block->page.buf_pool_index = buf_pool_index(buf_pool); + block->page.flush_type = BUF_FLUSH_LRU; block->page.state = BUF_BLOCK_NOT_USED; block->page.buf_fix_count = 0; block->page.io_fix = BUF_IO_NONE; diff --git a/storage/xtradb/include/mach0data.ic b/storage/xtradb/include/mach0data.ic index 27b9f62b552..bf2c735b0da 100644 --- a/storage/xtradb/include/mach0data.ic +++ b/storage/xtradb/include/mach0data.ic @@ -38,7 +38,7 @@ mach_write_to_1( ulint n) /*!< in: ulint integer to be stored, >= 0, < 256 */ { ut_ad(b); - ut_ad((n | 0xFFUL) <= 0xFFUL); + ut_ad((n & ~0xFFUL) == 0); b[0] = (byte) n; } @@ -67,7 +67,7 @@ mach_write_to_2( ulint n) /*!< in: ulint integer to be stored */ { ut_ad(b); - ut_ad((n | 0xFFFFUL) <= 0xFFFFUL); + ut_ad((n & ~0xFFFFUL) == 0); b[0] = (byte)(n >> 8); b[1] = (byte)(n); @@ -115,7 +115,7 @@ mach_write_to_3( ulint n) /*!< in: ulint integer to be stored */ { ut_ad(b); - ut_ad((n | 0xFFFFFFUL) <= 0xFFFFFFUL); + ut_ad((n & ~0xFFFFFFUL) == 0); b[0] = (byte)(n >> 16); b[1] = (byte)(n >> 8);