Blame lib/utils.c

Packit Service 5befb9
/*
Packit Service 5befb9
 * BSD LICENSE
Packit Service 5befb9
 *
Packit Service 8a4b7a
 * Copyright(c) 2014-2020 Intel Corporation. All rights reserved.
Packit Service 5befb9
 * All rights reserved.
Packit Service 5befb9
 *
Packit Service 5befb9
 * Redistribution and use in source and binary forms, with or without
Packit Service 5befb9
 * modification, are permitted provided that the following conditions
Packit Service 5befb9
 * are met:
Packit Service 5befb9
 *
Packit Service 5befb9
 *   * Redistributions of source code must retain the above copyright
Packit Service 5befb9
 *     notice, this list of conditions and the following disclaimer.
Packit Service 5befb9
 *   * Redistributions in binary form must reproduce the above copyright
Packit Service 5befb9
 *     notice, this list of conditions and the following disclaimer in
Packit Service 5befb9
 *     the documentation and/or other materials provided with the
Packit Service 5befb9
 *     distribution.
Packit Service 5befb9
 *   * Neither the name of Intel Corporation nor the names of its
Packit Service 5befb9
 *     contributors may be used to endorse or promote products derived
Packit Service 5befb9
 *     from this software without specific prior written permission.
Packit Service 5befb9
 *
Packit Service 5befb9
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Packit Service 5befb9
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service 5befb9
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service 5befb9
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Packit Service 5befb9
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service 5befb9
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 5befb9
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service 5befb9
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service 5befb9
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service 5befb9
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service 5befb9
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 5befb9
 */
Packit Service 5befb9
Packit Service 5befb9
/**
Packit Service 5befb9
 * @brief Set of utility functions to operate on Platform QoS (pqos) data
Packit Service 5befb9
 *        structures.
Packit Service 5befb9
 *
Packit Service 5befb9
 * These functions need no synchronization mechanisms.
Packit Service 5befb9
 *
Packit Service 5befb9
 */
Packit Service 5befb9
#include <stdlib.h>
Packit Service 5befb9
#include <string.h>
Packit Service 5befb9
Packit Service 5befb9
#include "pqos.h"
Packit Service 5befb9
#include "types.h"
Packit Service 5befb9
#include "utils.h"
Packit Service 8a4b7a
#include "cpuinfo.h"
Packit Service 5befb9
Packit Service 5befb9
#define TOPO_OBJ_SOCKET     0
Packit Service 5befb9
#define TOPO_OBJ_L2_CLUSTER 2
Packit Service 5befb9
#define TOPO_OBJ_L3_CLUSTER 3
Packit Service 5befb9
Packit Service 5befb9
static int m_interface = PQOS_INTER_MSR;
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
_pqos_utils_init(int interface)
Packit Service 5befb9
{
Packit Service 5befb9
        if (interface == PQOS_INTER_OS_RESCTRL_MON)
Packit Service 5befb9
                m_interface = PQOS_INTER_OS;
Packit Service 5befb9
        else
Packit Service 5befb9
                m_interface = interface;
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_OK;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 8a4b7a
unsigned *
Packit Service 8a4b7a
pqos_cpu_get_mba_ids(const struct pqos_cpuinfo *cpu, unsigned *count)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        unsigned mba_id_count = 0, i = 0;
Packit Service 8a4b7a
        unsigned *mba_ids = NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(cpu != NULL);
Packit Service 8a4b7a
        ASSERT(count != NULL);
Packit Service 8a4b7a
        if (cpu == NULL || count == NULL)
Packit Service 8a4b7a
                return NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        mba_ids = (unsigned *)malloc(sizeof(mba_ids[0]) * cpu->num_cores);
Packit Service 8a4b7a
        if (mba_ids == NULL)
Packit Service 8a4b7a
                return NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        for (i = 0; i < cpu->num_cores; i++) {
Packit Service 8a4b7a
                unsigned j = 0;
Packit Service 8a4b7a
Packit Service 8a4b7a
                /**
Packit Service 8a4b7a
                 * Check if this mba id is already on the \a mbas list
Packit Service 8a4b7a
                 */
Packit Service 8a4b7a
                for (j = 0; j < mba_id_count && mba_id_count > 0; j++)
Packit Service 8a4b7a
                        if (cpu->cores[i].mba_id == mba_ids[j])
Packit Service 8a4b7a
                                break;
Packit Service 8a4b7a
Packit Service 8a4b7a
                if (j >= mba_id_count || mba_id_count == 0) {
Packit Service 8a4b7a
                        /**
Packit Service 8a4b7a
                         * This mba_id wasn't reported before
Packit Service 8a4b7a
                         */
Packit Service 8a4b7a
                        mba_ids[mba_id_count++] = cpu->cores[i].mba_id;
Packit Service 8a4b7a
                }
Packit Service 8a4b7a
        }
Packit Service 8a4b7a
Packit Service 8a4b7a
        *count = mba_id_count;
Packit Service 8a4b7a
        return mba_ids;
Packit Service 8a4b7a
}
Packit Service 8a4b7a
Packit Service 8a4b7a
unsigned *
Packit Service 8a4b7a
pqos_cpu_get_l3cat_ids(const struct pqos_cpuinfo *cpu, unsigned *count)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        unsigned l3cat_count = 0, i = 0;
Packit Service 8a4b7a
        unsigned *l3cat_ids = NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(cpu != NULL);
