This patch skips execution of memtransfer/memset if there actually isn't anything to do. Calls to memcpy/memmove/memset with size==0 should be rare I'd suppose but prior code would still treat this no-op like some store (ml_wt was particularly bad: it would to acquire _all_ locks in such a case due to calculating a correct exclusive upper bound anymore).
OK for trunk? 4.7 too?
commit e0cd0b0a1cac087020d63e63e2d8ff67eab915d1 Author: Torvald Riegel <trie...@redhat.com> Date: Mon Mar 5 14:27:01 2012 +0100 libitm: Don't execute memtransfer/memset if size isn't larger than zero. libitm/ * dispatch.h (CREATE_DISPATCH_METHODS_MEM): Don't execute memtransfer/memset if size isn't larger than zero. diff --git a/libitm/dispatch.h b/libitm/dispatch.h index d059c49..6a9e62e 100644 --- a/libitm/dispatch.h +++ b/libitm/dispatch.h @@ -102,11 +102,13 @@ virtual void memtransfer(void *dst, const void* src, size_t size, \ bool may_overlap, ls_modifier dst_mod, ls_modifier src_mod) \ { \ - memtransfer_static(dst, src, size, may_overlap, dst_mod, src_mod); \ + if (size > 0) \ + memtransfer_static(dst, src, size, may_overlap, dst_mod, src_mod); \ } \ virtual void memset(void *dst, int c, size_t size, ls_modifier mod) \ { \ - memset_static(dst, c, size, mod); \ + if (size > 0) \ + memset_static(dst, c, size, mod); \ } #define CREATE_DISPATCH_METHODS_MEM_PV() \