Blame memkind-1.10.1/autohbw/autohbw.c

Packit Service 7f3b24
// SPDX-License-Identifier: BSD-2-Clause
Packit Service 7f3b24
/* Copyright (C) 2015 - 2020 Intel Corporation. */
Packit Service 7f3b24
Packit Service 7f3b24
///////////////////////////////////////////////////////////////////////////
Packit Service 7f3b24
// File   : autohbw.c
Packit Service 7f3b24
// Purpose: Library to automatically allocate HBW (MCDRAM)
Packit Service 7f3b24
// Author : Ruchira Sasanka (ruchira DOT sasanka AT intel DOT com)
Packit Service 7f3b24
// Date   : Jan 30, 2015
Packit Service 7f3b24
///////////////////////////////////////////////////////////////////////////
Packit Service 7f3b24
Packit Service 7f3b24
#include <memkind.h>
Packit Service 7f3b24
Packit Service 7f3b24
#include <assert.h>
Packit Service 7f3b24
#include <ctype.h>
Packit Service 7f3b24
#include <errno.h>
Packit Service 7f3b24
#include <stdbool.h>
Packit Service 7f3b24
#include <stddef.h>
Packit Service 7f3b24
#include <stdio.h>
Packit Service 7f3b24
#include <stdlib.h>
Packit Service 7f3b24
#include <string.h>
Packit Service 7f3b24
#include <unistd.h>
Packit Service 7f3b24
Packit Service 7f3b24
#define AUTOHBW_EXPORT __attribute__((visibility("default")))
Packit Service 7f3b24
#define AUTOHBW_INIT __attribute__((constructor))
Packit Service 7f3b24
Packit Service 7f3b24
//-2 = nothing is printed
Packit Service 7f3b24
//-1 = critical messages are printed
Packit Service 7f3b24
// 0 = no log messages for allocations are printed but INFO messages are printed
Packit Service 7f3b24
// 1 = a log message is printed for each allocation (Default)
Packit Service 7f3b24
// 2 = a log message is printed for each allocation with a backtrace
Packit Service 7f3b24
enum {
Packit Service 7f3b24
    ALWAYS = -1,
Packit Service 7f3b24
    INFO,
Packit Service 7f3b24
    ALLOC,
Packit Service 7f3b24
    VERBOSE
Packit Service 7f3b24
};
Packit Service 7f3b24
Packit Service 7f3b24
// Default is to print allocations
Packit Service 7f3b24
static int LogLevel = ALLOC;
Packit Service 7f3b24
Packit Service 7f3b24
// Allocations of size greater than low limit promoted to HBW memory.
Packit Service 7f3b24
// If there is a high limit specified, allocations larger than this limit
Packit Service 7f3b24
// will not be allocated in HBW.
Packit Service 7f3b24
static size_t HBWLowLimit = 1 * 1024 * 1024;
Packit Service 7f3b24
static size_t HBWHighLimit = -1ull;
Packit Service 7f3b24
Packit Service 7f3b24
// Whether we have initialized HBW arena of memkind library -- by making
Packit Service 7f3b24
// a dummy call to it. HBW arena (and hence any memkind_* call with kind
Packit Service 7f3b24
// HBW) must NOT be used until this flag is set true.
Packit Service 7f3b24
static bool MemkindInitDone = false;
Packit Service 7f3b24
Packit Service 7f3b24
// Following is the type of HBW memory that is allocated using memkind.
Packit Service 7f3b24
// By changing this type, this library can be used to allocate other
Packit Service 7f3b24
// types of memory types (e.g., MEMKIND_HUGETLB, MEMKIND_GBTLB,
Packit Service 7f3b24
// MEMKIND_HBW_HUGETLB etc.)
Packit Service 7f3b24
static memkind_t hbw_kind;
Packit Service 7f3b24
Packit Service 7f3b24
// API control for HBW allocations.
Packit Service 7f3b24
static bool isAutoHBWEnabled = true;
Packit Service 7f3b24
Packit Service 7f3b24
#define LOG(level, ...)                                                                            \
Packit Service 7f3b24
    do {                                                                                           \
Packit Service 7f3b24
        if (LogLevel >= level) {                                                                   \
Packit Service 7f3b24
            fprintf(stderr, __VA_ARGS__);                                                          \
Packit Service 7f3b24
        }                                                                                          \
Packit Service 7f3b24
    } while (0)