Packit Service 8a4b7a
        ASSERT(count != NULL);
Packit Service 8a4b7a
        if (cpu == NULL || count == NULL)
Packit Service 8a4b7a
                return NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        l3cat_ids = (unsigned *)malloc(sizeof(l3cat_ids[0]) * cpu->num_cores);
Packit Service 8a4b7a
        if (l3cat_ids == NULL)
Packit Service 8a4b7a
                return NULL;
Packit Service 8a4b7a
Packit Service 8a4b7a
        for (i = 0; i < cpu->num_cores; i++) {
Packit Service 8a4b7a
                unsigned j = 0;
Packit Service 8a4b7a
Packit Service 8a4b7a
                /**
Packit Service 8a4b7a
                 * Check if this l3cat id is already on the \a l3cat_ids list
Packit Service 8a4b7a
                 */
Packit Service 8a4b7a
                for (j = 0; j < l3cat_count && l3cat_count > 0; j++)
Packit Service 8a4b7a
                        if (cpu->cores[i].l3cat_id == l3cat_ids[j])
Packit Service 8a4b7a
                                break;
Packit Service 8a4b7a
Packit Service 8a4b7a
                if (j >= l3cat_count || l3cat_count == 0) {
Packit Service 8a4b7a
                        /**
Packit Service 8a4b7a
                         * This l3cat_id wasn't reported before
Packit Service 8a4b7a
                         */
Packit Service 8a4b7a
                        l3cat_ids[l3cat_count++] = cpu->cores[i].l3cat_id;
Packit Service 8a4b7a
                }
Packit Service 8a4b7a
        }
Packit Service 8a4b7a
Packit Service 8a4b7a
        *count = l3cat_count;
Packit Service 8a4b7a
        return l3cat_ids;
Packit Service 8a4b7a
}
Packit Service 5befb9
Packit Service 5befb9
unsigned *
Packit Service 8a4b7a
pqos_cpu_get_sockets(const struct pqos_cpuinfo *cpu, unsigned *count)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned scount = 0, i = 0;
Packit Service 5befb9
        unsigned *sockets = NULL;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(count != NULL);
