Index: lib/sanitizer_common/sanitizer_allocator_primary32.h =================================================================== --- lib/sanitizer_common/sanitizer_allocator_primary32.h +++ lib/sanitizer_common/sanitizer_allocator_primary32.h @@ -270,10 +270,9 @@ SpinMutex mutex; IntrusiveList free_list; u32 rand_state; - char padding[kCacheLineSize - 2 * sizeof(uptr) - - sizeof(IntrusiveList)]; }; - COMPILER_CHECK(sizeof(SizeClassInfo) == kCacheLineSize); + typedef padded_t PaddedSizeClassInfo; + COMPILER_CHECK(sizeof(PaddedSizeClassInfo) % kCacheLineSize == 0); uptr ComputeRegionId(uptr mem) { const uptr res = mem >> kRegionSizeLog; @@ -299,8 +298,8 @@ } SizeClassInfo *GetSizeClassInfo(uptr class_id) { - CHECK_LT(class_id, kNumClasses); - return &size_class_info_array[class_id]; + DCHECK_LT(class_id, kNumClasses); + return &size_class_info_array[class_id].object; } bool PopulateBatches(AllocatorCache *c, SizeClassInfo *sci, uptr class_id, @@ -367,5 +366,6 @@ } ByteMap possible_regions; - SizeClassInfo size_class_info_array[kNumClasses]; + ALIGNED(kCacheLineSize) + PaddedSizeClassInfo size_class_info_array[kNumClasses]; }; Index: lib/sanitizer_common/sanitizer_allocator_primary64.h =================================================================== --- lib/sanitizer_common/sanitizer_allocator_primary64.h +++ lib/sanitizer_common/sanitizer_allocator_primary64.h @@ -301,7 +301,7 @@ } static uptr AdditionalSize() { - return RoundUpTo(sizeof(RegionInfo) * kNumClassesRounded, + return RoundUpTo(sizeof(PaddedRegionInfo) * kNumClassesRounded, GetPageSizeCached()); } @@ -597,13 +597,14 @@ Stats stats; ReleaseToOsInfo rtoi; }; - COMPILER_CHECK(sizeof(RegionInfo) >= kCacheLineSize); + typedef padded_t PaddedRegionInfo; + COMPILER_CHECK(sizeof(PaddedRegionInfo) % kCacheLineSize == 0); RegionInfo *GetRegionInfo(uptr class_id) const { - CHECK_LT(class_id, kNumClasses); - RegionInfo *regions = - reinterpret_cast(SpaceBeg() + kSpaceSize); - return ®ions[class_id]; + DCHECK_LT(class_id, kNumClasses); + PaddedRegionInfo *regions = + reinterpret_cast(SpaceBeg() + kSpaceSize); + return ®ions[class_id].object; } uptr GetMetadataEnd(uptr region_beg) const { Index: lib/sanitizer_common/sanitizer_common.h =================================================================== --- lib/sanitizer_common/sanitizer_common.h +++ lib/sanitizer_common/sanitizer_common.h @@ -40,11 +40,35 @@ const uptr kWordSizeInBits = 8 * kWordSize; #if defined(__powerpc__) || defined(__powerpc64__) - const uptr kCacheLineSize = 128; + constexpr uptr kCacheLineSize = 128; #else - const uptr kCacheLineSize = 64; + constexpr uptr kCacheLineSize = 64; #endif +constexpr uptr CacheLinePad(uptr object_size) { + return ((object_size / kCacheLineSize) * kCacheLineSize) + + (((object_size % kCacheLineSize) != 0) * kCacheLineSize) - + object_size; +} + +template +struct padded { + using type = struct { + ALIGNED(kCacheLineSize) T object; + char pad_[CacheLinePad(sizeof(T))]; + }; +}; + +template +struct padded { + using type = struct { + ALIGNED(kCacheLineSize) T object; + }; +}; + +template +using padded_t = typename padded::type; + const uptr kMaxPathLength = 4096; const uptr kMaxThreadStackSize = 1 << 30; // 1Gb