diff --git a/src/Makefile b/src/Makefile index f60eee6a97c..232a5e6fcb7 100644 --- a/src/Makefile +++ b/src/Makefile @@ -193,7 +193,7 @@ endif ifeq ($(MALLOC),memkind) FINAL_CFLAGS+= -DUSE_MEMKIND - FINAL_LIBS+= -lmemkind -ldaxctl + FINAL_LIBS+= -lmemkind -ldaxctl -lpmem endif REDIS_CC=$(QUIET_CC)$(CC) $(FINAL_CFLAGS) diff --git a/src/sds.c b/src/sds.c index 44b310fa55f..b4967fb8385 100644 --- a/src/sds.c +++ b/src/sds.c @@ -176,7 +176,7 @@ static sds sdsnewlenPM(const void *init, size_t initlen) { if (init==SDS_NOINIT) init = NULL; else if (!init) - memset(sh, 0, hdrlen+initlen+1); + zmemset_pmem(sh, 0, hdrlen+initlen+1); if (sh == NULL) return NULL; s = (char*)sh+hdrlen; fp = ((unsigned char*)s)-1; @@ -215,7 +215,7 @@ static sds sdsnewlenPM(const void *init, size_t initlen) { } } if (initlen && init) - memcpy(s, init, initlen); + zmemcpy_pmem(s, init, initlen); s[initlen] = '\0'; return s; } diff --git a/src/zmalloc.c b/src/zmalloc.c index e0c4b9a2390..fcdd9e65456 100644 --- a/src/zmalloc.c +++ b/src/zmalloc.c @@ -74,6 +74,7 @@ void zlibc_free(void *ptr) { #define dallocx(ptr,flags) je_dallocx(ptr,flags) #elif defined(USE_MEMKIND) #include +#include #define malloc(size) memkind_malloc(MEMKIND_DEFAULT,size) #define calloc(count,size) memkind_calloc(MEMKIND_DEFAULT,count,size) #define realloc(ptr,size) memkind_realloc(NULL,ptr,size) @@ -103,6 +104,20 @@ void *zmalloc_pmem(size_t size) { zmalloc_pmem_not_available(); return NULL; } +void *zmemcpy_pmem(void *dst, const void *src, size_t num) { + (void)(dst); + (void)(src); + (void)(num); + zmalloc_pmem_not_available(); + return NULL; +} +void *zmemset_pmem(void *ptr, int value, size_t num) { + (void)(ptr); + (void)(value); + (void)(num); + zmalloc_pmem_not_available(); + return NULL; +} #endif #define update_zmalloc_stat_alloc(__n) do { \ @@ -176,6 +191,14 @@ void *zmalloc_pmem(size_t size) { return (char*)ptr+PREFIX_SIZE; #endif } + +void *zmemcpy_pmem(void *dst, const void *src, size_t num) { + return pmem_memcpy(dst, src, num, PMEM_F_MEM_NONTEMPORAL|PMEM_F_MEM_NODRAIN); +} + +void *zmemset_pmem(void *ptr, int value, size_t num) { + return pmem_memset(ptr, value, num, PMEM_F_MEM_NONTEMPORAL|PMEM_F_MEM_NODRAIN); +} #endif /* Allocation and free functions that bypass the thread cache diff --git a/src/zmalloc.h b/src/zmalloc.h index 70d32f5607d..d2ea3190fb0 100644 --- a/src/zmalloc.h +++ b/src/zmalloc.h @@ -103,6 +103,8 @@ size_t zmalloc_get_smap_bytes_by_field(char *field, long pid); size_t zmalloc_get_memory_size(void); void zlibc_free(void *ptr); void *zmalloc_pmem(size_t size); +void *zmemcpy_pmem(void *dst, const void *src, size_t num); +void *zmemset_pmem(void *ptr, int value, size_t num); #ifdef HAVE_DEFRAG void zfree_no_tcache(void *ptr);