Packit Service 5befb9
        if (cpu == NULL || count == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 8a4b7a
        sockets = (unsigned *)malloc(sizeof(sockets[0]) * cpu->num_cores);
Packit Service 5befb9
        if (sockets == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++) {
Packit Service 5befb9
                unsigned j = 0;
Packit Service 5befb9
Packit Service 5befb9
                /**
Packit Service 5befb9
                 * Check if this socket id is already on the \a sockets list
Packit Service 5befb9
                 */
Packit Service 5befb9
                for (j = 0; j < scount && scount > 0; j++)
Packit Service 5befb9
                        if (cpu->cores[i].socket == sockets[j])
Packit Service 5befb9
                                break;
Packit Service 5befb9
Packit Service 5befb9
                if (j >= scount || scount == 0) {
Packit Service 5befb9
                        /**
Packit Service 5befb9
                         * This socket wasn't reported before
Packit Service 5befb9
                         */
Packit Service 5befb9
                        sockets[scount++] = cpu->cores[i].socket;
Packit Service 5befb9
                }
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        *count = scount;
Packit Service 5befb9
        return sockets;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
unsigned *
Packit Service 8a4b7a
pqos_cpu_get_l2ids(const struct pqos_cpuinfo *cpu, unsigned *count)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned l2count = 0, i = 0;
Packit Service 5befb9
        unsigned *l2ids = NULL;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(count != NULL);
Packit Service 5befb9
        if (cpu == NULL || count == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 8a4b7a
        l2ids = (unsigned *)malloc(sizeof(l2ids[0]) * cpu->num_cores);
Packit Service 5befb9
        if (l2ids == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++) {
Packit Service 5befb9
                unsigned j = 0;
Packit Service 5befb9
Packit Service 5befb9
                /**
Packit Service 5befb9
                 * Check if this L2 id is already on the list
Packit Service 5befb9
                 */
Packit Service 5befb9
                for (j = 0; j < l2count && l2count > 0; j++)
Packit Service 5befb9
                        if (cpu->cores[i].l2_id == l2ids[j])
Packit Service 5befb9
                                break;
Packit Service 5befb9
Packit Service 5befb9
                if (j >= l2count || l2count == 0) {
Packit Service 5befb9
                        /**
Packit Service 5befb9
                         * This l2id wasn't reported before
Packit Service 5befb9
                         */
Packit Service 5befb9
                        l2ids[l2count++] = cpu->cores[i].l2_id;
Packit Service 5befb9
                }
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        *count = l2count;
Packit Service 5befb9
        return l2ids;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
/**
Packit Service 5befb9
 * @brief Creates list of cores belonging to given topology object
Packit Service 5befb9
 *
Packit Service 5befb9
 * @param [in] cpu CPU topology
Packit Service 5befb9
 * @param [in] type CPU topology object type to search cores for
Packit Service 5befb9
 *             TOPO_OBJ_SOCKET - sockets
Packit Service 5befb9
 *             TOPO_OBJ_L2_CLUSTER - L2 cache clusters
Packit Service 5befb9
 *             TOPO_OBJ_L3_CLUSTER - L3 cache clusters
Packit Service 5befb9
 * @param [in] id CPU topology object ID to search cores for
Packit Service 5befb9
 * @param [out] count place to put number of objects found
Packit Service 5befb9
 *
Packit Service 5befb9
 * @return Pointer to list of cores for given topology object
Packit Service 5befb9
 * @retval NULL on error or if no core found
Packit Service 5befb9
 */
Packit Service 5befb9
static unsigned *
Packit Service 5befb9
__get_cores_per_topology_obj(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                             const int type,
Packit Service 5befb9
                             const unsigned id,
Packit Service 5befb9
                             unsigned *count)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned num = 0, i = 0;
Packit Service 5befb9
        unsigned *core_list = NULL;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(count != NULL);
Packit Service 5befb9
        if (cpu == NULL || count == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 8a4b7a
        core_list = (unsigned *)malloc(cpu->num_cores * sizeof(core_list[0]));
Packit Service 5befb9
        if (core_list == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if ((type == TOPO_OBJ_L3_CLUSTER &&
Packit Service 5befb9
                     id == cpu->cores[i].l3_id) ||
Packit Service 5befb9
                    (type == TOPO_OBJ_L2_CLUSTER &&
Packit Service 5befb9
                     id == cpu->cores[i].l2_id) ||
Packit Service 5befb9
                    (type == TOPO_OBJ_SOCKET && id == cpu->cores[i].socket))
Packit Service 5befb9
                        core_list[num++] = cpu->cores[i].lcore;
Packit Service 5befb9
Packit Service 5befb9
        if (num == 0) {
Packit Service 5befb9
                free(core_list);
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        *count = num;
Packit Service 5befb9
        return core_list;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
unsigned *
Packit Service 8a4b7a
pqos_cpu_get_cores_l3id(const struct pqos_cpuinfo *cpu,
Packit Service 8a4b7a
                        const unsigned l3_id,
Packit Service 5befb9
                        unsigned *count)
Packit Service 5befb9
{
Packit Service 5befb9
        return __get_cores_per_topology_obj(cpu, TOPO_OBJ_L3_CLUSTER, l3_id,
Packit Service 5befb9
                                            count);
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
unsigned *
Packit Service 5befb9
pqos_cpu_get_cores(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                   const unsigned socket,
Packit Service 5befb9
                   unsigned *count)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0, cnt = 0;
Packit Service 5befb9
        unsigned *cores = NULL;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(count != NULL);
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL || count == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 8a4b7a
        cores = (unsigned *)malloc(cpu->num_cores * sizeof(cores[0]));
Packit Service 5befb9
        if (cores == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].socket == socket)
Packit Service 5befb9
                        cores[cnt++] = cpu->cores[i].lcore;
Packit Service 5befb9
Packit Service 5befb9
        if (!cnt) {
Packit Service 5befb9
                free(cores);
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        *count = cnt;
Packit Service 5befb9
        return cores;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
const struct pqos_coreinfo *
Packit Service 5befb9
pqos_cpu_get_core_info(const struct pqos_cpuinfo *cpu, unsigned lcore)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL)
Packit Service 5befb9
                return NULL;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].lcore == lcore)
Packit Service 5befb9
                        return &cpu->cores[i];
Packit Service 5befb9
Packit Service 5befb9
        return NULL;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_cpu_get_one_core(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                      const unsigned socket,
Packit Service 5befb9
                      unsigned *lcore)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(lcore != NULL);
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL || lcore == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].socket == socket) {
Packit Service 5befb9
                        *lcore = cpu->cores[i].lcore;
Packit Service 5befb9
                        return PQOS_RETVAL_OK;
Packit Service 5befb9
                }
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_ERROR;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 8a4b7a
pqos_cpu_get_one_by_l3cat_id(const struct pqos_cpuinfo *cpu,
Packit Service 8a4b7a
                             const unsigned l3cat_id,
Packit Service 8a4b7a
                             unsigned *lcore)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        unsigned i = 0;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(cpu != NULL);
Packit Service 8a4b7a
        ASSERT(lcore != NULL);
Packit Service 8a4b7a
Packit Service 8a4b7a
        if (cpu == NULL || lcore == NULL)
Packit Service 8a4b7a
                return PQOS_RETVAL_PARAM;
Packit Service 8a4b7a
Packit Service 8a4b7a
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 8a4b7a
                if (cpu->cores[i].l3cat_id == l3cat_id) {
Packit Service 8a4b7a
                        *lcore = cpu->cores[i].lcore;
Packit Service 8a4b7a
                        return PQOS_RETVAL_OK;
Packit Service 8a4b7a
                }
Packit Service 8a4b7a
Packit Service 8a4b7a
        return PQOS_RETVAL_ERROR;
Packit Service 8a4b7a
}
Packit Service 8a4b7a
Packit Service 8a4b7a
int
Packit Service 8a4b7a
pqos_cpu_get_one_by_mba_id(const struct pqos_cpuinfo *cpu,
Packit Service 8a4b7a
                           const unsigned mba_id,
Packit Service 8a4b7a
                           unsigned *lcore)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        unsigned i = 0;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(cpu != NULL);
Packit Service 8a4b7a
        ASSERT(lcore != NULL);
Packit Service 8a4b7a
Packit Service 8a4b7a
        if (cpu == NULL || lcore == NULL)
Packit Service 8a4b7a
                return PQOS_RETVAL_PARAM;
Packit Service 8a4b7a
Packit Service 8a4b7a
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 8a4b7a
                if (cpu->cores[i].mba_id == mba_id) {
Packit Service 8a4b7a
                        *lcore = cpu->cores[i].lcore;
Packit Service 8a4b7a
                        return PQOS_RETVAL_OK;
Packit Service 8a4b7a
                }
Packit Service 8a4b7a
Packit Service 8a4b7a
        return PQOS_RETVAL_ERROR;
Packit Service 8a4b7a
}
Packit Service 8a4b7a
Packit Service 8a4b7a
int
Packit Service 5befb9
pqos_cpu_get_one_by_l2id(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                         const unsigned l2id,
Packit Service 5befb9
                         unsigned *lcore)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        ASSERT(lcore != NULL);
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL || lcore == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].l2_id == l2id) {
Packit Service 5befb9
                        *lcore = cpu->cores[i].lcore;
Packit Service 5befb9
                        return PQOS_RETVAL_OK;
Packit Service 5befb9
                }
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_ERROR;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 8a4b7a
pqos_cpu_check_core(const struct pqos_cpuinfo *cpu, const unsigned lcore)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cpu != NULL);
Packit Service 5befb9
        if (cpu == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].lcore == lcore)
