MDEV-22578 thread_pool_info crashes with clang6, using SSE instructions on unaligned memory

Apparently, in stats_reset_table(), the innocuous

  memset(&group->counters, 0, sizeof(group->counters));

is converted by clang to SSE2 instructions.

The problem is that "group" is not correctly aligned,
despite  MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) in the thread_group_t
declaration.

It is not aligned because it was allocated with my_malloc, since
commit fd9f1638, MDEV-5205. Previously all_groups was a
statically allocated array.

Fix is to remove MY_ALIGNED, and pad the struct instead.
This commit is contained in:
Vladislav Vaintroub 2020-05-15 16:09:13 +02:00
parent f2a944516e
commit 69077dea25

View file

@ -126,7 +126,7 @@ struct thread_group_counters_t
ulonglong polls[2];
};
struct MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) thread_group_t
struct thread_group_t
{
mysql_mutex_t mutex;
connection_queue_t queues[NQUEUES];
@ -145,6 +145,7 @@ struct MY_ALIGNED(CPU_LEVEL1_DCACHE_LINESIZE) thread_group_t
bool shutdown;
bool stalled;
thread_group_counters_t counters;
char pad[CPU_LEVEL1_DCACHE_LINESIZE];
};
#define TP_INCREMENT_GROUP_COUNTER(group,var) do {group->counters.var++;}while(0)