Packit Service 7f3b24
Packit Service 7f3b24
static bool isAllocInHBW(size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    if (!MemkindInitDone)
Packit Service 7f3b24
        return false;
Packit Service 7f3b24
Packit Service 7f3b24
    if (!isAutoHBWEnabled)
Packit Service 7f3b24
        return false;
Packit Service 7f3b24
Packit Service 7f3b24
    if (size < HBWLowLimit)
Packit Service 7f3b24
        return false;
Packit Service 7f3b24
Packit Service 7f3b24
    if (size > HBWHighLimit)
Packit Service 7f3b24
        return false;
Packit Service 7f3b24
Packit Service 7f3b24
    return true;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// Returns the limit in bytes using a limit value and a multiplier
Packit Service 7f3b24
// character like K, M, G
Packit Service 7f3b24
static size_t getLimit(size_t limit, char lchar)
Packit Service 7f3b24
{
Packit Service 7f3b24
    // Now read the trailing character (e.g., K, M, G)
Packit Service 7f3b24
    // Based on the character, determine the multiplier
Packit Service 7f3b24
    if ((limit > 0) && isalpha(lchar)) {
Packit Service 7f3b24
        long mult = 1;
Packit Service 7f3b24
Packit Service 7f3b24
        switch (toupper(lchar)) {
Packit Service 7f3b24
            case 'G':
Packit Service 7f3b24
                mult *= 1024;
Packit Service 7f3b24
            case 'M':
Packit Service 7f3b24
                mult *= 1024;
Packit Service 7f3b24
            case 'K':
Packit Service 7f3b24
                mult *= 1024;
Packit Service 7f3b24
        }
Packit Service 7f3b24
Packit Service 7f3b24
        // check for overflow, saturate at max
Packit Service 7f3b24
        if (limit >= -1ull / mult)
Packit Service 7f3b24
            return -1ull;
Packit Service 7f3b24
Packit Service 7f3b24
        return limit * mult;
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    return limit;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// Once HBWLowLimit (and HBWHighLimit) are set, call this method to
Packit Service 7f3b24
// inform the user about the size range of arrays that will be allocated
Packit Service 7f3b24
// in HBW
Packit Service 7f3b24
static void printLimits()
Packit Service 7f3b24
{
Packit Service 7f3b24
    // Inform according to the limits set
Packit Service 7f3b24
    if ((HBWLowLimit > 0) && (HBWHighLimit < -1ull)) {
Packit Service 7f3b24
        // if both high and low limits are specified, we use a range
Packit Service 7f3b24
        LOG(INFO, "INFO: Allocations between %ldK - %ldK will be allocated in "
Packit Service 7f3b24
            "HBW. Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
Packit Service 7f3b24
            HBWLowLimit / 1024, HBWHighLimit / 1024);
Packit Service 7f3b24
    } else if (HBWLowLimit > 0) {
Packit Service 7f3b24
        // if only a low limit is provided, use that
Packit Service 7f3b24
        LOG(INFO, "INFO: Allocations greater than %ldK will be allocated in HBW."
Packit Service 7f3b24
            " Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
Packit Service 7f3b24
            HBWLowLimit / 1024);
Packit Service 7f3b24
    } else if (HBWHighLimit < -1ull) {
Packit Service 7f3b24
        // if only a high limit is provided, use that
Packit Service 7f3b24
        LOG(INFO, "INFO: Allocations smaller than %ldK will be allocated in HBW. "
Packit Service 7f3b24
            "Set AUTO_HBW_SIZE=X:Y to change this limit.\n",
Packit Service 7f3b24
            HBWHighLimit / 1024);
Packit Service 7f3b24
    } else {
Packit Service 7f3b24
        // none of limits is set to non-edge value, everything goes to HBW
Packit Service 7f3b24
        LOG(INFO, "INFO: All allocation will be done in HBW.");
Packit Service 7f3b24
    }
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
struct kind_name_t {
Packit Service 7f3b24
    memkind_t *kind;
Packit Service 7f3b24
    const char *name;
Packit Service 7f3b24
};
Packit Service 7f3b24
Packit Service 7f3b24
static struct kind_name_t named_kinds[] = {
Packit Service 7f3b24
    { &MEMKIND_DEFAULT, "memkind_default" },
Packit Service 7f3b24
    { &MEMKIND_HUGETLB, "memkind_hugetlb" },
Packit Service 7f3b24
    { &MEMKIND_INTERLEAVE, "memkind_interleave" },
Packit Service 7f3b24
    { &MEMKIND_HBW, "memkind_hbw" },
Packit Service 7f3b24
    { &MEMKIND_HBW_PREFERRED, "memkind_hbw_preferred" },
Packit Service 7f3b24
    { &MEMKIND_HBW_HUGETLB, "memkind_hbw_hugetlb" },
Packit Service 7f3b24
    { &MEMKIND_HBW_PREFERRED_HUGETLB, "memkind_hbw_preferred_hugetlb" },
Packit Service 7f3b24
    { &MEMKIND_HBW_GBTLB, "memkind_hbw_gbtlb" },
Packit Service 7f3b24
    { &MEMKIND_HBW_PREFERRED_GBTLB, "memkind_hbw_preferred_gbtlb" },
Packit Service 7f3b24
    { &MEMKIND_GBTLB, "memkind_gbtlb" },
Packit Service 7f3b24
    { &MEMKIND_HBW_INTERLEAVE, "memkind_hbw_interleave" },
Packit Service 7f3b24
};
Packit Service 7f3b24
Packit Service 7f3b24
static memkind_t get_kind_by_name(const char *name)
Packit Service 7f3b24
{
Packit Service 7f3b24
    int i;
Packit Service 7f3b24
    for (i = 0; i < sizeof(named_kinds) / sizeof(named_kinds[0]); ++i)
Packit Service 7f3b24
        if (strcasecmp(named_kinds[i].name, name) == 0)
Packit Service 7f3b24
            return *named_kinds[i].kind;
Packit Service 7f3b24
Packit Service 7f3b24
    return 0;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// Read from the environment and sets global variables
Packit Service 7f3b24
// Env variables are:
Packit Service 7f3b24
//   AUTO_HBW_SIZE = gives the size for auto HBW allocation
Packit Service 7f3b24
//   AUTO_HBW_LOG = gives logging level
Packit Service 7f3b24
static void setEnvValues()
Packit Service 7f3b24
{
Packit Service 7f3b24
    // STEP: Read the log level from the env variable. Do this early because
Packit Service 7f3b24
    //       printing depends on this
Packit Service 7f3b24
    char *log_str = secure_getenv("AUTO_HBW_LOG");
Packit Service 7f3b24
    if (log_str && strlen(log_str)) {
Packit Service 7f3b24
        int level = atoi(log_str);
Packit Service 7f3b24
        LogLevel = level;
Packit Service 7f3b24
        LOG(ALWAYS, "INFO: Setting log level to %d\n", LogLevel);
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    if (LogLevel == INFO) {
Packit Service 7f3b24
        LOG(INFO, "INFO: HBW allocation stats will not be printed. "
Packit Service 7f3b24
            "Set AUTO_HBW_LOG to enable.\n");
Packit Service 7f3b24
    } else if (LogLevel == ALLOC) {
Packit Service 7f3b24
        LOG(INFO, "INFO: Only HBW allocations will be printed. "
Packit Service 7f3b24
            "Set AUTO_HBW_LOG to disable/enable.\n");
Packit Service 7f3b24
    } else if (LogLevel == VERBOSE) {
Packit Service 7f3b24
        LOG(INFO, "INFO: HBW allocation with backtrace info will be printed. "
Packit Service 7f3b24
            "Set AUTO_HBW_LOG to disable.\n");
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    // Set the memory type allocated by this library. By default, it is
Packit Service 7f3b24
    // MEMKIND_HBW, but we can use this library to allocate other memory
Packit Service 7f3b24
    // types
Packit Service 7f3b24
    const char *memtype_str = secure_getenv("AUTO_HBW_MEM_TYPE");
Packit Service 7f3b24
    if (memtype_str && strlen(memtype_str)) {
Packit Service 7f3b24
        // Find the memkind_t using the name the user has provided in the env variable
Packit Service 7f3b24
        memkind_t mty = get_kind_by_name(memtype_str);
Packit Service 7f3b24
        if (mty != 0) {
Packit Service 7f3b24
            hbw_kind = mty;
Packit Service 7f3b24
            LOG(INFO, "INFO: Setting HBW memory type to %s\n", memtype_str);
Packit Service 7f3b24
        } else {
Packit Service 7f3b24
            LOG(ALWAYS, "WARN: Memory type %s not recognized. Using default type\n",
Packit Service 7f3b24
                memtype_str);
Packit Service 7f3b24
        }
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    // STEP: Set the size limits (thresholds) for HBW allocation
Packit Service 7f3b24
    //
Packit Service 7f3b24
    // Reads the environment variable
Packit Service 7f3b24
    const char *size_str = secure_getenv("AUTO_HBW_SIZE");
Packit Service 7f3b24
    if (size_str) {
Packit Service 7f3b24
        size_t lowlim = HBWLowLimit / 1024;
Packit Service 7f3b24
        size_t highlim = HBWHighLimit / 1024;
Packit Service 7f3b24
        char lowC = 'K', highC = 'K';
Packit Service 7f3b24
Packit Service 7f3b24
        if (size_str) {
Packit Service 7f3b24
            char *ptr = (char *)size_str;
Packit Service 7f3b24
            lowlim = strtoll(ptr, &ptr, 10);
Packit Service 7f3b24
            if (*ptr != 0 && *ptr != ':')
Packit Service 7f3b24
                lowC = *ptr++;
Packit Service 7f3b24
            else
Packit Service 7f3b24
                lowC = ' ';
Packit Service 7f3b24
Packit Service 7f3b24
            if (*ptr++ == ':') {
Packit Service 7f3b24
                highlim = strtoll(ptr, &ptr, 10);
Packit Service 7f3b24
                if (*ptr)
Packit Service 7f3b24
                    highC = *ptr;
Packit Service 7f3b24
                else
Packit Service 7f3b24
                    highC = ' ';
Packit Service 7f3b24
            }
Packit Service 7f3b24
Packit Service 7f3b24
            LOG(INFO, "INFO: lowlim=%zu(%c), highlim=%zu(%c)\n", lowlim, lowC, highlim,
Packit Service 7f3b24
                highC);
Packit Service 7f3b24
        }
Packit Service 7f3b24
Packit Service 7f3b24
        HBWLowLimit = getLimit(lowlim, lowC);
Packit Service 7f3b24
        HBWHighLimit = getLimit(highlim, highC);
Packit Service 7f3b24
Packit Service 7f3b24
        if (HBWLowLimit >= HBWHighLimit) {
Packit Service 7f3b24
            LOG(ALWAYS, "WARN: In AUTO_HBW_SIZE=X:Y, X cannot be greater or equal to Y. "
Packit Service 7f3b24
                "None of allocations will use HBW memory.\n");
Packit Service 7f3b24
        }
Packit Service 7f3b24
    } else {
Packit Service 7f3b24
        // if the user did not specify any limits, inform that we are using
Packit Service 7f3b24
        // default limits
Packit Service 7f3b24
        LOG(INFO, "INFO: Using default values for array size thresholds. "
Packit Service 7f3b24
            "Set AUTO_HBW_SIZE=X:Y to change.\n");
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    // inform the user about limits
Packit Service 7f3b24
    printLimits();
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// This function is executed at library load time.
Packit Service 7f3b24
// Initialize HBW arena by making a dummy allocation/free at library load
Packit Service 7f3b24
// time. Until HBW initialization is complete, we must not call any
Packit Service 7f3b24
// allocation routines with HBW as kind.
Packit Service 7f3b24
static void AUTOHBW_INIT autohbw_load(void)
Packit Service 7f3b24
{
Packit Service 7f3b24
    // First set the default memory type this library allocates. This can
Packit Service 7f3b24
    // be overridden by env variable
Packit Service 7f3b24
    // Note: 'memkind_hbw_preferred' will allow falling back to DDR but
Packit Service 7f3b24
    //       'memkind_hbw will not'
Packit Service 7f3b24
    // Note: If HBM is not installed on a system, memkind_hbw_preferred call
Packit Service 7f3b24
    //       would fail. Therefore, we need to check for availability first.
Packit Service 7f3b24
    if (memkind_check_available(MEMKIND_HBW) != 0) {
Packit Service 7f3b24
        LOG(ALWAYS, "WARN: *** No HBM found in system. Will use default (DDR) "
Packit Service 7f3b24
            "OR user specified type ***\n");
Packit Service 7f3b24
        hbw_kind = MEMKIND_DEFAULT;
Packit Service 7f3b24
    } else {
Packit Service 7f3b24
        hbw_kind = MEMKIND_HBW_PREFERRED;
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    // Read any env variables. This has to be done first because DbgLevel
Packit Service 7f3b24
    // is set using env variables and debug printing is used below
Packit Service 7f3b24
    setEnvValues(); // read any env variables
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(INFO, "INFO: autohbw.so loaded!\n");
Packit Service 7f3b24
Packit Service 7f3b24
    // dummy HBW call to initialize HBW arena
Packit Service 7f3b24
    void *pp = memkind_malloc(hbw_kind, 16);
Packit Service 7f3b24
    if (pp == 0) {
Packit Service 7f3b24
        LOG(ALWAYS, "\t-HBW init call FAILED. "
Packit Service 7f3b24
            "Is required memory type present on your system?\n");
Packit Service 7f3b24
        abort();
Packit Service 7f3b24
    }
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(ALWAYS, "\t-HBW int call succeeded\n");
Packit Service 7f3b24
    memkind_free(hbw_kind, pp);
Packit Service 7f3b24
Packit Service 7f3b24
    MemkindInitDone = true; // enable HBW allocation
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static void *MemkindMalloc(size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(VERBOSE, "In my memkind malloc sz:%ld ... ", size);
Packit Service 7f3b24
Packit Service 7f3b24
    bool useHbw = isAllocInHBW(size);
Packit Service 7f3b24
    memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
Packit Service 7f3b24
Packit Service 7f3b24
    if (useHbw)
Packit Service 7f3b24
        LOG(VERBOSE, "\tHBW");
Packit Service 7f3b24
Packit Service 7f3b24
    void *ptr = memkind_malloc(kind, size);
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(VERBOSE, "\tptr:%p\n", ptr);
Packit Service 7f3b24
    return ptr;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static void *MemkindCalloc(size_t nmemb, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(VERBOSE, "In my memkind calloc sz:%ld ..", size * nmemb);
Packit Service 7f3b24
Packit Service 7f3b24
    bool useHbw = isAllocInHBW(size);
Packit Service 7f3b24
    memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
Packit Service 7f3b24
Packit Service 7f3b24
    if (useHbw)
Packit Service 7f3b24
        LOG(VERBOSE, "\tHBW");
Packit Service 7f3b24
Packit Service 7f3b24
    void *ptr = memkind_calloc(kind, nmemb, size);
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(VERBOSE, "\tptr:%p\n", ptr);
Packit Service 7f3b24
    return ptr;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static void *MemkindRealloc(void *ptr, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(VERBOSE, "In my memkind realloc sz:%ld, p1:%p ..", size, ptr);
Packit Service 7f3b24
Packit Service 7f3b24
    bool useHbw = isAllocInHBW(size);
Packit Service 7f3b24
    memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
Packit Service 7f3b24
Packit Service 7f3b24
    if (useHbw)
Packit Service 7f3b24
        LOG(VERBOSE, "\tHBW");
Packit Service 7f3b24
Packit Service 7f3b24
    void *nptr = memkind_realloc(kind, ptr, size);
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(VERBOSE, "\tptr=%p\n", nptr);
Packit Service 7f3b24
    return nptr;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
static int MemkindAlign(void **memptr, size_t alignment, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(VERBOSE, "In my memkind align sz:%ld .. ", size);
Packit Service 7f3b24
Packit Service 7f3b24
    bool useHbw = isAllocInHBW(size);
Packit Service 7f3b24
    memkind_t kind = useHbw ? hbw_kind : MEMKIND_DEFAULT;
Packit Service 7f3b24
Packit Service 7f3b24
    if (useHbw)
Packit Service 7f3b24
        LOG(VERBOSE, "\tHBW");
Packit Service 7f3b24
Packit Service 7f3b24
    int ret = memkind_posix_memalign(kind, memptr, alignment, size);
Packit Service 7f3b24
Packit Service 7f3b24
    LOG(VERBOSE, "\tptr:%p\n", *memptr);
Packit Service 7f3b24
    return ret;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// memkind_free does not need the exact kind, if kind is 0. Then
Packit Service 7f3b24
// the library can figure out the proper kind itself.
Packit Service 7f3b24
static void MemkindFree(void *ptr)
Packit Service 7f3b24
{
Packit Service 7f3b24
    // avoid to many useless logs
Packit Service 7f3b24
    if (ptr)
Packit Service 7f3b24
        LOG(VERBOSE, "In my memkind free, ptr:%p\n", ptr);
Packit Service 7f3b24
    memkind_free(0, ptr);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
//--------------------------------------------------------------------------
Packit Service 7f3b24
// ------------------ Public API of autohbw           ----------------------
Packit Service 7f3b24
//--------------------------------------------------------------------------
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void enableAutoHBW()
Packit Service 7f3b24
{
Packit Service 7f3b24
    isAutoHBWEnabled = true;
Packit Service 7f3b24
    LOG(INFO, "INFO: HBW allocations enabled by application (for this rank)\n");
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void disableAutoHBW()
Packit Service 7f3b24
{
Packit Service 7f3b24
    isAutoHBWEnabled = false;
Packit Service 7f3b24
    LOG(INFO, "INFO: HBW allocations disabled by application (for this rank)\n");
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void *malloc(size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    return MemkindMalloc(size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void *calloc(size_t nmemb, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    return MemkindCalloc(nmemb, size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void *realloc(void *ptr, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    return MemkindRealloc(ptr, size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT int posix_memalign(void **memptr, size_t alignment, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    return MemkindAlign(memptr, alignment, size);
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// Warn about deprecated function usage.
Packit Service 7f3b24
AUTOHBW_EXPORT void *valloc(size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(ALWAYS, "use of deprecated valloc. Use posix_memalign instead\n");
Packit Service 7f3b24
    void *memptr = 0;
Packit Service 7f3b24
    size_t boundary = sysconf(_SC_PAGESIZE);
Packit Service 7f3b24
    int status = MemkindAlign(&memptr, boundary, size);
Packit Service 7f3b24
    if (status == 0 && memptr != 0)
Packit Service 7f3b24
        return memptr;
Packit Service 7f3b24
Packit Service 7f3b24
    return 0;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
// Warn about deprecated function usage.
Packit Service 7f3b24
AUTOHBW_EXPORT void *memalign(size_t boundary, size_t size)
Packit Service 7f3b24
{
Packit Service 7f3b24
    LOG(ALWAYS, "use of deprecated memalign. Use posix_memalign instead\n");
Packit Service 7f3b24
    void *memptr = 0;
Packit Service 7f3b24
    int status = MemkindAlign(&memptr, boundary, size);
Packit Service 7f3b24
    if (status == 0 && memptr != 0)
Packit Service 7f3b24
        return memptr;
Packit Service 7f3b24
Packit Service 7f3b24
    return 0;
Packit Service 7f3b24
}
Packit Service 7f3b24
Packit Service 7f3b24
AUTOHBW_EXPORT void free(void *ptr)
Packit Service 7f3b24
{
Packit Service 7f3b24
    return MemkindFree(ptr);
Packit Service 7f3b24
}