Packit Service 5befb9
                        return PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_ERROR;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_cpu_get_socketid(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                      const unsigned lcore,
Packit Service 5befb9
                      unsigned *socket)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0;
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL || socket == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].lcore == lcore) {
Packit Service 5befb9
                        *socket = cpu->cores[i].socket;
Packit Service 5befb9
                        return PQOS_RETVAL_OK;
Packit Service 5befb9
                }
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_ERROR;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_cpu_get_clusterid(const struct pqos_cpuinfo *cpu,
Packit Service 5befb9
                       const unsigned lcore,
Packit Service 5befb9
                       unsigned *cluster)
Packit Service 5befb9
{
Packit Service 5befb9
        unsigned i = 0;
Packit Service 5befb9
Packit Service 5befb9
        if (cpu == NULL || cluster == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cpu->num_cores; i++)
Packit Service 5befb9
                if (cpu->cores[i].lcore == lcore) {
Packit Service 5befb9
                        *cluster = cpu->cores[i].l3_id;
Packit Service 5befb9
                        return PQOS_RETVAL_OK;
Packit Service 5befb9
                }
Packit Service 5befb9
Packit Service 5befb9
        return PQOS_RETVAL_ERROR;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_cap_get_type(const struct pqos_cap *cap,
Packit Service 5befb9
                  const enum pqos_cap_type type,
Packit Service 5befb9
                  const struct pqos_capability **cap_item)
Packit Service 5befb9
{
Packit Service 5befb9
        int ret = PQOS_RETVAL_RESOURCE;
Packit Service 5befb9
        unsigned i;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && cap_item != NULL);
Packit Service 5befb9
        if (cap == NULL || cap_item == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 8a4b7a
        *cap_item = NULL;
Packit Service 8a4b7a
Packit Service 5befb9
        ASSERT(type < PQOS_CAP_TYPE_NUMOF);
Packit Service 5befb9
        if (type >= PQOS_CAP_TYPE_NUMOF)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < cap->num_cap; i++) {
Packit Service 5befb9
                if (cap->capabilities[i].type != type)
Packit Service 5befb9
                        continue;
Packit Service 5befb9
                *cap_item = &cap->capabilities[i];
Packit Service 5befb9
                ret = PQOS_RETVAL_OK;
Packit Service 5befb9
                break;
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_cap_get_event(const struct pqos_cap *cap,
Packit Service 5befb9
                   const enum pqos_mon_event event,
Packit Service 5befb9
                   const struct pqos_monitor **p_mon)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *cap_item = NULL;
Packit Service 5befb9
        const struct pqos_cap_mon *mon = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
        unsigned i;
Packit Service 5befb9
Packit Service 5befb9
        if (cap == NULL || p_mon == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_MON, &cap_item);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 5befb9
                return ret;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap_item != NULL);
Packit Service 5befb9
        mon = cap_item->u.mon;
Packit Service 5befb9
Packit Service 5befb9
        ret = PQOS_RETVAL_ERROR;
Packit Service 5befb9
Packit Service 5befb9
        for (i = 0; i < mon->num_events; i++) {
Packit Service 5befb9
                if (mon->events[i].type != event)
Packit Service 5befb9
                        continue;
Packit Service 5befb9
Packit Service 5befb9
                *p_mon = &mon->events[i];
Packit Service 5befb9
                ret = PQOS_RETVAL_OK;
Packit Service 5befb9
                break;
Packit Service 5befb9
        }
Packit Service 5befb9
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 8a4b7a
pqos_l3ca_get_cos_num(const struct pqos_cap *cap, unsigned *cos_num)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *item = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && cos_num != NULL);
Packit Service 5befb9
        if (cap == NULL || cos_num == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_L3CA, &item);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no L3CA capability */
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(item != NULL);
Packit Service 5befb9
        *cos_num = item->u.l3ca->num_classes;
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 8a4b7a
pqos_l2ca_get_cos_num(const struct pqos_cap *cap, unsigned *cos_num)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *item = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && cos_num != NULL);
Packit Service 5befb9
        if (cap == NULL || cos_num == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_L2CA, &item);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no L2CA capability */
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(item != NULL);
Packit Service 5befb9
        *cos_num = item->u.l2ca->num_classes;
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 8a4b7a
pqos_mba_get_cos_num(const struct pqos_cap *cap, unsigned *cos_num)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *item = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && cos_num != NULL);
Packit Service 5befb9
        if (cap == NULL || cos_num == NULL)
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_MBA, &item);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no MBA capability */
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(item != NULL);
Packit Service 5befb9
        *cos_num = item->u.mba->num_classes;
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_l3ca_cdp_enabled(const struct pqos_cap *cap,
Packit Service 5befb9
                      int *cdp_supported,
Packit Service 5befb9
                      int *cdp_enabled)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *item = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && (cdp_enabled != NULL || cdp_supported != NULL));
