From 831698b8f7e479506b2f7156ce54fe95b7126c1c Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Tue, 19 Apr 2016 17:01:11 +0000 Subject: [PATCH] Allocate memory on cache line if requested Since GTM::gtm_thread has gtm_thread *next_thread __attribute__((__aligned__(HW_CACHELINE_SIZE))); GTM::gtm_thread::operator new () calls xmalloc with separate_cl == true. xmalloc must return memory on cache line in this case. PR libitm/70456 * util.cc (xmalloc): Use posix_memalign to allocate memory on on cache line if requested. From-SVN: r235211 --- libitm/ChangeLog | 6 ++++++ libitm/util.cc | 22 ++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/libitm/ChangeLog b/libitm/ChangeLog index 42b47762b9f..68b5069806b 100644 --- a/libitm/ChangeLog +++ b/libitm/ChangeLog @@ -1,3 +1,9 @@ +2016-04-19 H.J. Lu + + PR libitm/70456 + * util.cc (xmalloc): Use posix_memalign to allocate memory on + on cache line if requested. + 2016-03-03 Dominik Vogt * config/s390/target.h (TARGET_BEGIN_TRANSACTION_ATTRIBUTE): Define diff --git a/libitm/util.cc b/libitm/util.cc index 16e5d034359..f89b2e5cccd 100644 --- a/libitm/util.cc +++ b/libitm/util.cc @@ -61,12 +61,22 @@ GTM_fatal (const char *fmt, ...) void * xmalloc (size_t size, bool separate_cl) { - // TODO Use posix_memalign if separate_cl is true, or some other allocation - // method that will avoid sharing cache lines with data used by other - // threads. - void *r = malloc (size); - if (r == 0) - GTM_fatal ("Out of memory allocating %lu bytes", (unsigned long) size); + void *r; +#ifdef HAVE_POSIX_MEMALIGN + if (separate_cl) + { + if (posix_memalign (&r, HW_CACHELINE_SIZE, size)) + GTM_fatal ("Out of memory allocating %lu bytes aligned on cache line", + (unsigned long) size); + } + else +#endif + { + r = malloc (size); + if (r == 0) + GTM_fatal ("Out of memory allocating %lu bytes", + (unsigned long) size); + } return r; } -- 2.30.2