Packit Service 5befb9
        if (cap == NULL || (cdp_enabled == NULL && cdp_supported == NULL))
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_L3CA, &item);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no L3CA capability */
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(item != NULL);
Packit Service 8a4b7a
        if (cdp_supported != NULL)
Packit Service 8a4b7a
                *cdp_supported = item->u.l3ca->cdp;
Packit Service 8a4b7a
Packit Service 5befb9
        if (cdp_enabled != NULL)
Packit Service 5befb9
                *cdp_enabled = item->u.l3ca->cdp_on;
Packit Service 5befb9
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 5befb9
Packit Service 5befb9
int
Packit Service 5befb9
pqos_l2ca_cdp_enabled(const struct pqos_cap *cap,
Packit Service 5befb9
                      int *cdp_supported,
Packit Service 5befb9
                      int *cdp_enabled)
Packit Service 5befb9
{
Packit Service 5befb9
        const struct pqos_capability *l2ca = NULL;
Packit Service 5befb9
        int ret = PQOS_RETVAL_OK;
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(cap != NULL && (cdp_enabled != NULL || cdp_supported != NULL));
Packit Service 5befb9
        if (cap == NULL || (cdp_enabled == NULL && cdp_supported == NULL))
Packit Service 5befb9
                return PQOS_RETVAL_PARAM;
Packit Service 5befb9
Packit Service 5befb9
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_L2CA, &l2ca);
Packit Service 5befb9
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no L2CA capability */
Packit Service 5befb9
Packit Service 5befb9
        ASSERT(l2ca != NULL);
Packit Service 8a4b7a
        if (cdp_supported != NULL)
Packit Service 8a4b7a
                *cdp_supported = l2ca->u.l2ca->cdp;
Packit Service 8a4b7a
Packit Service 5befb9
        if (cdp_enabled != NULL)
Packit Service 5befb9
                *cdp_enabled = l2ca->u.l2ca->cdp_on;
Packit Service 5befb9
Packit Service 5befb9
        return ret;
Packit Service 5befb9
}
Packit Service 8a4b7a
Packit Service 8a4b7a
int
Packit Service 8a4b7a
pqos_mba_ctrl_enabled(const struct pqos_cap *cap,
Packit Service 8a4b7a
                      int *ctrl_supported,
Packit Service 8a4b7a
                      int *ctrl_enabled)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        const struct pqos_capability *mba_cap = NULL;
Packit Service 8a4b7a
        int ret = PQOS_RETVAL_OK;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(cap != NULL && (ctrl_supported != NULL || ctrl_enabled != NULL));
Packit Service 8a4b7a
        if (cap == NULL || (ctrl_supported == NULL && ctrl_enabled == NULL))
Packit Service 8a4b7a
                return PQOS_RETVAL_PARAM;
Packit Service 8a4b7a
Packit Service 8a4b7a
        ret = pqos_cap_get_type(cap, PQOS_CAP_TYPE_MBA, &mba_cap);
Packit Service 8a4b7a
        if (ret != PQOS_RETVAL_OK)
Packit Service 8a4b7a
                return ret; /**< no MBA capability */
Packit Service 8a4b7a
Packit Service 8a4b7a
        ASSERT(mba_cap != NULL);
Packit Service 8a4b7a
        if (ctrl_supported != NULL)
Packit Service 8a4b7a
                *ctrl_supported = mba_cap->u.mba->ctrl;
Packit Service 8a4b7a
Packit Service 8a4b7a
        if (ctrl_enabled != NULL)
Packit Service 8a4b7a
                *ctrl_enabled = mba_cap->u.mba->ctrl_on;
Packit Service 8a4b7a
Packit Service 8a4b7a
        return PQOS_RETVAL_OK;
Packit Service 8a4b7a
}
Packit Service 8a4b7a
Packit Service 8a4b7a
enum pqos_vendor
Packit Service 8a4b7a
pqos_get_vendor(const struct pqos_cpuinfo *m_cpu)
Packit Service 8a4b7a
{
Packit Service 8a4b7a
        return m_cpu->vendor;
Packit Service 8a4b7a
}